为什么 metric='precomputed' 在 sk-learn 的 k 最近邻中不起作用?

Why metric='precomputed' doesn't work in sk-learn's k-nearest neighbours?

我试图在使用 http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html 时拟合预先计算的内核矩阵,这显然是可能的,因为度量 'precomputed' 存在。我允许您将 n_samples*n_samples 核矩阵传递给 fit 方法。

使用它时,这是我得到的:

ValueError:指标 'precomputed' 对算法 'auto'

无效

我不明白使用算法 'auto' 查找最近邻与我使用的是预先计算的核矩阵这一事实不兼容。

编辑:

很遗憾,我的问题没有得到任何关注。我更深入地研究了源代码,似乎自从您通过 metric=precomputed 以来就存在一个错误,因为代码应该允许您选择 algorithm=auto。相反,当 运行 时,代码会遇到我提到的 valueError,我认为作者不希望他的代码以这种方式运行。我不知道如何更改源代码以使其正常运行。

此外,我想补充的是,从更理论的角度来看,能够使用核矩阵(又名克矩阵)来使用 kNN 的拟合方法是完全合理的。您可以从 gram 矩阵导出距离矩阵,然后当您想要预测新数据时,您只需找到 k 个最近的邻居,并在 k 个最近的邻居中用当前标签标记新数据。

我真的觉得这个问题应该得到答案。这是正确的问题,我想要一些非常精确的东西,我知道对 Python 和 scikit 学习库有更深入了解的人应该能够回答它。也许我遗漏了一些明显的东西,但我也认为它应该有助于任何试图将 kNN 与预先计算的内核矩阵一起使用的人(这不是孤立的情况)。

我想现在回复太晚了,但如果你还在想的话。 'Auto' 将不起作用,因为 KDTree 不接受用户定义或预先计算的指标。只有球树会起作用。如果您专门将算法设置为 'Ball Tree',它应该可以正常工作。希望这对您有所帮助!