【问题标题】:Cosine distance of RandomAccessSparseVectors in MahoutMahout 中 RandomAccessSparseVectors 的余弦距离
【发布时间】:2013-02-24 13:43:41
【问题描述】:

我是 Mahout 的新手,最近一直在将我以前的许多机器学习代码转换为这个框架。在很多地方,我使用向量之间的余弦相似度来进行聚类、分类等。然而,研究 Mahout 的 distance method 却让我大吃一惊。在下面的代码 sn-p 中,维度和浮点值取自我的一个程序的实际输出(在这里无关紧要):

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)。但是这种反转对我来说没有意义。知道为什么以这种方式实施吗?还是我遗漏了一些非常明显的东西?

【问题讨论】:

    标签: java vector mahout cosine-similarity


    【解决方案1】:

    当两点“接近”时,从原点看成向量时它们形成的角度很小,接近于零。接近 0 的角度的余弦值接近 1,并且余弦值随着角度向 90 度然后向 180 度方向减小。

    所以余弦随着距离的增加而减小。这就是为什么两个向量之间夹角的余弦本身不能作为距离度量的原因。制作距离度量的“规范”方法是 1 - 余弦;这是一个适当的指标。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2017-12-12
      • 1970-01-01
      • 2021-09-09
      • 2020-02-11
      • 1970-01-01
      • 2014-08-21
      • 2015-05-31
      • 2016-08-23
      相关资源
      最近更新 更多