在scikit-learn中为K-NN配置自定义距离度量时遇错的问题咨询
问题分析与解决办法
错误原因拆解
你的问题在scikit-learn 0.18.1这个旧版本里是很典型的自定义距离使用误区,主要有两个核心问题:
- 算法类型不支持自定义距离:
ball_tree(以及kd_tree)算法仅支持scikit-learn内置的距离度量(比如euclidean、manhattan),完全不兼容自定义函数。哪怕你后来改成brute,但因为第二个问题没解决,还是会报错。 - 自定义距离的传递方式错误:在0.18.1版本中,使用自定义距离函数时,不能把函数名以字符串(比如
'mydist')的形式传给metric参数,必须直接传递函数对象本身。
正确的代码写法
只需要调整两个参数:指定algorithm='brute',并且直接传递mydist函数给metric,修改后的代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import sklearn.neighbors as ng def mydist(x, y): return np.sum((x-y)**2) if __name__ == '__main__': # 修改algorithm为brute,metric直接传函数对象 nn = ng.KNeighborsClassifier(n_neighbors=3, algorithm='brute', metric=mydist)
额外说明
- 你的
mydist函数是符合要求的:它接受两个一维数组x和y,返回一个标量距离值,完全满足scikit-learn对自定义距离函数的格式要求。 - 如果你的自定义距离可以通过内置参数组合实现(比如这个例子里的平方欧氏距离,其实可以用
metric='euclidean'再配合相关参数,但如果是完全自定义的逻辑,就必须用上述方法)。
内容的提问来源于stack exchange,提问作者Cuenta
相关产品推荐
相关产品推荐

