2015-12-22 4 views
10

私はKNNK Nearest Neighborsのために使用する必要があるカスタムの距離メトリックを持っています。Sklearnを許可する方法K最近の隣人はカスタム距離メトリックを取ることができますか?

私はthis次試してみましたが、私はそれが何らかの理由で動作させることはできません。

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) 

を、しかし、私が呼ぶとき:

私は以下の書かれているように私は、距離メトリックは、同じ長さの2つのベクトル/配列を取ることになっていることを前提としていますknn.kneighbors()、それはいないようですカスタム関数が好きです。エラースタックの一番下には、次のようなものがあります。

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 

しかし、私が引用した質問では全く同じです。この作業をどのように行うかについてのアイデアはsklearn version 0.14ですか?私はバージョンの違いを認識していません。

ありがとうございました。

+0

またあなたの距離関数は良いではありません、それは – maxymoo

答えて

7

The documentationが実際メトリック引数の使用にかなり明確である:

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.

このように(また、エラーメッセージごとなど)、metric呼び出し可能、ない文字列でなければなりません。そして、2つの引数(配列)を受け取り、1つを返す必要があります。あなたのlambda機能はどちらですか?

このように、あなたのコードがに簡素化することができます。

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

ありがとう単一の値を返す必要がありwheras、それは、ベクトルを返します。私が見たドキュメントは[こちら](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)と[ここ](http://scikit-learn.org/stable/ましたmodules/generated/sklearn.neighbors.KNeighborsRegressor.html)、いずれもあなたが引用したものほど詳細ではありません。ありがとうございました。 – Candic3

+0

次のコードを使用しました。それは私に酸洗エラーを与える。これで私を助けることができますか?マイコード: DEF dist2(B): リターンジャカード(B) knnobj = NearestNeighbors(N_NEIGHBORS = 6、アルゴリズム= '自動車'、メトリック=ラムダA、B:dist2(B) ).fit(my_Data) PicklingError:<タイプ '関数を'>酸洗いすることはできません:属性ルックアップ__builtin __関数が失敗しました – csalive

関連する問題