【问题标题】:Cosine similarity returning wrong distance余弦相似度返回错误的距离
【发布时间】:2013-02-27 15:09:24
【问题描述】:

我有两个表示为 HashMap 的向量,我想测量它们之间的相似性。我在以下代码中使用余弦相似度度量:

public static void cosineSimilarity(HashMap<Integer,Double> vector1, HashMap<Integer,Double> vector2){
double scalar=0.0d, v1Norm=0.0d, v2Norm=0.0d;

for(int featureId: vector1.keySet()){
   scalar+= (vector1.get(featureId)* vector2.get(featureId));
   v1Norm+= (vector1.get(featureId) * vector1.get(featureId));
   v2Norm+= (vector2.get(featureId) * vector2.get(featureId));
}

 v1Norm=Math.sqrt(v1Norm);
 v2Norm=Math.sqrt(v2Norm);

 double cosine= scalar / (v1Norm*v2Norm);
 System.out.println("v1 is: "+v1Norm+" , v2 is: "+v2Norm+" Cosine is: "+cosine);    
}

奇怪的是,两个本应不同的向量接近 .9999 结果,这是错误的!

请注意,两张地图的键完全相同。

数据文件在这里:file

文件格式:

FeatureId vector1_value vector2_value

【问题讨论】:

  • 我们能看到这两个向量的数据吗?
  • 您的代码没有任何内容。我同意 Anders 的观​​点,即我们需要查看数据。
  • @AndersR.Bystrup 当然。虽然它是一个很长的向量
  • @DotNet 如果它真的很长,那么您可能会遇到浮点精度问题。更多原因有助于查看实际数据。
  • @MatthewT.Staebler 和大家,谢谢。我上传了数据文件。

标签: java text-mining cosine-similarity


【解决方案1】:

你的代码没问题。

向量由几个大特征主导。在这些特征中,两个向量几乎共线,这就是为什么相似度接近1

我包括以下六个最大的功能。看看vec2vec1 的比率:这些功能几乎相同。

feature     vec1    vec2        vec2/vec1

64806110    2875    1.85E+07    6.43E+03
64806108    5750    3.68E+07    6.40E+03
64806107    8625    5.49E+07    6.37E+03
64806106    11500   7.29E+07    6.34E+03
64806111    14375   9.07E+07    6.31E+03
64806109    17250   1.08E+08    6.28E+03

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2015-05-31
    • 2020-02-11
    • 2014-02-25
    • 2010-10-31
    • 2020-04-22
    • 2016-01-01
    • 2020-08-12
    • 2012-08-20
    相关资源
    最近更新 更多