问:R中的KNN - 奇怪的行为

时间:2016-08-14 11:29:46

标签: r knn

(继续此post

有谁知道为什么以下KNN R代码对不同种子给出不同的预测?这是奇怪的,因为K <-5,因此大部分是明确定义的。此外,浮点数很大 - 因此不会出现数据精度问题+数据被缩放和居中。

library(class)

from = -(2^30)
to = -(from)

seed <- -229881389  
set.seed(seed)

K <- 5
m = as.integer(runif(1, K, 20))   
n = as.integer(runif(1, 5, 1000)) 
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)

sc<-function(x){(x-mean(x))/sd(x)}
train<-apply(train,2,sc)

test<-t(apply(test,1,sc))

seed <-  as.integer(runif(1, from, to))
set.seed(seed)
pred_1 <- knn(train=train, test=test, cl = trainLabels, k=K)
message("predicted: ", pred_1, ", seed: ", seed)

seed <- as.integer(runif(1, from, to))
set.seed(seed)
pred_2 <- knn(train=train, test=test, cl = trainLabels, k=K)
message("predicted: ", pred_2, ", seed: ", seed)

手动检查:

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(result, decreasing =T)), ]
headK <- head(b, K)
message("Manual predicted K: ", paste(K," class:", names(which.max(table(headK[,2])))))
print(b)
对于Top K(= 5),

将给出预测0。

1 个答案:

答案 0 :(得分:1)

有几个错误:

  • 在knn中使用错误的测试集时出错,使用test_作为居中的缩放变量。
  • 在创建 b 时没有变量 sums ,您可以使用默认顺序递增的简单订单。
  • 订单必须增加的距离,因为您正在寻找最近的邻居,请查看最小的距离。
  • 在没有任何随机(随机)的代码之前使用 set.seed 会对评估产生影响。

所以它与我在previous post中尝试解释的基本相同。