当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何让sklearnK最近邻居采取自定义距离指标?》经验,为你挑选了1个好方法。

我有一个我需要使用的自定义距离指标KNN,K Nearest Neighbors.

我试着遵循这个,但我不能因为某些原因让它工作.

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

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> 小智..:

关于度量参数的使用,文档实际上非常清楚:

metric:字符串或可调用,默认为'minkowski'

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

如果metric是可调用函数,则在每对实例(行)上调用它,并记录结果值.callable应该将两个数组作为输入,并返回一个指示它们之间距离的值.这适用于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)

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有