2016-08-14 40 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