コサイン類似度とピアソン相関
メニューを表示するにはスワイプしてください
コサイン類似度
コサイン類似度は、2つのベクトル間の角度のコサイン値を測定することで、それらの類似度を定量化する指標。 数式で表すと次の通り:
Cosine Similarity = ∑i=1nAi2⋅∑i=1nBi2∑i=1nAiBi
ここで、AおよびBはユーザーまたはアイテムのベクトル。 幾何学的には、コサイン類似度はベクトルの大きさに関係なく、2つのベクトルがどれだけ同じ方向を向いているかを示す。 値が1の場合は同じ方向(最大の類似度)、0の場合は直交(類似度なし)、-1の場合は反対方向を示す。 行動マッチングでは、絶対値よりも嗜好パターンを重視する場合、例えば異なるスケールでアイテムを評価するユーザー同士を比較する際に有用。
ピアソン相関係数
ピアソン相関係数は、2つのベクトル間の線形関係を、データの方向性と平均の両方を考慮して測定する指標。 数式は次の通り:
Pearson Correlation=∑i=1n(Ai−Aˉ)2⋅∑i=1n(Bi−Bˉ)2∑i=1n(Ai−Aˉ)(Bi−Bˉ)
ここで、Aˉ および Bˉ はベクトル A および B の平均値。 ピアソン相関係数は -1(完全な負の線形関係)から 1(完全な正の線形関係)までの範囲を取り、0 は線形関係がないことを示す。 この指標は、例えばあるユーザーが他のユーザーよりも一貫して高いまたは低い評価を付ける場合など、個人のバイアスを除去してユーザーやアイテムを比較したいときに特に有用。
比較
- ベクトルの向きに着目し、平均値や大きさを無視する;
- 多くの評価が欠落またはゼロであるスパースデータに適しているが、ユーザーの評価スケールが体系的に異なる場合、類似度を過大評価する可能性がある。
- 各ベクトルから平均評価を差し引くことで、スケールや基準嗜好の違いに対して堅牢になる;
- ユーザーやアイテムのバイアスを制御したい場合に適しているが、非線形な関係は捉えられない可能性がある。
例:両方の指標の計算
2人のユーザーが4つの商品に評価を付けたとします。それぞれの評価は以下の通りです。
- ユーザー1:
[4, 0, 3, 5] - ユーザー2:
[5, 1, 2, 4]
これらのベクトルに対してコサイン類似度とピアソン相関係数の両方を計算し、行動の類似性を比較できます。
12345678910111213141516171819import numpy as np # User ratings user1 = np.array([4, 0, 3, 5]) user2 = np.array([5, 1, 2, 4]) # Cosine similarity def cosine_similarity(a, b): dot_product = np.dot(a, b) norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) return dot_product / (norm_a * norm_b) cos_sim = cosine_similarity(user1, user2) print(f"Cosine Similarity: {cos_sim:.4f}") # Pearson correlation pearson_corr = np.corrcoef(user1, user2)[0, 1] print(f"Pearson Correlation: {pearson_corr:.4f}")
コードのステップごとの解説
ユーザー評価配列の定義
user1 = np.array([4, 0, 3, 5]);user2 = np.array([5, 1, 2, 4]);
4つの商品に対する各ユーザーの評価をNumPy配列として作成します。これらの配列がユーザーベクトルとなります。
コサイン類似度関数の定義
def cosine_similarity(a, b):
dot_product = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
return dot_product / (norm_a * norm_b)
- ドット積の計算:
dot_product = np.dot(a, b);
2つのベクトルの対応する要素を掛け合わせて合計します。これは両ベクトルがどれだけ同じ方向を向いているかを測定します。 - ノルムの計算:
norm_a = np.linalg.norm(a);norm_b = np.linalg.norm(b);
各ユーザーベクトルの長さ(大きさ)を計算します。ノルムはベクトル要素の2乗和の平方根です。 - 類似度の計算:
return dot_product / (norm_a * norm_b);
ドット積を2つのノルムの積で割ります。結果は2つのベクトル間の角度のコサイン値となり、類似度を示します。
コサイン類似度の計算と出力
cos_sim = cosine_similarity(user1, user2);
print(f"Cosine Similarity: {cos_sim:.4f}");
ユーザーベクトルを関数に渡してコサイン類似度を計算し、小数点以下4桁で結果を出力します。
ピアソン相関係数の計算と出力
pearson_corr = np.corrcoef(user1, user2)[0, 1];
print(f"Pearson Correlation: {pearson_corr:.4f}");
np.corrcoefを使って2つのユーザーベクトルのピアソン相関行列を計算します。位置[0, 1]の値がuser1とuser2の相関係数です。この値を出力することで、平均評価のバイアスを除去した後の評価パターンの線形的な関連性を示します。
1. ユーザーベクトルを比較する際のコサイン類似度とピアソン相関の主な違いは何ですか?
2. 例えば、あるユーザーは常に高評価を付け、別のユーザーは低評価を付けるなど、非常に異なるスケールでアイテムを評価するユーザー同士を比較したい場合、どの指標を選ぶべきですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください