Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算两个向量的余弦相似性?_Java_Vector_Trigonometry_Tf Idf - Fatal编程技术网

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

Java 如何计算两个向量的余弦相似性?,java,vector,trigonometry,tf-idf,Java,Vector,Trigonometry,Tf Idf,如何找到向量之间的余弦相似性 我需要找到相似性来衡量两行文本之间的相关性 例如,我有两个句子,如: 用户界面系统 用户接口机 …以及tF idf之后各自的向量,然后使用LSI进行归一化,例如 [1,0.5]和[0.5,1] 如何测量这些向量之间的置信度?请看: 如果你有向量A和B 相似性定义为: cosine(theta) = A . B / ||A|| ||B|| For a vector A = (a1, a2), ||A|| is defined as sqrt(a1^2 + a2^2)

如何找到向量之间的余弦相似性

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

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

用户界面系统

用户接口机

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

如何测量这些向量之间的置信度?

请看:

如果你有向量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

不久前,当我在处理文本挖掘时,我正在使用这个库,它在Java中提供了广泛的不同度量。如果碰巧你需要更多,那么总是有更多的东西可以看


但是,根据维基百科中的描述对其进行编码是一项相当简单的任务,也是一项很好的练习。

对于Java中的矩阵代码,我建议使用该库。如果有,代码看起来像(未经测试或编译):

上述代码也可以更改为使用
Blas.dnrm2()
方法之一或
Algebra.DEFAULT.norm2()
进行范数计算。完全相同的结果,更具可读性取决于口味

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的工作。 我使用了这个余弦相似性方法,它使用


有关完整的源代码,请参阅“非常好的资源”,它涵盖了一些不同的相似性度量

如果您想避免依赖第三方库完成如此简单的任务,下面是一个简单的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));
}
公共静态双余弦相似性(双[]向量A,双[]向量B){
双点积=0.0;
双正常值=0.0;
双标准b=0.0;
对于(int i=0;i

请注意,该函数假定两个向量具有相同的长度。您可能需要明确检查它的安全性。

有关使用
Map(dimension->magnity)
这是一个scala版本(您可以在Java8中执行类似的操作)

def余弦相似性(vectorA:Vector[Double],vectorB:Vector[Double]):Double={
var dotProduct=0.0
var normA=0.0
var normB=0.0
变量i=0

例如(我觉得你的SimMetrics链接已经腐烂了,现在指向了一个关于鞋子的垃圾博客。看起来是个更好的博客。谢谢,我只是懒得这么做。:)这看起来非常像java的tbh
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));
}
def cosineSim(vec1:Map[Int,Int],
              vec2:Map[Int,Int]): Double ={
  val dotProduct:Double = vec1.keySet.intersect(vec2.keySet).toList
    .map(dim => vec1(dim) * vec2(dim)).sum
  val norm1:Double = vec1.values.map(mag => mag * mag).sum
  val norm2:Double = vec2.values.map(mag => mag * mag).sum
  return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2))
}
def cosineSimilarity(vectorA: Vector[Double], vectorB: Vector[Double]):Double={
    var dotProduct = 0.0
    var normA = 0.0
    var normB = 0.0
    var i = 0

    for(i <- vectorA.indices){
        dotProduct += vectorA(i) * vectorB(i)
        normA += Math.pow(vectorA(i), 2)
        normB += Math.pow(vectorB(i), 2)
    }

    dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))
}

def main(args: Array[String]): Unit = {
    val vectorA = Array(1.0,2.0,3.0).toVector
    val vectorB = Array(4.0,5.0,6.0).toVector
    println(cosineSimilarity(vectorA, vectorA))
    println(cosineSimilarity(vectorA, vectorB))
}