我有两个向量表示为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
答案 0 :(得分:4)
你的代码很好。
向量由几个大特征主导。在这些特征中,两个向量几乎是共线的,这就是相似性度量接近1
的原因。
我在下面列出了六个最大的功能。查看vec2
与vec1
的比率:这些功能几乎相同。
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