【发布时间】:2012-10-16 20:29:59
【问题描述】:
我们正在使用 EuclideanDistanceSimilarity 类来计算使用 Hadoop 的一堆项目的相似度。
不幸的是,尽管与项目高度相似,但一些项目得到的相似项目为零或很少。
我想我已经在 EuclideanDistanceSimilarity 类中找到了这一行:
double euclideanDistance = Math.sqrt(normA - 2 * dots + normB);
传递给 sqrt 的值有时是负数,在这种情况下返回 NaN。我想也许那里应该有一个 Math.abs,但我的数学还不够强大,无法理解欧几里得计算是如何重新排列的,所以不确定会产生什么效果。
谁能更好地解释数学并确认是否
double euclideanDistance = Math.sqrt(Math.abs(normA - 2 * dots + normB));
会是可接受的解决方法吗?
【问题讨论】:
-
有趣的实现,通常欧几里得相似之处就像
(1-sqrt(sum((vector2-vector1)^2)) -
该行出现在代码的什么位置?
-
@ThomasJungblut 是的,我不完全明白,我想这是因为计算已经分发了。我可以告诉你,在这种情况下 normA 和 normB 是每个向量的平方和,而点可能是和点积,但我不确定。
-
@larsmans 在 SimiliarityReducer 中它调用
similarity.similarity。该行位于 EuclideanDistanceSimilarity 中,它是 VectorSimilarityMeasure 之一,可以通过 Hadoop 作业的配置插入。
标签: hadoop mahout euclidean-distance