Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ コサイン類似度とピアソン相関 | 協調フィルタリングと行動マッチングシステム
マーケットバスケット分析とレコメンデーションシステム

コサイン類似度とピアソン相関

メニューを表示するにはスワイプしてください

コサイン類似度

コサイン類似度は、2つのベクトル間の角度のコサイン値を測定することで、それらの類似度を定量化する指標。 数式で表すと次の通り:

Cosine Similarity = i=1nAiBii=1nAi2i=1nBi2\frac {\sum_{i=1}^{n} A_i B_i} {\sqrt{\sum_{i=1}^{n} A_i^2} \cdot \sqrt{\sum_{i=1}^{n} B_i^2}}

ここで、AおよびBはユーザーまたはアイテムのベクトル。 幾何学的には、コサイン類似度はベクトルの大きさに関係なく、2つのベクトルがどれだけ同じ方向を向いているかを示す。 値が1の場合は同じ方向(最大の類似度)、0の場合は直交(類似度なし)、-1の場合は反対方向を示す。 行動マッチングでは、絶対値よりも嗜好パターンを重視する場合、例えば異なるスケールでアイテムを評価するユーザー同士を比較する際に有用。

ピアソン相関係数

ピアソン相関係数は、2つのベクトル間の線形関係を、データの方向性と平均の両方を考慮して測定する指標。 数式は次の通り:

Pearson Correlation=i=1n(AiAˉ)(BiBˉ)i=1n(AiAˉ)2i=1n(BiBˉ)2\text{Pearson Correlation} = \frac{\sum_{i=1}^{n} (A_i - \bar{A})(B_i - \bar{B})}{\sqrt{\sum_{i=1}^{n} (A_i - \bar{A})^2} \cdot \sqrt{\sum_{i=1}^{n} (B_i - \bar{B})^2}}

ここで、Aˉ\bar{A} および Bˉ\bar{B} はベクトル A および B の平均値。 ピアソン相関係数は -1(完全な負の線形関係)から 1(完全な正の線形関係)までの範囲を取り、0 は線形関係がないことを示す。 この指標は、例えばあるユーザーが他のユーザーよりも一貫して高いまたは低い評価を付ける場合など、個人のバイアスを除去してユーザーやアイテムを比較したいときに特に有用。

比較

コサイン類似度
expand arrow
  • ベクトルの向きに着目し、平均値や大きさを無視する;
  • 多くの評価が欠落またはゼロであるスパースデータに適しているが、ユーザーの評価スケールが体系的に異なる場合、類似度を過大評価する可能性がある。
ピアソン相関係数
expand arrow
  • 各ベクトルから平均評価を差し引くことで、スケールや基準嗜好の違いに対して堅牢になる;
  • ユーザーやアイテムのバイアスを制御したい場合に適しているが、非線形な関係は捉えられない可能性がある。

例:両方の指標の計算

2人のユーザーが4つの商品に評価を付けたとします。それぞれの評価は以下の通りです。

  • ユーザー1: [4, 0, 3, 5]
  • ユーザー2: [5, 1, 2, 4]

これらのベクトルに対してコサイン類似度とピアソン相関係数の両方を計算し、行動の類似性を比較できます。

12345678910111213141516171819
import 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. 例えば、あるユーザーは常に高評価を付け、別のユーザーは低評価を付けるなど、非常に異なるスケールでアイテムを評価するユーザー同士を比較したい場合、どの指標を選ぶべきですか?

question mark

ユーザーベクトルを比較する際のコサイン類似度とピアソン相関の主な違いは何ですか?

正しい答えを選んでください

question mark

例えば、あるユーザーは常に高評価を付け、別のユーザーは低評価を付けるなど、非常に異なるスケールでアイテムを評価するユーザー同士を比較したい場合、どの指標を選ぶべきですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  2

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  2
some-alt