代码之家  ›  专栏  ›  技术社区  ›  Chris T.

提取矩阵中每一行的最大值并输出它们的列名

  •  0
  • Chris T.  · 技术社区  · 7 年前

    我在试验 SVM 功能开启 iris 数据。目的是从输出矩阵中提取(1)每行(2)的最高预测概率“类” attr(pred_prob, "probabilities") 是的。

    data(iris)
    attach(iris)
    x <- subset(iris, select = -Species) 
    y <- Species
    model <- svm(x, y, probability = TRUE)
    pred_prob <- predict(model, x, decision.values = TRUE, probability = TRUE)
    attr(pred_prob, "probabilities")

    (原始代码来自于之前的 thread (第三章)
    最后一行代码将提供以下格式的输出:

           setosa  versicolor   virginica
    1 0.979989881 0.011347796 0.008662323
    2 0.972567961 0.018145783 0.009286256
    3 0.978668604 0.011973933 0.009357463

    为了便于将这些预测概率与它们的真实类“标签”(即setosa、versicolor、virginica)进行比较,我计划从上述输出矩阵中提取每行的最高预测概率类。例如,第一次观测的最高概率等级是 setosa 预测概率为0.9799,返回自

    which(attr(pred_prob, "probabilities")[1,] == max(attr(pred_prob, "probabilities")[1,]), arr.ind = TRUE)
    

    我现在正致力于将上述代码扩展到一个循环中,以便输出一个数据列,其中包含数据中每个观察的预测类标签。下面是我到目前为止所拥有的,但是我很难

    predicted_class <- attr(pred_prob, "probabilities")
    for(row in 1:nrow(predicted_class)) {
    output <- print(which(predicted_class[row,] == max(predicted_class[row,]), arr.ind = TRUE))
    output
    }

    但这并没有告诉我我想要的是什么,它似乎只是从一个随机行返回预测类(而我想为所有观察结果返回一列预测类)。 有人能告诉我这件事吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   markus    7 年前

    使用 max.col

    colnames(pred_prob)[max.col(pred_prob)]
    #[1] "setosa" "setosa" "setosa"
    

    或者使用循环

    output <- vector("double", nrow(pred_prob))
    
    for(row in 1:nrow(pred_prob)) {
      output[row] <- which.max(pred_prob[row,])
    }
    
    output
    #[1] 1 1 1
    

    或者 apply

    apply(pred_prob, MARGIN = 1, FUN = which.max)
    #1 2 3 
    #1 1 1 
    

    数据

    pred_prob <- structure(c(0.979989881, 0.972567961, 0.978668604, 0.011347796, 
    0.018145783, 0.011973933, 0.008662323, 0.009286256, 0.009357463
    ), .Dim = c(3L, 3L), .Dimnames = list(c("1", "2", "3"), c("setosa", 
    "versicolor", "virginica")))