Точность в списке knn l oop отличается от фактической точности knn - PullRequest
0 голосов
/ 27 февраля 2020

Я использую модель 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, но я не уверен, что ...

...