python - 在 scikit learn KNeighborsClassifier 中使用余弦距离

标签 python machine-learning scikit-learn knn

是否可以将 1 - 余弦相似度与 scikit learn 的 KNeighborsClassifier 一起使用?

This回答说不,但是在 documentation 上对于 KNeighborsClassifier,它表示 DistanceMetrics 中提到的指标可用。距离度量不包括明确的余弦距离,可能是因为它不是真正的距离,但据说可以将函数输入到度量中。我尝试将 scikit 学习线性内核输入 KNeighborsClassifier,但它给我一个错误,该函数需要两个数组作为参数。还有其他人试过这个吗?

最佳答案

余弦相似度一般定义为xT y/(||x|| * ||y||),相同输出1,相同输出-1是完全不同的。这个定义在技术上不是一个度量,所以你不能用它来使用加速结构,比如球和 kd 树。如果你强制 scikit 学习使用蛮力方法,你应该能够将它用作距离,如果你将它传递给你自己的自定义距离度量对象。如果您想使用球树(您可以在 JSAT library 中找到一个)

注意,xT y/(||x|| * ||y||) = (x/||x||)T ( y/||y||)。欧氏距离可以等效地写为 sqrt(xTx + yTy − 2 xTy)。如果我们在将每个数据点提供给 KNeighborsClassifier 之前对其进行归一化,则所有 xx^T x = 1。所以欧几里德距离将退化为 sqrt(2 − 2x^T y)。对于完全相同的输入,我们将得到 sqrt(2-2*1) = 0,对于完全相反的输入,我们将得到 sqrt(2-2*-1)= 2。它显然是一个简单的形状,因此您可以通过对数据进行归一化然后使用欧氏距离来获得与余弦距离相同的顺序。只要您使用 uniform 权重选项,结果就与使用正确的余弦距离相同。

关于python - 在 scikit learn KNeighborsClassifier 中使用余弦距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144632/

相关文章:

python - 如何在 python 程序中处理操作系统信号?

python - 预测 scikit-learn 分类运行需要多长时间

python - one-hot编码后获取特征名称

python - 如何正确交叉验证

python - 在 Python 中实现基于策略的深度优先遍历

python - 如何使用三次或更高次的多项式曲面回归来拟合一组 3D 数据点?

python - 在单个项目中重用 Django 应用程序

python - Scikit-Learn 准确度分数不显示准确度

machine-learning - 改变批量大小如何导致不同的预测时间?

python - OneHotEncoding 蛋白质序列