2017-12-28 18 views
0

Zum Beispiel habe ich einen Vektor x und a ist es am nächsten Nachbar. Dann ist b es der nächste nächste Nachbar. Gibt es ein Paket in Pyton oder R, das etwas wie [a, b] ausgibt, was bedeutet, dass a sein nächster Nachbar ist (vielleicht durch Mehrheitswahl), während b der zweitnächste Nachbar ist.KNN-Algorithmus, die 2 oder mehr nächste Nachbarn

Antwort

2

Das ist genau das, wofür diese Metric-Bäume gebaut werden.

Ihre Frage lautet, wie Sie für etwas so einfach wie das mit sklearn der KDTree (man denke BallTree je nach Metrik im Spiel) fragen:

import numpy as np 
from sklearn.neighbors import KDTree 

X = np.array([[1,1],[2,2], [3,3]]) # 3 points in 2 dimensions 
tree = KDTree(X) 
dist, ind = tree.query([[1.25, 1.35]], k=2) 
print(ind) # indices of 2 closest neighbors 
print(dist) # distances to 2 closest neighbors 

Out:

[[0 1]] 
[[ 0.43011626 0.99247166]] 

Und nur um klar sein: KNN normalerweise bezieht sich auf einige Pre-Build-Algorithmus auf metrischen Bäumen (KDTree, BallTree) für die Aufgabe der Klassifizierung basiert. Oft sind die Datenstrukturen das einzige, was man interessiert ist.

bearbeiten

Wenn ich Ihren Kommentar richtig zu interpretieren, können Sie die manhattan/taxicab/l1 metric verwenden möchten.

Look here für die Kompatibilitätslisten dieser räumlichen Bäume.

Sie würden es einfach so verwenden:

X = np.array([[1,1],[2,2], [3,3]]) # 3 points in 2 dimensions 
tree = KDTree(X, metric='l1')           # !!! 
dist, ind = tree.query([[1.25, 1.35]], k=2) 
print(ind) # indices of 2 closest neighbors 
print(dist) # distances to 2 closest neighbors 

Out:

[[0 1]] 
[[ 0.6 1.4]] 
+0

Dank. Könnten Sie bitte mir helfen, meine eigene Distanzmetrik, die Distanzmatrix von Elementen von Vektoren, einzufügen? Zum Beispiel, wenn ich zwei Vektoren [x1, x2] und [y2, y2] habe, ist es möglich, Abstandsmetrik einzufügen, die Abstand zwischen Vektoren auf Element-für-Element-Basis von Abstandsmatrix erhält. Der Abstand zwischen x und y ist | x1-y1 | + | x2-y2 |. – spartan

+0

Wenn ich versuche 'tree = KDTree (X, metric = dist)' 'mit distbeing Funktion dist (x, y), die float zurückgibt bekomme ich Fehler: ValueError: metrisch PyFuncDistance ist nicht gültig für KDTree – spartan

+0

@spartan Siehe meine Bearbeitung. – sascha

Verwandte Themen