在Apache Commons Math中,使用RealVectors计算平方欧几里得距离。

3

我在Java中使用Apache Commons RealVector和ArrayRealVector类。我可以通过以下方式计算两个向量v1和v2之间的欧几里德距离:

double dist = v1.getDistance(v2);

然而,我希望得到欧几里得距离的平方。我知道可以使用 Apache Commons Vector3D 中的 distanceSq 函数来实现这一点。我正在使用高维向量进行最近邻搜索,因此没有必要取平方根——这对我的需求只是计算上的浪费。
我可以这样做:
ArrayRealVector diff = v1.subtract(v2);
double dist = diff.dotProduct(diff);

当然,这涉及返回一个中间的ArrayRealVector,我希望避免这种情况。我可以很容易地编写代码来获取平方欧几里得距离,但想使用Apache Commons math的解决方案。任何内置的解决方案都很好——甚至来自其他Apache Math类的解决方案也可能是可以接受的。
2个回答

1

如果他已经在使用Commons Math,那么复制Commons Math正在做的事情会更相关。 - Sean Owen
没错,我同意--这就是为什么我怀疑他是否想要引入Mahout。建议是只需编写代码或从Mahout复制代码,如果他担心自己无法像别人一样快地编写出来的话。 - user41871
在我进行搜索之后,我对Mahout产生了兴趣,最终购买了你的书。 :-) - user41871
可能还需要查看Mahout向量类-似乎很有趣,尽管不确定它们与Apache Math中的向量类相比如何。它们似乎有更少的方法,但通过传递“函数”,似乎可以完成大部分相同的工作。最简单的方法可能是从Apache math中删除sqrt函数。 - COM
我发现Mahout案例有趣的地方在于他们以一种明确考虑到你提出的问题的方式设计类。因此,我建议只需查看Commons Math的欧几里得距离实现方式,看看他们是否也这样做。听起来并不是这样。因此,你的选择就是接受它(例如将结果平方)或编写自己的代码。前者是更简洁的代码,后者是更干净的计算。你自己选择吧。 :-D - user41871

1

首先,我建议平方根和乘法的开销可能被许多其他事情所淹没。为了简单起见,我建议您只使用dist * dist,直到确定这是瓶颈为止。

几乎可以肯定地说,没有getDistanceSquared(),就是出于这个原因; 我认为这就是API希望您执行的操作。

例如,分配另一个RealVector确实会更慢。

如果真的很重要,只需将代码复制到getDistance()中并去掉平方根即可!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接