1

2 つのベクトル間のコサイン類似度を見つけるにはどうすればよいですか? ベクトルの各要素の範囲は異なりますか? たとえば、各ベクトルにはV = {v[0], v[1]}{age, height} などの 2 つの要素があり、年齢は 30 から 70 の範囲で、身長の範囲は 100cm から 200cm で、2 つのベクトルの例v1 = {20, 175}, v2 = {35,192}が示されています。

simコサイン類似度 ( ) は として定義されていることを知っていますsim = (v1 dot v2 ) / (|v1| * |v2|)。ここで、ドットは v1 と v2 の間のドット積 |v| です。ベクトルの大きさです。ただし、これは、ベクトル V の各要素が同じ範囲のデータを持つという仮定に基づいており、ここで使用した場合のように、各要素が異なる範囲を持つ場合には適用されません。

私が考えることができる 1 つのことは、ベクトルのW = {w[0],w[1]}各要素を正規化するために、ここで各ベクトル v1 と v2 に重みベクトルを適用することです。

あれは

weighted_sim = ( sum (w[i] * v1[i] * v2[i]) )  / sqrt ( (sum (w[i] *v1[i]^2 ) ) * ( sum (w[i] *v2[i]^2 ) ) )

しかし、ここで重みベクトル W を把握するのは困難です。

誰かがここで私を助けてくれますか? どうもありがとう。

4

2 に答える 2

1

標準化後かもしれませんが、それには 2 つの入力ベクトルよりも多くのデータが必要です。重み付けは、機能の 1 つ (私はこれらを 2 つの機能と見なしています) の重要度を他の機能よりも高く/低くしたい場合に適用されます。

例として、標準化を適用するために(整数ステップで)全範囲を人為的に考慮し、単一の例を正規化および手順なし(つまり、データで何もしない)と比較しました。結果は次のとおりです。

(standardization) Similarity: 0.744599          Data: (-1.12599, 0.88339), (-0.259844, 1.47232).
(  normalization) Similarity: 0.978736          Data: (0.166667, 0.75), (0.416667, 0.92).
(           none) Similarity: 0.997788          Data: (20, 175), (35, 192).

標準化を使用した結果は、少なくとも私には理にかなっています。

上記を生成するためのサンプル基本コードを次に示します。

import numpy

def cosine_dist(a, b): # Similarity between a and b
    return sum(a * b) / ((sum(a ** 2) * sum(b ** 2)) ** 0.5)


age_range = [10., 70.]
height_range = [100., 200.]

# Input.
age = numpy.array([20, 35])
height = numpy.array([175, 192])

# Normalization
age_n = numpy.array(age, dtype=float)
height_n = numpy.array(height, dtype=float)
age_n = (age_n - age_range[0]) / (age_range[1] - age_range[0])
height_n = (height_n - height_range[0]) / (height_range[1] - height_range[0])

# Standardization.
all_age = numpy.array(range(*map(int, age_range)))
all_height = numpy.array(range(*map(int, height_range)))
age_s = numpy.array(age, dtype=float)
height_s = numpy.array(height, dtype=float)
age_s = (age_s - all_age.mean()) / all_age.std()
height_s = (height_s - all_height.mean()) / all_height.std()

for name, a, h in [('standardization', age_s, height_s),
        ('normalization', age_n, height_n), ('none', age, height)]:

    data = numpy.array([(a[0], h[0]), (a[1], h[1])])
    data_s = '(%g, %g), (%g, %g)' % (data[0][0], data[0][1], data[1][0], data[1][1])
    print "(%15s) Similarity: %g\t\tData: %s." % (name, cosine_dist(*data),
            data_s)
于 2013-01-10T03:59:55.447 に答える
1

両方の測定値を [0,1] の範囲に正規化するだけです。したがって、正規化された年齢は になり(real_age-30)/(70-30)、正規化された身長は になります(real_height-100)/(200-100)。あなたの例のベクトルV1の年齢は 20 歳で、指定した範囲外であることに注意してください。

これらの計算では、単純な乗算によって生データに適用できる重みは得られません。最初に正規化されたベクトルを計算し、次にそれらの間のベクトルの類似性を計算します。

于 2012-07-10T10:40:38.503 に答える