gpt4 book ai didi

java - 余弦相似度返回错误的距离

转载 作者:行者123 更新时间:2023-11-29 03:36:17 24 4
gpt4 key购买 nike

我有两个表示为 HashMap 的 vector ,我想衡量它们之间的相似性。我在以下代码中使用余弦相似度度量:

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);
}

奇怪的是,两个本应不同的 vector 却接近 .9999 结果,这是完全错误的!

请注意,两个 map 的键完全相同。

数据文件在这里:file

文件格式:

FeatureId vector1_value vector2_value

最佳答案

您的代码没问题。

vector 由几个大特征支配。在这些特征中,两个 vector 几乎共线,这就是相似性度量接近 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

关于java - 余弦相似度返回错误的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com