是否有可能使用类似1 - 余弦相似性和scikit learn's KNeighborsClassifier?
这个答案说不,但是在KNeighborsClassifier 的文档中,它说DistanceMetrics中提到的指标是可用的.距离度量不包括显式余弦距离,可能是因为它实际上不是距离,但据推测可以在度量中输入函数.我尝试将scikit学习线性内核输入到KNeighborsClassifier中,但它给了我一个错误,该函数需要两个数组作为参数.有人试过这个吗?
余弦相似度通常定义为x T y /(|| x ||*|| y ||),如果它们相同则输出1,如果它们完全不同则输出-1.这个定义在技术上不是一个度量标准,所以你不能使用像ball和kd树这样的加速结构.如果你强制scikit学会使用蛮力方法,你应该能够使用它作为距离,如果你传递自己的自定义距离度量对象.如果您想使用球树,可以使用将余弦相似度转换为有效距离度量的方法(您可以在JSAT库中找到一个)
但请注意,x T y /(|| x ||*|| y ||)=(x/|| x ||)T(y/|| 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
权重选项,结果将与使用正确的余弦距离相同.