10

コサイン類似度の表現方法 ( http://en.wikipedia.org/wiki/Cosine_similarity )

ベクトルの 1 つがすべてゼロの場合は?

v1 = [1, 1, 1, 1, 1]

v2 = [0, 0, 0, 0, 0]

古典的な公式に従って計算すると、ゼロ除算が得られます。

Let d1 = 0 0 0 0 0 0
Let d2 = 1 1 1 1 1 1
Cosine Similarity (d1, d2) =  dot(d1, d2) / ||d1|| ||d2||dot(d1, d2) = (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) = 0

||d1|| = sqrt((0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2) = 0

||d2|| = sqrt((1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2) = 2.44948974278

Cosine Similarity (d1, d2) = 0 / (0) * (2.44948974278)
                           = 0 / 0

この類似性尺度をクラスタリング アプリケーションで使用したいと考えています。そして、そのようなベクトルを比較する必要があることがよくあります。また、[0, 0, 0, 0, 0] 対 [0, 0, 0, 0, 0]

経験はありますか?これは類似性 (距離ではない) の尺度であるため、特殊なケースを使用する必要があります。

d( [1, 1, 1, 1, 1]; [0, 0, 0, 0, 0] ) = 0

d([0, 0, 0, 0, 0]; [0, 0, 0, 0, 0] ) = 1

どうですか

d([1, 1, 1, 0, 0]; [0, 0, 0, 0, 0] ) = ? 等

4

2 に答える 2

17

ベクトルが 0 の場合、コサインはアプリケーションにとって不適切な類似関数です

コサイン距離は、L_2 正規化データの 2 乗ユークリッド距離と本質的に同等です。つまり、すべてのベクトルを単位長 1 に正規化し、ユークリッド距離の 2 乗を計算します。

Cosine のもう 1 つの利点はパフォーマンスです。非常にまばらな高次元データでの計算は、ユークリッド距離よりも高速です。線形だけでなく、正方形へのスパース性の恩恵を受けます。

明らかに、類似度をハックして、ちょうど 1 つがゼロの場合は 0 に、それらが同一の場合は最大にしようとすることはできますが、根本的な問題を実際に解決することはできません。

簡単に計算できるもので距離を選択しないでください。

代わりに、結果がデータ上で意味を持つように距離を選択してください。値が定義されていない場合、意味がありません...

場合によっては、定数 0 のデータを意味のないデータとして破棄することでうまくいく場合もあります (たとえば、Twitter のノイズを分析し、すべてが数字で単語が含まれていないツイートを確認するなど)。そうでない場合もあります。

于 2014-11-02T19:34:12.850 に答える