4

私の目標は、リストから値を取得することにより、f-list ( ) の各値のコサイン類似度を計算f=[[3492.6], [13756.2], [22442.1], [22361.9], [26896.4]]し、リストの残りの値がコサイン距離でどれだけ近いかを計算することです。したがって、結果は 5 つの異なる類似性スコアになるはずです。ただし、何らかの理由で、他のデータセットでコードをテストしても、コサイン類似度として 1.0 を取得し続けます。明らかに、(距離に関して)よりも[22361.9]似ています。以下のコードを参照してください。[22442.1][13756.2]

import numpy.linalg as LA
import numpy as np
import sys

f=[[3492.6], [13756.2], [22442.1], [22361.9], [26896.4]]
cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 2)
for c in f:
     for i in f:
        cosine=cx(c, i)
        print cosine

何か案は?よろしくお願いします。

4

2 に答える 2

0

あなたの「ベクトル」はすべてスカラーであるため、すべてコサイン類似度が 1.0 になります。スカラーは 1 次元空間の唯一の軸に沿ったベクトルと考えることができ、コサイン類似度は 2 つのベクトル間の角度に基づいています。1 次元空間では、「ベクトル」間の角度は常に 0 であるため、この比較に関してはすべての「ベクトル」が非常に類似しています。

代わりに多次元ベクトルを使用します。

f = [ [3492.6, 2134.1],
      [13756.2, 243234.3],
      [22442.1, 23424.0],
      [22361.9, 23482.4],
      [26896.4, 126875.4] ]

出力:

1.0
0.57
0.97
0.97
0.69
0.57
1.0
0.76
0.76
0.99
0.97
0.76
1.0
1.0
0.85
0.97
0.76
1.0
...

このリストの残りの 1.0 値は、ベクトルをそれ自体と比較する場所からのものであるため、これらをスキップすることをお勧めします (結果は常に 1.0 になるため)。

于 2013-07-29T08:24:45.017 に答える
0

ここでの問題は、間違った類似性メトリックを使用しようとしていることです。コサイン類似度は、2 つのベクトルの方向の類似性を測定します。あなたの場合のように、それらがすべて一次元であるため、同じ方向を持っている場合、結果は常に 1 になります。式を一次元ベクトルに適用しようとすると、これを簡単に確認できます。

于 2013-07-29T08:09:48.060 に答える