scikit-learn - 如何允许 sklearn K 最近邻采用自定义距离度量?

标签 scikit-learn distance nearest-neighbor udf

我有一个自定义距离度量,需要用于 KNN , K 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 上进行这项工作的任何想法?我不知道版本之间有任何差异。

谢谢。

最佳答案

The documentation实际上很清楚使用 metric 参数:

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应该是可调用的,而不是字符串。它应该接受两个参数(数组),并返回一个。哪个是您的 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)

关于scikit-learn - 如何允许 sklearn K 最近邻采用自定义距离度量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34408027/

相关文章:

machine-learning - sklearn 功能列表中允许的数据类型?

python - 使用 scikit-learn 的不平衡数据集,其中负面示例占多数

javascript - 使用谷歌地图获取多个距离

python - 查找二维数组中最近邻居的距离

pandas - 在 scikit-learn 中使用 Featureunion 为 tfidf 组合两个 Pandas 列

python - 我们可以在 XGBoost 中设置每个叶子的最小样本(就像其他 GBM 算法一样)吗?

c# - Jaccard 得分/距离或重叠百分比

r - 求多边形外接圆的半径

arrays - 在格上有效地计算邻居的功能

css - Chrome/Safari 中的图像插值模式?