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

时间:2018-06-27 06:05:06

标签: r loops matrix max

我正在对SVM数据使用iris函数。目的是从输出矩阵attr(pred_prob, "probabilities")中提取(1)每行(2)的最高预测概率的“类别”。

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,杂色,弗吉尼亚州)进行比较,我计划从上述输出矩阵中为每一行提取具有最高预测概率的类别。例如,第一次观察的最高概率类别为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 个答案:

答案 0 :(得分:2)

使用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")))