4

我们使用 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));

将是一个可以接受的修复?

4

1 回答 1

5

代码在org.apache.mahout.math.hadoop.similarity.cooccurrence.measures. EuclideanDistanceSimilarity.

是的,它是以这种方式编写的,因为在计算中它具有向量 A 和 B 的范数,以及它们的点积,因此以这种方式计算距离要快得多。

身份很简单。令 C = A - B 并令 a、b 和 c 为相应向量的长度。我们需要c。由余弦定理可知,c 2 = a 2 + b 2 - 2ab· cos (θ),而ab· cos (θ)就是点积的值。请注意,normA在代码中实际上是范数(长度)的平方——实际上应该更好地命名。

回到这个问题:你是对的,这里有一个错误,因为四舍五入会使论点变为否定。修复不是abs(),但是:

double euclideanDistance = Math.sqrt(Math.max(0.0, normA - 2 * dots + normB));

它只需要限制为 0。我可以承诺。

于 2012-10-26T15:46:53.877 回答