2015-12-22 32 views
10

Mam niestandardową metrykę odległości, która musi być używana dla KNN, K Nearest Neighbors.Jak zezwolić sklearn K Nearest Neighbours na przyjęcie niestandardowych metryk odległości?

Próbowałem podążać za this, ale nie mogę go uruchomić z jakiegoś powodu.

Przypuszczam, że metryka odległość ma trwać dwa wektory/macierze o tej samej długości, co napisałem poniżej:

import sklearn 
from sklearn.neighbors import NearestNeighbors 
import numpy as np 
import pandas as pd 

def d(a,b,L): 
    # Inputs: a and b are rows from a data matrix 
    return a+b+2+L 

knn=NearestNeighbors(n_neighbors=1, 
       algorithm='auto', 
       metric='pyfunc', 
       func=lambda a,b: d(a,b,L) 
       ) 


X=pd.DataFrame({'b':[0,3,2],'c':[1.0,4.3,2.2]}) 
knn.fit(X) 

Jednak, kiedy zadzwonić: knn.kneighbors(), nie wydaje lubić niestandardową funkcję. Poniżej znajduje się dół stosu błędów:

ValueError: Unknown metric pyfunc. Valid metrics are ['euclidean', 'l2', 'l1', 'manhattan', 'cityblock', 'braycurtis', 'canberra', 'chebyshev', 'correlation', 'cosine', 'dice', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'yule', 'wminkowski'], or 'precomputed', or a callable 

Jednak widzę dokładnie to samo w pytaniu, które przytoczyłem. Wszelkie pomysły na to, jak sprawić, by działało to na sklearn version 0.14? Nie znam różnic w wersjach.

Dzięki.

+0

również czynność odległość nie jest dobre, zwróci wektor, ubezpieczeniowy musi zwrócić pojedynczą wartość – maxymoo

Odpowiedz

7

The documentation jest rzeczywiście bardzo jasne, na korzystanie z metrycznym argumentu:

metric : string or callable, default ‘minkowski’

metric to use for distance computation. Any metric from scikit-learn or scipy.spatial.distance can be used.

If metric is a callable function, it is called on each pair of instances (rows) and the resulting value recorded. The callable should take two arrays as input and return one value indicating the distance between them. This works for Scipy’s metrics, but is less efficient than passing the metric name as a string.

zatem (jak również za komunikatu o błędzie), metric powinny być wywoływalnym, a nie ciąg. I powinien zaakceptować dwa argumenty (tablice) i zwrócić jeden. Która jest twoja funkcja lambda.

Zatem kod można uprościć do:

import sklearn 
from sklearn.neighbors import NearestNeighbors 
import numpy as np 
import pandas as pd 

def d(a,b,L): 
    return a+b+2+L 

knn=NearestNeighbors(n_neighbors=1, 
       algorithm='auto', 
       metric=lambda a,b: d(a,b,L) 
       ) 
X=pd.DataFrame({'b':[0,3,2],'c':[1.0,4.3,2.2]}) 
knn.fit(X) 
+0

dziękuję. Dokumentacja, którą widziałem, była [tutaj] (http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html) i [tutaj] (http://scikit-learn.org/stable/ modules/generated/sklearn.neighbors.KNeighborsRegressor.html), z których żadna nie jest tak szczegółowa, jak cytowane. Dziękuję Ci. – Candic3

+0

Użyłem następującego kodu. To daje mi błąd wytrawiania. Czy możesz mi w tym pomóc? My Kod: def dist2 (a, b) powrotu Jaccard (a, b) knnobj = NearestNeighbors (n_neighbors = 6 algorytm = 'auto' metrykę = N a, b: dist2 (a, b)) .fit (my_Data) PicklingError: Can not pickle : wyszukiwanie atrybutów __builtin __. Funkcja nieudana – csalive