2012-08-28 9 views
14

Lassen Sie mich zunächst sagen, ich habe keine Erfahrung mit R, KNN oder Datenwissenschaft im Allgemeinen. Ich habe vor kurzem Kaggle gefunden und habe mit dem Digit Recognition Wettbewerb/Tutorial herum gespielt.Wie sieht man die nächsten Nachbarn in R?

In diesem Tutorial sie einige Beispiel-Code bieten Ihnen eine grundlegende Vorlage zu erhalten begonnen:

# makes the KNN submission 

library(FNN) 

train <- read.csv("c:/Development/data/digits/train.csv", header=TRUE) 
test <- read.csv("c:/Development/data/digits/test.csv", header=TRUE) 

labels <- train[,1] 
train <- train[,-1] 

results <- (0:9)[knn(train, test, labels, k = 10, algorithm="cover_tree")] 

write(results, file="knn_benchmark.csv", ncolumns=1) 

Meine Fragen sind:

  1. Wie kann ich die nächsten Nachbarn anzeigen, die für die ausgewählt wurden, a bestimmte Testzeile?
  2. Wie kann ich ändern, welche dieser zehn ausgewählt ist für meine results?

Diese Fragen können zu weit gefasst sein. Wenn ja, würde ich alle Links begrüßen, die mich auf den richtigen Weg bringen könnten.

Es ist sehr möglich, dass ich etwas gesagt habe, das hier keinen Sinn ergibt. Wenn dies der Fall ist, korrigiere mich bitte.

Antwort

23

1) Sie können die nächsten Nachbarn von einer bestimmten Reihe zu bekommen, wie so:

k <- knn(train, test, labels, k = 10, algorithm="cover_tree") 
indices <- attr(k, "nn.index") 

Dann, wenn Sie die Indizes der 10 nächsten Nachbarn wollen 20 im Trainingssatz rudern:

print(indices[20, ]) 

(Sie erhalten die 10 nächsten Nachbarn, weil Sie k=10 ausgewählt haben). Zum Beispiel, wenn Sie nur mit den ersten 1000 Zeilen des Trainings- und Testsatzes ausführen (um es rechnerisch einfacher):

train <- read.csv("train.csv", header=TRUE)[1:1000, ] 
test <- read.csv("test.csv", header=TRUE)[1:1000, ] 

labels <- train[,1] 
train <- train[,-1] 

k <- knn(train, test, labels, k = 10, algorithm="cover_tree") 
indices = attr(k, "nn.index") 

print(indices[20, ]) 
# output: 
# [1] 829 539 784 487 293 882 367 268 201 277 

Das sind die Indizes in dem Trainingssatz von 1000, der am nächsten an die 20.en Reihe sind des Testsets.

2) Es hängt davon ab, was Sie mit "ändern" meinen. Für den Anfang können Sie die Indizes von jedem der 10 am nächsten Etikett auf jede Zeile wie diese:

closest.labels = apply(indices, 2, function(col) labels[col]) 

Sie können dann die Etiketten der 10 am nächsten Punkten zum 20. Training Punkt wie diese:

closest.labels[20, ] 
# [1] 0 0 0 0 0 0 0 0 0 0 

Dies zeigt an, dass alle 10 der engstenen Punkte alle in der Gruppe Zeile 20 markiert sind 0. knn einfach das Etikett mit der Mehrheit wählt (mit Verbindungen zufällig gebrochen), aber man könnte eine Art von Gewichtungsschema wählen, ob Sie bevorzugen.

ETA: Wenn Sie in der Gewichtung die näheren Elemente stärker in Abstimm-Schema interessiert sind, beachten Sie, dass Sie auch die Abstände zu jedem der k Nachbarn wie folgt zu erreichen:

dists = attr(k, "nn.dist") 
dists[20, ] 
# output: 
# [1] 1238.777 1243.581 1323.538 1398.060 1503.371 1529.660 1538.128 1609.730 
# [9] 1630.910 1667.014 
+0

Wunderbare Antwort, danke Sie! Ich hatte ein paar Fragen. Jedes Mal, wenn ich versuche, Indizes zu drucken, gibt es null zurück, sollte ich etwas anderes als Ihr Beispiel machen? Kannst du irgendwelche Ressourcen empfehlen, um mehr über das Erstellen eines benutzerdefinierten Gewichtungsschemas zu erfahren? Oder Beispiele von jemandem, der einen schafft, den ich mir anschauen kann? –

+0

Das ist sehr seltsam.Was bekommst du, wenn du 'print (k)' machst? Wie bei anderen Gewichtungsschemata - Sie hätten genauso viel Glück, wie ich bei Google nach dem Begriff "KNN Weighted" suchen würde. Aber ich schreibe ein bisschen mehr über die Gewichtung meiner Antwort. –

+0

Ok, also nur um zu verdeutlichen, dass ich 'Ergebnisse' anstelle von' k' verwende. Ich nehme an, das macht keinen Unterschied, aber ich dachte mir, ich sollte das einfach rauswerfen. Wenn ich 'print (Ergebnisse) 'drucke, werden die 1000 Elemente ausgedruckt, die schließlich in meine CSV-Datei geschrieben werden. –

Verwandte Themen