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