【发布时间】: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