【问题标题】:NaN distances in Mahout Euclidean implementationMahout Euclidean 实现中的 NaN 距离
【发布时间】: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


【解决方案1】:

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

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

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

回到问题:你是对的,这里有一个错误,因为四舍五入会使参数变为负数。修复不是abs(),而是:

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

只需要限制为 0。我可以提交。

【讨论】:

  • 仅供参考,我尝试使用 EuclideanDistanceSimilarity 的修补版本,它似乎可以解决问题。谢谢肖恩。
猜你喜欢
  • 2014-12-23
  • 2013-02-24
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2019-11-24
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多