euclidean实现中的hadoop-nan距离

7nbnzgx9  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(372)

我们使用EuclideAndInstanceSimilarity类来使用hadoop计算一堆项目的相似性。
不幸的是,有些项目得到零或很少产生类似的项目,尽管是高度相似的项目。
我想我已经在欧几里德和恒等相似性类中找到了这一行: double euclideanDistance = Math.sqrt(normA - 2 * dots + normB); 传递给sqrt的值有时是负数,在这种情况下返回nan。我想也许应该有一个math.abs在那里的某个地方,但我的数学不够强大,无法理解欧几里德计算是如何被重新安排的,所以不确定会有什么影响。
有没有人能更好地解释一下数学,并确认 double euclideanDistance = Math.sqrt(Math.abs(normA - 2 * dots + normB)); 可以接受吗?

vulvrdjw

vulvrdjw1#

代码在 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 在代码中实际上是范数(长度)的平方——真的应该更好地命名。
回到问题:你是对的,这里有一个bug,四舍五入可以使参数为负。解决办法并不简单 abs() ,但是:

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

它只需要被限制为0。我可以保证。

相关问题