1
我有兩個向量表示爲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
我們可以看到兩個向量的數據嗎? – 2013-03-12 07:34:44
沒有任何關於你的代碼跳出。我同意安德斯的看法,我們需要查看數據。 – NPE 2013-03-12 07:39:02
@ AndersR.Bystrup當然。這是相當長的矢量雖然 – DotNet 2013-03-12 07:39:21