2013-03-12 44 views
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

+3

我們可以看到兩個向量的數據嗎? – 2013-03-12 07:34:44

+0

沒有任何關於你的代碼跳出。我同意安德斯的看法,我們需要查看數據。 – NPE 2013-03-12 07:39:02

+0

@ AndersR.Bystrup當然。這是相當長的矢量雖然 – DotNet 2013-03-12 07:39:21

回答

4

你的代碼是正確的。

向量由幾個大特徵支配。在這些特徵中,兩個向量幾乎是共線的,這就是爲什麼相似性度量接近於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 
+1

謝謝。所以我應該規範這些功能? – DotNet 2013-03-12 08:02:08