使用余弦距离与scikit学习KNeighborsClassifier

时间:2015-12-07 22:36:45

标签: python machine-learning scikit-learn knn

是否有可能使用类似1 - 余弦相似性的东西与scikit learn的KNeighborsClassifier?

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

2 个答案:

答案 0 :(得分:27)

余弦相似度通常定义为x T y /(|| x || * || y ||),如果它们相同则输出1,如果它们相等则输出为-1完全不同。这个定义在技术上不是指标,因此你不能使用像球和kd树这样的加速结构。如果你强制scikit学会使用蛮力方法,你应该能够使用它作为距离,如果你传递自己的自定义距离度量对象。如果您想使用球树,可以使用将余弦相似度转换为有效距离度量的方法(您可以在JSAT library中找到一个)

注意,x T y /(|| x || * || y ||)=(x / || x ||) T ( Y / || ||Ý)。欧氏距离可以等效地写为sqrt(x T x + y T y - 2 x T y)。如果我们在将每个数据点提供给KNeighborsClassifier之前对其进行规范化,那么x^T x = 1用于所有x。因此,欧氏距离将降至sqrt(2 − 2x^T y)。对于完全相同的输入,我们将获得sqrt(2-2*1) = 0和完整的对立sqrt(2-2*-1)= 2。它显然是一个简单的形状,因此您可以通过标准化数据然后使用欧氏距离来获得与余弦距离相同的排序。只要您使用uniform权重选项,结果将与使用正确的余弦距离相同。

答案 1 :(得分:1)

KNN家族类的构造函数有一个名为metric的参数,您可以在要在最近邻居模型中使用的不同距离度量之间进行切换。 可以找到可用距离指标的列表here