我是Mahout的新手,并且最近将我之前的许多机器学习代码转换为此框架。在许多地方,我使用向量之间的余弦相似性进行聚类,分类等。然而,调查Mahout的distance method让我非常惊讶。在下面的代码片段中,维度和浮点值取自我的一个程序的实际输出(这里不重要):
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.common.distance.CosineDistanceMeasure;
public static void main(String[] args) {
RandomAccessSparseVector u = new RandomAccessSparseVector(373);
RandomAccessSparseVector v = new RandomAccessSparseVector(373);
u.set(24, 0.4526985183337534);
u.set(55, 0.5333219834564495);
u.set(54, 0.5333219834564495);
u.set(53, 0.4756042214095471);
v.set(57, 0.6653016370845252);
v.set(56, 0.6653016370845252);
v.set(11, 0.3387439495921685);
CosineDistanceMeasure cosineDistanceMeasure = new CosineDistanceMeasure();
System.out.println(cosineDistanceMeasure.distance(u, v));
}
输出为1.0
。不应该是0.0
?
使用cosineDistanceMeasure.distance(u, u)
的输出进行此处,我意识到我要找的是1 - cosineDistanceMeasure.distance(u, v)
。但是这个逆转对我来说没有意义。知道为什么这样实现吗?或者我错过了一些非常明显的东西?
答案 0 :(得分:1)
当两个点“接近”时,它们从原点看作矢量时形成的角度很小,接近于零。接近零的角度的余弦接近1,并且随着角度朝向90度然后180度,余弦减小。
随着距离的增加,余弦减少。这就是为什么两个矢量之间的角度的余弦本身作为距离度量没有意义的原因。制定距离度量的“规范”方法是1 - 余弦;这是一个合适的指标。