1

私はMahoutを初めて使用し、最近、以前の機械学習コードの多くをこのフレームワークに変換しています。多くの場所で、クラスタリングや分類などのためにベクトル間の余弦類似性を使用しています。しかし、Mahoutの距離法を調査すると、非常に驚​​きました。次のコードスニペットでは、ディメンションとフロートの値は、私のプログラムの1つの実際の出力から取得されています(ここでは重要ではありません)。

import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.common.distance.CosineDistanceMeasure;

public static void main(String[] args) {
    RandomAccessSparseVector u = new RandomAccessSparseVector(373);
    RandomAccessSparseVector v = new RandomAccessSparseVector(373);
    u.set(24, 0.4526985183337534);
    u.set(55, 0.5333219834564495);
    u.set(54, 0.5333219834564495);
    u.set(53, 0.4756042214095471);

    v.set(57, 0.6653016370845252);
    v.set(56, 0.6653016370845252);
    v.set(11, 0.3387439495921685);

    CosineDistanceMeasure cosineDistanceMeasure = new CosineDistanceMeasure();
    System.out.println(cosineDistanceMeasure.distance(u, v));
}

出力は1.0です。そうではない0.0ですか?

これをの出力と組み合わせると、cosineDistanceMeasure.distance(u, u)私が探しているのはであることがわかり1 - cosineDistanceMeasure.distance(u, v)ます。しかし、この逆転は私には意味がありません。なぜそれがこのように実装されたのか、何か考えはありますか?それとも私は非常に明白な何かを見逃していますか?

4

1 に答える 1

1

2つのポイントが「近い」場合、原点からのベクトルとして見たときにそれらが形成する角度は小さく、ゼロに近くなります。ゼロに近い角度の正弦は1に近く、角度が90度、次に180度に近づくにつれて正弦は減少します。

したがって、コサインは距離が増加するにつれて減少します。これが、2つのベクトル間の角度の正弦自体が距離メトリックとして意味をなさない理由です。距離計量を作成する「標準的な」方法は1-コサインです。それは適切な指標です。

于 2013-03-08T21:54:53.023 に答える