2016-10-23 2 views
0

Ich muss K nächsten Nachbarn mit benutzerdefinierten Metrik verwenden. Ich habe eine Formel, die für Eigenschaften meiner Objekte funktioniert. Es bedeutet, dass ich Matrix habe. Diese Matrix besteht aus Vektoren und jeder Vektor enthält 3 Skalarwerte, die in der Formel verwendet werden.Was bedeuten Einkommenswerte in benutzerdefinierten Metrik für K nächste Nachbarn?

Ich habe gefunden, wie benutzerdefinierte Metrik innerhalb der Klasse KNeighborsClassifier von Bibliothek sklearn verwenden. Es braucht nur einen Parameter namens metric, der string oder callable sein kann. Also ... Ich habe eine Funktion erstellt, aber diese Funktion benötigt zwei gleiche Arrays, die zum ersten Mal 10 skalare Werte enthalten. Ich meine, jedes Array enthält stattdessen 10 Werte. Zu jedem folgenden Zeitpunkt nimmt die Funktion Werte aus meiner Matrix.

Ich habe Call-Stack angesehen und ich habe gesehen, dass die Funktion aus der Klasse BallTree aufgerufen. Ich habe über diese Struktur gelesen, aber ich kann nicht verstehen, wie sie meine Daten oder was sie zum ersten Mal an meine Metrik übergibt.

Was bedeuten diese beiden ersten gleichen Arrays?

I instanziiert Klassifikator durch diesen Code

clf = KNeighborsClassifier(n_jobs=4, metric=custom_metric) 
clf.fit(X, Y) 

X-Werte wie folgt enthält.

array([[2.400154, 0.07744107744107744, 96.80566400000001], 
     [2.39325, 0.07744107744107744, 97.219544], 
     [2.395162, 0.07744107744107744, 97.10519599999999], 
     [3.101635, 0.009788768675940238, 65.88368], 
     [3.09882, 0.009788768675940238, 65.97364499999999], 
     [3.099576, 0.009788768675940238, 65.956018]], dtype=object) 

custom_metric ist meine Funktion. Es enthält gerade nichts.

def custom_metric(x: np.ndarray, y: np.ndarray) -> float: 
    pass 

Beispiel x und y

array([ 0.02274535, 0.21161613, 0.41314247, 0.39046054, 0.1670481 , 
     0.15515555, 0.13329802, 0.59103014, 0.26246693, 0.7727967 ]) 

Wie schreibe ich über sie gleich sind.

Sorry, wenn mein Englisch nicht klar ist.

Antwort

0

Ihr Snippet nicht viel Sinn machen, wird knn Metrik nie als Argument etwas von anderen Raum bekommen als Sie es trainiert auf, minimal Beispiel zeigen:

import numpy as np 
x = np.array(range(10)).reshape(5,-1) 
y = np.array(range(5)) 

from sklearn.neighbors import KNeighborsClassifier as KNN 
def foo(X, Y): 
    print 'X', X, X.shape 
    print 'Y', Y, Y.shape 
    return 0 

clf = KNN(metric=foo) 
clf.fit(x, y) 
clf.predict(x) 

Drucke als

erwartet
X [ 0. 1.] (2,) 
Y [ 2. 3.] (2,) 
X [ 0. 1.] (2,) 
Y [ 4. 5.] (2,) 
X [ 0. 1.] (2,) 
Y [ 6. 7.] (2,) 
X [ 0. 1.] (2,) 
Y [ 8. 9.] (2,) 
X [ 2. 3.] (2,) 
Y [ 4. 5.] (2,) 
X [ 2. 3.] (2,) 
Y [ 6. 7.] (2,) 
X [ 2. 3.] (2,) 
Y [ 8. 9.] (2,) 
X [ 4. 5.] (2,) 
Y [ 6. 7.] (2,) 
X [ 4. 5.] (2,) 
Y [ 8. 9.] (2,) 
X [ 6. 7.] (2,) 
Y [ 8. 9.] (2,) 
X [ 0. 1.] (2,) 
Y [ 0. 1.] (2,) 
X [ 2. 3.] (2,) 
Y [ 2. 3.] (2,) 
X [ 4. 5.] (2,) 
Y [ 4. 5.] (2,) 
X [ 6. 7.] (2,) 
Y [ 6. 7.] (2,) 
X [ 8. 9.] (2,) 
Y [ 8. 9.] (2,) 

also in Ihrem Fall sollte Matric 2 Vektoren akzeptieren, jeder 3-dimensional, und einen gültigen Abstand zwischen ihnen zurück, das ist alles.

Sie können nur 10 Dimensionen erhalten, wenn Sie mit dieser Dimensionalität an predict übergeben. Es ist nichts "Magisches" in BallTree versteckt, es muss in Ihren Daten enthalten sein.

+0

Hallo! Kannst du mir Versionen deines Sklearns erzählen, numpy, scipy? – ANtlord

+0

Numpy spielt hier keine Rolle. Sklearn ist auf dem neuesten Stand (0.18) – lejlot

+0

Oh! Hast du Python 2? Ich bin auf Python 3. Ich habe Ihren Code getestet und es wird ausgegeben, was Sie gezeigt haben, aber auf Python 3 habe ich einen Fehler über Rückgabewert der metrischen Funktion. Metrik muss den Float-Wert als Abstand zwischen Objekten angeben. – ANtlord

Verwandte Themen