jk4*_*k47 0 java map set keyset cosine-similarity
我正在做一些尝试推荐文档的工作,为此我使用了Cosine Similarity方法.以下是该方法的代码:
static double cosineSimilarity(HashMap<String, Double> v1, HashMap<String, Double> v2)
{
Set<String> both = v1.keySet();
both.retainAll(v2.keySet());
double sclar = 0, norm1 = 0, norm2 = 0;
for (String k : both)
{
sclar += v1.get(k) * v2.get(k);
}
for (String k : v1.keySet())
{
norm1 += v1.get(k) * v1.get(k);
}
for (String k : v2.keySet())
{
norm2 += v2.get(k) * v2.get(k);
}
return sclar / Math.sqrt(norm1 * norm2);
}
Run Code Online (Sandbox Code Playgroud)
问题是结果取决于参数传递的顺序.例如,如果我调用cosineSimilarity(v1, v2)它将返回0.3但如果我调用cosineSimilarity(v2, v1)它将返回一个完全不同的值.
我认为这与Map.keySet() 返回地图支持的集合的事实有关,但我不完全理解这一点的含义.
任何人都可以看到方法出错的地方?
尝试
Set<String> both = new HashSet<String>(v1.keySet());
Run Code Online (Sandbox Code Playgroud)
代替
Set<String> both = v1.keySet();
Run Code Online (Sandbox Code Playgroud)
您不应该修改从keySet方法获得的集合,因为map使用它,当您从中删除元素时(retainAll在您的情况下),元素也会从地图中删除.例:
Map<Integer, Integer> mp = new HashMap<Integer, Integer>();
mp.put(1, 1);
System.out.println(mp); // output {1=1}
mp.keySet().remove(1);
System.out.println(mp); // output {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |