当前位置:  开发笔记 > 编程语言 > 正文

如何计算两个向量的余弦相似度?

如何解决《如何计算两个向量的余弦相似度?》经验,为你挑选了4个好方法。

如何找到矢量之间的余弦相似度?

我需要找到相似度来衡量两行文本之间的相关性.

例如,我有两个句子,如:

用户界面系统

用户界面机器

...和tF-idf之后的各自向量,然后使用LSI进行归一化,例如 [1,0.5][0.5,1].

如何衡量这些向量之间的熟悉程度?



1> Alphaaa..:

如果您想避免依赖第三方库来完成这么简单的任务,这里有一个简单的Java实现:

public static double cosineSimilarity(double[] vectorA, double[] vectorB) {
    double dotProduct = 0.0;
    double normA = 0.0;
    double normB = 0.0;
    for (int i = 0; i < vectorA.length; i++) {
        dotProduct += vectorA[i] * vectorB[i];
        normA += Math.pow(vectorA[i], 2);
        normB += Math.pow(vectorB[i], 2);
    }   
    return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}

请注意,该函数假定两个向量具有相同的长度.您可能想要明确地检查它是否安全.


谢谢,我只是懒得去做.:)

2> Toon Krijthe..:

请查看:http://en.wikipedia.org/wiki/Cosine_similarity.

如果你有矢量A和B.

相似性定义为:

cosine(theta) = A . B / ||A|| ||B||

For a vector A = (a1, a2), ||A|| is defined as sqrt(a1^2 + a2^2)

For vector A = (a1, a2) and B = (b1, b2), A . B is defined as a1 b1 + a2 b2;

So for vector A = (a1, a2) and B = (b1, b2), the cosine similarity is given as:

  (a1 b1 + a2 b2) / sqrt(a1^2 + a2^2) sqrt(b1^2 + b2^2)

例:

A = (1, 0.5), B = (0.5, 1)

cosine(theta) = (0.5 + 0.5) / sqrt(5/4) sqrt(5/4) = 4/5



3> Mark Davidso..:
public class CosineSimilarity extends AbstractSimilarity {

  @Override
  protected double computeSimilarity(Matrix sourceDoc, Matrix targetDoc) {
    double dotProduct = sourceDoc.arrayTimes(targetDoc).norm1();
    double eucledianDist = sourceDoc.normF() * targetDoc.normF();
    return dotProduct / eucledianDist;
  }
}

我最近在大学的信息检索部门做了一些tf-idf的东西.我使用了Cosine Similarity方法,该方法使用Jama:Java Matrix Package.

有关完整的源代码,请参阅IR Math with Java:相似度量,这是一个非常好的资源,涵盖了很多不同的相似性度量.



4> Nick Fortesc..:

对于Java中的矩阵代码,我建议使用Colt库.如果你有这个,代码看起来像(没有测试甚至编译):

DoubleMatrix1D a = new DenseDoubleMatrix1D(new double[]{1,0.5}});
DoubleMatrix1D b = new DenseDoubleMatrix1D(new double[]{0.5,1}});
double cosineDistance = a.zDotProduct(b)/Math.sqrt(a.zDotProduct(a)*b.zDotProduct(b))

上面的代码也可以改为使用其中一种Blas.dnrm2()方法或Algebra.DEFAULT.norm2()用于规范计算.完全相同的结果,更具可读性取决于品味.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有