Scikit learn 如何允许SKK最近邻采用自定义距离度量?

Scikit learn 如何允许SKK最近邻采用自定义距离度量?,scikit-learn,distance,nearest-neighbor,udf,Scikit Learn,Distance,Nearest Neighbor,Udf,我有一个自定义距离度量,需要用于KNN,K近邻 我试着跟随,但由于某种原因,我无法让它工作 我假设距离度量应该采用两个长度相同的向量/数组,如下所述: 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

我有一个自定义距离度量,需要用于
KNN
K近邻

我试着跟随,但由于某种原因,我无法让它工作

我假设距离度量应该采用两个长度相同的向量/数组,如下所述:

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 0.14版
上实现此功能,您有什么想法吗?我不知道这些版本有什么不同

谢谢。

实际上非常清楚度量参数的用法:

度量:字符串或可调用,默认为“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)

此外,距离函数也不好,它将返回一个向量,而它需要返回一个值。谢谢。我所看到的文档是,而且都没有你引用的那么详细。谢谢。我使用了以下代码。这给了我酸洗的错误。你能帮我吗?我的代码:def dist2(a,b):返回jaccard(a,b)knnobj=nearestneights(n_neights=6,algorithm='auto',metric=lambda,b:dist2(a,b))。拟合(我的数据)PicklingError:无法pickle:属性查找内置函数失败