2016-08-14 53 views
-1

(在延续这个post问:KNN中的R - 奇怪的行为

有谁知道为什么下面的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) 

将使预测0,对于前k个(= 5)。

+1

可能重复的[问:KNN在R-奇怪的行为](http://stackoverflow.com/questions/38932289/q-knn-in-r-strange-behavior) – nrussell

+0

这不是一个重复的,因为这个问题是做缩放和居中(虽然[这一个](http://stackoverflow.com/questions/38932289/q-knn-in-r-strange-behavior)不是) – erans

+0

顺便说一句,对于一个可重复的例子,你应该不要使用随机本身的种子......也就是说,在应用knn时存在一些随机性,这是处理关系所需要的。所以,使用不同的种子你会得到不同的结果。 – DatamineR

回答

1

有以下几种错误:

  • 您在使用错误的测试在KNN设置一个错误 - 使用TEST_为中心,缩放变量。
  • 创建b没有变量总和,您可以使用简单的顺序,默认情况下增加顺序。
  • 该命令必须是增加在距离,因为你正在寻找最近的邻居,看最小的距离。
  • 使用set.seed在没有任何随机(随机)的代码对评估生效之前。

所以它基本上和我在previous post中解释的一样。

+0

感谢Jan. 确实存在'test_','b'和排序错误。我已经修改了相应的原文。 对于第一个种子,需要设置随机数据创建。 说起来,我已经把它改成了(在原文中)为-634500985。 看看发生了什么事。它又是[C函数fuzz](http://stackoverflow.com/questions/38900958/q-knn-in-r-strange-behavior/)问题吗? (虽然EPS是[定义(第23行)](https://github.com/cran/VR/blob/bee1fa0b41389c582b07bb2de194238fe5e85783/class/src/class.c)为1e-4) – erans