3

Java で Apache Commons RealVector および ArrayRealVector クラスを使用しています。2 つのベクトル v1 と v2 の間のユークリッド距離を次のように計算できます。

double dist = v1.getDistance(v2);

ただし、二乗ユークリッド距離を取得しようとしています。Apache Commons Vector3D でこれを行う方法があることは知っています。distanceSq 関数を使用するだけです。私は高次元のベクトルで最近傍検索を行っているので、平方根を取る意味がありません。私のニーズに対して計算が無駄になるだけです。

私はそれをできた

ArrayRealVector diff = v1.subtract(v2);
double dist = diff.dotProduct(diff);

もちろん、これには回避したい中間の ArrayRealVector を返すことが含まれます。二乗ユークリッド距離を取得するコードを簡単に作成できますが、Apache Commons 数学のソリューションを使用したいと考えています。組み込みのソリューションはどれも素晴らしいものです。他の Apache Math クラスからのソリューションでさえ、おそらく問題ありません。

4

2 に答える 2

1

まず、平方根と乗算のオーバーヘッドは、おそらく他の多くのものよりも小さいと思います。単純化という名目で、dist * distそれがボトルネックであると確信できるまで、私はそのまま使用します。

getDistanceSquared()この理由から、ほぼ確実にはありません。それがAPIがあなたに望んでいることだと思います。

たとえば、別の を割り当てると、実際には遅くなりますRealVector

本当に問題がある場合は、コードをコピーしgetDistance()て平方根を取り出してください!

于 2012-07-16T19:28:31.050 に答える
1

これを見た:

http://svn.apache.org/repos/asf/mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/EuclideanDistanceMeasure.java

それが私を導きました:

https://builds.apache.org/job/Mahout-Quality/javadoc/org/apache/mahout/common/distance/SquaredEuclideanDistanceMeasure.html

このような単純な計算のために Mahout を利用したいとは思いませんが、彼らが使用しているコードをコピーするだけでよいでしょう。

于 2012-07-16T18:49:03.270 に答える