2013-10-16 10 views
9

W poniższym kodzie próbuję użyć K najbliższych sąsiadów z jednym predyktorem. Zgodnie z moim zrozumieniem, liczba przykładów w train.X nie jest potrzebna, aby dopasować liczbę przykładów w test.X, ale wydaje się, że R nie przetwarza poprawnie moich danych wejściowych.Jak mogę rozwiązać następujące niedopasowanie wymiaru z najbliższymi sąsiadami R K?

library(ISLR) 
library(class) 

train=(Weekly$Year<2009) 
train.X = Weekly$Lag2[train] 
test.X = Weekly$Lag2[!train] 
train.Direction = Weekly$Direction[train] 
knn.pred = knn(train.X, test.X, train.Direction, k=1) 

Kiedy powyższy kod jest uruchamiany, robi błąd

Error in knn(train.X, test.X, train.Direction, k = 1) : 
     dims of 'test' and 'train' differ      

Jak mogę naprawić train.X i test.X tak że R analizuje je poprawnie?

Odpowiedz

13

Funkcja knn przyjmuje macierze lub ramki danych jako argumenty dla pociągu i zestawu testów. Mijasz wektor, który interpretuje się jako matrycę, ale nie w taki sposób, w jaki chcesz. W szczególności dane, które przekazujesz, interpretowane są jako pojedynczy punkt danych z różnymi wartościami oznaczającymi funkcje. Oznacza to, że liczba funkcji dla pociągu i testu jest inna, jak sugeruje komunikat o błędzie.

Aby naprawić, po prostu przekonwertuj jawnie, np.

knn.pred = knn(data.frame(train.X), data.frame(test.X), train.Direction, k=1) 
+0

To rozwiązanie działa, ale czy to jedyny sposób na zmusić R do interpretacji wektora w taki sposób, w jaki chcę? W szczególności próbowałem transponować wektory, ale tylko powoduje komunikat o błędzie niezgodności długości. – merlin2011

+0

Można również przekonwertować go jawnie na macierz o odpowiednich wymiarach. –

+0

Jaka jest to składnia? – merlin2011

3

Dzieje się tak dlatego, że R automatycznie próbuje zmusić do najmniejszej liczby wymiarów przy podziale matrycy, macierzy lub ramki danych. Aby zapobiec pomijaniu wymiaru ramki danych, możesz użyć funkcji podzestawu, która domyślnie przyjmuje wartość drop=FALSE.

train.X <- subset(Weekly[train],select="Lag2") 

Można również użyć wyrażenia logicznego jako parametru do wskazania wierszy lub elementy do utrzymania:

train.X <- subset(Weekly,Year<2009,select="Lag2") 

funkcja podzbiór utrzymuje również nazwy kolumn nienaruszone pozwalając użyć train.X$Lag2 jako ważnego kolumnie. Użycie data.frame lub as.data.frame, jak zasugerowano w innej odpowiedzi, spowoduje brak oryginalnych informacji o nazwie.

Powiązane problemy