【发布时间】:2013-06-24 02:28:25
【问题描述】:
我想在我的 IR 项目中使用余弦相似度,但由于向量的大小很大并且必须多次乘以浮点数,所以需要很长时间。
有什么方法可以更快地计算余弦相似度?
这是我的代码:
private double diffrence(HashMap<Integer, Float> hashMap,
HashMap<Integer, Float> hashMap2 ) {
Integer[] keys = new Integer[hashMap.size()];
hashMap.keySet().toArray(keys);
float ans = 0;
for (int i = 0; i < keys.length; i++) {
if (hashMap2.containsKey(keys[i])) {
ans += hashMap.get(keys[i]) * hashMap2.get(keys[i]);
}
}
float hashLength = 0;
for (int i = 0; i < keys.length; i++) {
hashLength += (hashMap.get(keys[i]) * hashMap.get(keys[i]));
}
hashLength = (float) Math.sqrt(hashLength);
Integer[] keys2 = new Integer[hashMap2.size()];
hashMap2.keySet().toArray(keys2);
float hash2Length = 0;
for (int i = 0; i < keys2.length; i++) {
hash2Length += hashMap2.get(keys2[i]) * hashMap2.get(keys2[i]);
}
hash2Length = (float) Math.sqrt(hash2Length);
return (float) (ans /(hash2Length*hashLength));
}
【问题讨论】:
-
比什么更快?你真的应该展示一些代码,或者至少描述你的算法。如果您没有使用稀疏向量表示,则说明您做得不够理想。
-
你的所有内核都在炽热地运行,不是吗?
-
@Ulterior :你是什么意思?
-
你分析过这段代码吗?你知道哪一部分需要时间吗?有了这么多的哈希表查找,我不会太担心一些浮点操作。 (例如
hashMap.get(keys[i]) * hashMap.get(keys[i])两次查找完全相同的键,而您可以缓存结果。) -
@Paniz:这与 O(1) 无关,而与实际性能有关。哈希表是非常慢的向量表示。此外,如果您要进行 n 次查找,然后进行 n 次乘法运算,那么两者总共需要 O(n) 时间。
标签: java search-engine k-means cosine-similarity