HashMap として表される 2 つのベクトルがあり、それらの間の類似性を測定したいと考えています。次のコードのように、コサイン類似度メトリックを使用します。
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);
}
不思議なことに、似ていないはずの 2 つのベクトルが 0.9999 の結果に近くなりましたが、これはまったくの間違いです!
キーは両方のマップでまったく同じであることに注意してください。
データファイルはここにあります: file
ファイル形式:
FeatureId vector1_value vector2_value