2016-08-14 2 views
-1

(в продолжение к этому post)Q: КНН в 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, для Top K (= 5).

+1

Возможный дубликат [Q: KNN in 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 нет никакой переменной sums, вы можете просто использовать простой заказ, который заказывает в порядке возрастания по умолчанию.
  • Заказ должен быть , увеличивая на расстоянии, так как вы ищете ближайших соседей, посмотрите на самое маленькое расстояние.
  • с использованием set.seed, прежде чем код, который не имеет ничего стохастического (случайного), влияет на оценку.

Так что это в основном то же самое, что я пытался объяснить в previous post.

+0

Thanks Jan. Действительно, произошла ошибка с 'test_', 'b' и сортировкой. Я исправил исходное сообщение соответственно. Что касается первого семени, необходимо установить произвольное создание данных. Говоря об этом, я изменил его (в исходном сообщении) на -634500985. Посмотрите, что случилось. Это снова проблема [C function 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

Смежные вопросы