Я использую модель knn в R и пытаюсь найти оптимальное k. Чтобы добиться этого, я построил следующий код.
suppressMessages(library(class))
set.seed(1)
Lag1 = rnorm(30)
Direction = c(0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1)
X_train <- data.frame(Lag1[1:20])
X_test <- data.frame(Lag1[21:30])
Y_train <- data.frame(Direction[1:20])
Y_test <- data.frame(Direction[21:30])
knn_res <- rep(1,10)
for (i in 1:10) {
predk <- knn(X_train, X_test, Y_train[,1], k=i)
cm <- as.matrix(table(predk, Y_test[,1]))
knn_res[i] <- sum(diag(cm))/length(predk)
}
# which is most optimal
which.max(knn_res)
# looks like K = 1 is the most optimal
predk <- knn(X_train, X_test, Y_train[,1], k=1)
cm <- as.matrix(table(predk1, Y_test[,1]))
sum(diag(cm))/length(predk)
Согласно which.max(knn_res)
мой оптимальный k должен быть, но когда я запускаю точный код из l oop, чтобы напечатать мою матрицу замешательства, возвращаемая точность не совпадает с точностью в мой knn_res
список. knn_res[1]
возвращает 0.5
, а sum(diag(cm))/length(predk)
возвращает 0.3
.
Куда я попал? Я чувствую, что это что-то вроде того, что я добавляю в свой список knn_res
, но я не уверен, что ...