2017-10-30 8 views
0

Ich möchte knnow im Paket dprep verwenden. Und zusätzlich zum Zurückgeben der geeigneten Beschriftung für die Testdaten möchte ich auch den Zeilenindex an den nächsten Nachbarn (in Zugdaten) zurückgeben. Gibt es eine Funktion in diesem Paket für diesen Job? Meine Daten sind wie folgt.Wie man den Index des nächsten Nachbarn in der Zukunft zurückgibt

df1<-data.frame(c("a","b","c"),c(1,2,3),c("T","F","T")) 
df2<-data.frame(c("a","d","f"),c(4,1,3),c("F","F","T")) 
mylist1<-list() 
mylist1[[1]]<-df1 
mylist1[[2]]<-df2 
tst1<-data.frame(c("f"),c(2)) 
library(dprep) 
for(i in 1:length(mylist1)){ 
    knn_model<-knngow(mylist1[[i]],tst1,1)} 

Ich möchte, zusätzlich zu dem Etikett Rückkehr Zum Beispiel zeigen, dass der nächste Nachbar in Zeile 3 in mylist [[2]]

+0

Bitte helfen Sie mir. Ich brauche die Antwort auf diese Frage – maria

Antwort

0

basierend auf Ihre Kommentare aktualisiert

Ich sehe keine Funktion, die die Indizes der nächsten Nachbarn in den Zugdaten bezüglich des DPREP-Pakets zurückgibt (hoffentlich verpasse ich nichts). Sie können jedoch zuerst eine Entfernungsmatrix mit der Entfernungsmatrix berechnen (FD Paket) und diese Matrix dann an eine k-nächste-Nachbarn-Funktion übergeben (das KernelKnn Paket akzeptiert eine Abstandsmatrix als Eingabe). Wenn Sie sich für die Verwendung des KernelKnn-Pakets entscheiden, installieren Sie zuerst die neueste Version mit devtools :: install_github ('mlampros/KernelKnn').

# train-data [ "col3" is the response variable, 'stringsAsFactors' by default ] 
df1 <- data.frame(col1 = c("a","d","f"), col2 = c(1,3,2), col3 = c("T","F","T"), stringsAsFactors = T)       

# test-data 
tst1 <- data.frame(col1 = c("f"), col2 = c(2), stringsAsFactors = T)          

# rbind train and test data (remove the response variable from df1) 
df_all = rbind(df1[, -3], tst1)               

# calculate distance matrix 
dist_gower = as.matrix(FD::gowdis(df_all)) 

# use the dist_gower distance matrix as input to the 'distMat.knn.index.dist' function 
# additionaly specify which row-index is the test-data observation from the previously 'df_all' data.frame using the 'TEST_indices' parameter 
idxs = KernelKnn::distMat.knn.index.dist(dist_gower, TEST_indices = c(4), k = 2, threads = 1, minimize = T) 

idxs $ test_knn_idx gibt die k-nearest-Nachbarn der Testdaten Beobachtung in den Zugdaten

print(idxs) 

$test_knn_idx 
    [,1] [,2] 
[1,] 3 1 

$test_knn_dist 
    [,1] [,2] 
[1,] 0 0.75 

, wenn Sie auch die Wahrscheinlichkeit für die Klasse Etiketten wollen, dann konvertieren zuerst Zahlen- und dann verwenden, um die distMat.KernelKnn Funktion

y_numeric = as.numeric(df1$col3) 

labels = KernelKnn::distMat.KernelKnn(dist_gower, TEST_indices = c(4), y = y_numeric, k = 2, regression = F, threads = 1, Levels = sort(unique(y_numeric)), minimize = T) 

print(labels) 

    class_1 class_2 
[1,]  0  1 

# class_2 corresponds to "T" from col3 (df1 data.frame) 

Sie Alternativ einen Blick auf die dprep nehmen könnte :: knngow und vor allem den zweiten Teil der Funktion, die tatsächlich ist das, was Sie interessiert sind,

> print(dprep::knngow) 

.... 
    else { 
     for (i in 1:ntest) { 

      tempo = order(StatMatch::gower.dist(test[i, -p], train[, -p]))[1:k] 

      classes[i] = moda(train[tempo, p])[1] 
     } 
    } 
..... 
+0

Vielen Dank für Ihren Rat. Aber in der Gowdis-Funktion berechnet es den Abstand zwischen den Samples innerhalb eines Datenrahmens. Wenn wir die Matrix dieser Funktion an distMat.knn.index.dist übergeben, gibt der Index für jede Instanz den nächsten Nachbarn innerhalb desselben Datenrahmens an. Aber meine Testproben sind in einem separaten Datenrahmen und die Zugdaten sind in einem anderen Datenrahmen. Ich will also den Index des nächsten Nachbarn für eine Testinstanz in den Zugdaten. Haben Sie Vorschläge dazu? Vielen Dank für Ihre Hilfe – maria

+0

@maria, ich habe die Antwort aktualisiert. – lampros

Verwandte Themen