Weiß jemand, warum der unten KNN R Code verschiedene Vorhersagen für verschiedene Samen gibt? Dies ist seltsam wie K < -5, und somit ist die Mehrheit gut definiert. Außerdem sind die Floating-Zahlen groß - so entsteht keine Genauigkeit des Datenproblems (wie in dieser post).Q: KNN in R - seltsames Verhalten
library(class)
set.seed(642002713)
m = 20
n = 1000
from = -(2^30)
to = -(from)
train = matrix(runif(m*n, from, to), nrow=m, ncol=n)
trainLabels = sample.int(2, size = m, replace=T)-1
test = matrix(runif(n, from, to), nrow=1)
K <- 5
seed <- 544336746
set.seed(seed)
pred_1 <- knn(train=train, test=test, cl = trainLabels, k=K)
message("predicted: ", pred_1, ", seed: ", seed)
#predicted: 0, seed: 544336746
seed <- 621513172
set.seed(seed)
pred_2 <- knn(train=train, test=test, cl = trainLabels, k=K)
message("predicted: ", pred_2, ", seed: ", seed)
#predicted: 1, seed: 621513172
Eine manuelle Überprüfung:
euc.dist <- function(x1, x2) sqrt(sum((x1 - x2)^2))
result = vector(mode="numeric", length=nrow(train))
for(i in 1:nrow(train)) {
result[i] <- euc.dist(train[i,], test)
}
a <- data.frame(result, trainLabels)
names(a) = c("RSSE", "labels")
b <- a[with(a, order(sums, decreasing =T)), ]
headK <- head(b, K)
message("Manual predicted K: ", paste(K," class:", names(which.max(table(headK[,2])))))
#Manual predicted K: 5 class: 1
würde die Vorhersage 1, mit dem Top K (= 5) RSSE:
RSSE labels
28479706980 1
28472893026 0
28063242772 1
27966740954 1
27927401005 1
so wird mehrheitlich gut definiert + kein Problem kleiner Float-Unterschied in RSSE.
Ziemlich interessant: Gehen Sie, um einige Ideen zu testen - Daten sind nicht skaliert und zentriert. Bleibt es bestehen, wenn Sie sie vorverarbeiten? Versuchen Sie kNN aus 'Caret' Paket. wenn es weitergeht ... Ich werde es testen, wenn ich nach Hause komme –
Es gibt nichts stochastischen im R-Code für 'knn()', so dass der Unterschied in der C-Routine 'VR_knn()' in 'class.c sein muss 'das wird dadurch aufgerufen. –