Python 为什么KNN使用自定义度量时速度慢?

Python 为什么KNN使用自定义度量时速度慢?,python,algorithm,scikit-learn,Python,Algorithm,Scikit Learn,我使用的数据集由大约200k个对象组成。每个对象都有4个特征。我用欧几里德度量的K近邻(KNN)对它们进行分类。该过程在大约20秒内完成 最近我有了一个使用自定义度量的理由。也许它会产生更好的结果。我已经实现了自定义度量,KNN已经可以工作一个多小时了。我没有等它完成 我认为这个问题的一个原因是我的度量。我将代码替换为返回1。KNN仍然工作了一个多小时。我假设一个原因是算法球树,但KNN和它和欧几里得度量在大约20秒内工作 现在我不知道怎么了。我使用Python3和sklearn 0.17.1。

我使用的数据集由大约200k个对象组成。每个对象都有4个特征。我用欧几里德度量的K近邻(KNN)对它们进行分类。该过程在大约20秒内完成

最近我有了一个使用自定义度量的理由。也许它会产生更好的结果。我已经实现了自定义度量,KNN已经可以工作一个多小时了。我没有等它完成

我认为这个问题的一个原因是我的度量。我将代码替换为
返回1
。KNN仍然工作了一个多小时。我假设一个原因是算法球树,但KNN和它和欧几里得度量在大约20秒内工作

现在我不知道怎么了。我使用Python3和sklearn 0.17.1。无法使用自定义度量完成进程。我也尝试了算法
brute
,但效果相同。scikit学习的升级和降级无效。在Python2上实现自定义度量的分类也没有积极的效果。我在Cython上实现了这个度量(仅返回1),它具有相同的效果

def自定义度量(x:np.ndarray,y:np.ndarray)->浮点:
返回1
clf=KNeighborsClassifier(n_作业=1,度量=自定义度量)
clf.配合(X,Y)
我可以用自定义度量通过KNN推进分类过程吗


抱歉,如果我的英语不清楚。

Sklearn已优化,并使用cython和多个进程尽可能快地运行。编写纯python代码,特别是当它被多次调用时,是导致代码变慢的原因。我建议您使用cython编写自定义度量。
您可以在这里学习一个教程:

正如@Réda Boumahdi正确指出的,原因是使用python中定义的自定义度量。这是一个已经讨论过的已知问题。讨论结束时,它以“wontfix”的形式关闭。因此,建议的唯一解决方案是在cython中编写自定义度量,以避免GIL在使用python度量时变慢。

用户定义函数在python中不是特别快;给他们打电话会有很多开销。您的自定义度量可能正在替换在C中实现的内容。KNN的欧几里德度量的距离矩阵可以通过矩阵加法和乘法(使用| | a-b | | | ^2=| | a | | 2+| b | | | | 2-2)来实现,这是高度优化和并行的(OpenBLAS、ATLAS或MKL)@chepner即使只在函数中也存在开销
返回1
?另外,正如我上面指出的,我已经在Cython上实现了度量,执行时间也很大@damienfrancois我对欧几里德度量没有问题。它是sklearn的标准度量单位。当我尝试使用自定义指标时,我的性能有问题。我应该看看C/C++库并在C/C++上重新实现我的程序吗?