2016-08-13 8 views
1

以下のKNN Rコードが異なる種子について異なる予測を与える理由を知っている人はいますか?これはK < -5のように奇妙であり、したがって、大多数が明確に定義されています。さらに、浮動小数点数は大きいので、データの問題の精度は(postのように)発生しません。Q:R - 異常行動のKNN

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 

手動チェック:

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 

トップKと、予測1を与える(= 5)RSSE:

RSSE    labels 
28479706980  1 
28472893026  0 
28063242772  1 
27966740954  1 
27927401005  1 

ので、大部分が明確に定義された+問題なしRSSEの小さなフロートの違いの

+0

非常に興味深い:いくつかのアイデアを試してみよう - データは拡大縮小されずに中央に配置されません。もしあなたがそれらを前処理すればそれは持続するのですか? 「キャレット」パッケージからkNNを試してみてください。それが続くなら...私が家に帰るとテストします –

+0

'knn()'のRコードには何も確率的なものはありませんので、違いはclass.cの 'VR_knn()' Cルーチンになければなりません。それはそれによって呼び出される。 –

答えて

0

データをスケールして中央に配置するとき - テストセットを含む!は、その後、私は予言0

私の前処理の両方を取得:

sc<-function(x){(x-mean(x))/sd(x)} 
train<-apply(train,1,sc) 
train<-t(train) 
test<-apply(test,1,sc) 
test<-t(test) 

と取得:私はこのフォーム

a <- data.frame(result, trainLabels) 
names(a) = c("RSSE", "labels") 
b <- a[with(a, order(a$RSSE)), ] 
headK <- head(b, K) 
message("Manual predicted K: ", paste(K," class:", names(which.max(table(headK[,2]))))) 
Manual predicted K: 5 class: 0 

と結果に編集した

> seed <- 544336746 
> pred_1 <- knn(train=train, test=test, cl = trainLabels, k=K) 
> message("predicted: ", pred_1, ", seed: ", seed) 
predicted: 0, seed: 544336746 

> seed <- 621513172 
> pred_2 <- knn(train=train, test=test, cl = trainLabels, k=K) 
> message("predicted: ", pred_2, ", seed: ", seed) 
predicted: 0, seed: 621513172 

手動チェック:

 RSSE labels 
3 43.48199  0 
17 43.61283  1 
7 43.63948  1 
8 43.69730  0 
19 43.78931  0  
6 43.88009  0 
+0

ありがとうございます。 (1)あなたが作成したスケーリングされた中心のデータに対して「手動チェック」コードを実行したとき、私は予測される「クラス:1」を得ました。 (2)KNNを使用する前に、縮尺を変更して中央に配置する必要がありますか? – erans

+0

私はあなたがする必要があると思う:訓練<-apply(train、** 2 **、sc)、削除:train <-t(train)。次に、手動チェックと同じ予測クラス1を取得します。 – erans

+0

スケーリングでは、彼らが[ここ](http://stats.stackexchange.com/questions/121886/when-should-i-apply-feature-scaling-for-my-data)について話すとき、あいまいです。しかし、例えば、私の教師の教授Gorban教授は、 'set.seed'がテストデータの2回目のランダム描画には適用されないので、データが異なる可能性もあると言っています。私は 'runif'からテストを描画する前に種を5に設定し、再びクラス0を取得しました...私はあなたが主にkNNの一貫性の後であると思っていました... –

関連する問題