我正在做一些工作来推荐文档,为此我使用了余弦相似度方法。这是该方法的代码:
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);
}
问题是结果会根据参数传递的顺序而有所不同。例如,如果我调用cosineSimilarity(v1, v2)
它将返回0.3
,但如果我调用cosineSimilarity(v2, v1)
它将返回一个完全不同的值。
我认为这与返回一个由地图支持的集合的事实有关Map.keySet()
,但我并不完全理解这一点的含义。
任何人都可以看到该方法出错的地方吗?