2016-08-13 2 views
1

Кто-нибудь знает, почему приведенный ниже код KNN R дает разные прогнозы для разных семян? Это странно, как K < -5, и поэтому большинство четко определено. Кроме того, плавающие числа являются большими - поэтому не возникает проблема с проблемой данных (например, в этом post).Q: KNN in R - странное поведение

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 

даст предсказание 1, с Top K (= 5) RSSE:

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

так, большинство корректно определено + нет проблем от небольшой поплавковой разницы в RSSE.

+0

Весьма интересно: собирается проверить несколько идей - данные не масштабируются и не центрируются. он сохраняется, если вы их предварительно обрабатываете? Попробуйте kNN из пакета «caret». если он сохранится ... Я проверю его, когда вернусь домой. –

+0

В коде R для 'knn()' ничего не стохастически, поэтому разница должна быть в подпрограмме C 'VR_knn()' в 'class.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) 

и получим:

> 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 

ручная проверка, что я редактировал в этой форме

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 

и результаты :

 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» - пока вы получили «класс 0» - странный; (2) Вы уверены, что перед использованием KNN необходимо масштабировать и центрировать? – erans

+0

Я думаю, вам нужно: train <-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). Но, например, мой учитель профессор Горбан сказал, что он всегда масштабируется ... также ваши данные могут быть разными, потому что 'set.seed' не будет применяться ко второй случайной ничьей для тестовых данных, поэтому мы имеем разные тестовые данные. Я установил семя на 5 перед тем, как нарисовать тест из 'runif', после чего снова получаю класс 0 ... Я думал, что вы в основном после согласованности kNN ... –

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