如何让sklearn K最近邻居采取自定义距离指标?

时间:2015-12-22 03:31:42

标签: scikit-learn distance nearest-neighbor udf

我有一个自定义距离指标,我需要将其用于KNNK Nearest Neighbors

我尝试跟随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)

然而,当我致电: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上开展此工作的任何想法?我不知道版本有任何差异。

感谢。

1 个答案:

答案 0 :(得分:8)

The documentation实际上非常清楚使用度量参数:

  

metric:string或callable,默认为'minkowski'

     

用于距离计算的度量标准。可以使用来自scikit-learn或scipy.spatial.distance的任何指标。

     

如果metric是一个可调用函数,则在每对实例(行)上调用它,并记录结果值。应该可以调用   将两个数组作为输入并返回一个指示距离的值   它们之间。这适用于Scipy的指标,但效率较低   而不是将度量标准名称作为字符串传递。

因此(同样根据错误消息),metric应该是可调用的,而不是字符串。它应该接受两个参数(数组),并返回一个。这是您的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)