4

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));

許容できる修正でしょうか?

4

1 に答える 1

5

コードはにありorg.apache.mahout.math.hadoop.similarity.cooccurrence.measures. EuclideanDistanceSimilarityます。

はい、このように書かれています。計算のその時点で、ベクトルAとBのノルムとそれらの内積があるため、この方法で距離を計算する方がはるかに高速です。

アイデンティティは非常に簡単です。C = A-Bとし、a、b、cを対応するベクトルの長さとします。cが必要です。余弦定理から、c 2 = a 2 + b 2-2abcos(θ)であり、ab・cos(θ)は内積の値にすぎません。normAコードでは、実際にはノルム(長さ)の2乗であることに注意してください。実際には、より適切な名前を付ける必要があります。

質問に戻る:あなたは正しいです、ここにバグがあります、その丸めは議論を否定的にすることができます。修正はそうではありませんabs()が、:

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

0に制限する必要があります。それをコミットできます。

于 2012-10-26T15:46:53.877 に答える