🎓 レベル:標準 | 重要度:A(必須)
📎 前提:二部ネットワークと射影・リンク予測 | 関連:ランダムウォークと拡散の数理
要点(BLUF)
- 推薦は「ユーザー×アイテムの二部ネットワーク(二部ネットワークと射影)で、まだ無いエッジを予測する」リンク予測問題として捉えられる。
- 協調フィルタリング:共起(同じユーザーに買われた/同じアイテムを買った)から類似度を測り、好みを推定する。
- ここではネットワーク的な構造を扱う。行列分解・深層学習・GNN といった学習手法は機械学習のturf(薄リンク)。
概念:推薦はネットワーク上のリンク予測
「あなたへのおすすめ」は、ユーザーとアイテムを結ぶ二部ネットワーク(二部ネットワークと射影)の上で、「このユーザーとこのアイテムの間に、将来エッジ(購入・評価)が現れるか」を当てる問題 — つまりリンク予測(リンク予測)です。ネットワーク科学の視点では、推薦は学習アルゴリズムである前に関係構造の問題。その構造を押さえることが土台になります。
協調フィルタリングの構造
**協調フィルタリング(collaborative filtering)**の発想は2つ。
- ユーザーベース:似た購買履歴のユーザーが買った物を薦める。ユーザー射影(二部ネットワークと射影 の )の近傍を使う。
- アイテムベース:あるアイテムとよく一緒に買われる物を薦める。アイテム射影()の共起を使う。
どちらも「共起=関係の強さ」という射影の重みを類似度とみなしています。アイテム の共起は
「アイテム と を両方買ったユーザー数」。これが大きいほど2つは似ているとみなし、ユーザーが片方を買ったらもう片方を薦めます。
コードで確認
import numpy as np
# 5ユーザー × 4アイテム の購買行列(1=購入)
R = np.array([
[1,1,0,0],
[1,1,1,0],
[0,1,1,0],
[0,0,1,1],
[1,0,0,1],
])
cooc = R.T @ R # アイテム共起 = 列の内積
print("アイテム共起行列:")
print(cooc)
# ユーザー0(アイテム0,1を購入)への推薦
user = 0
bought = [int(i) for i in np.where(R[user] > 0)[0]]
scores = {item: int(sum(cooc[item, b] for b in bought))
for item in range(R.shape[1]) if item not in bought}
print(f"ユーザー{user}(購入: {bought})への推薦スコア:", scores)
print("最も推薦すべきアイテム:", max(scores, key=scores.get))
実行結果:
アイテム共起行列:
[[3 2 1 1]
[2 3 2 0]
[1 2 3 1]
[1 0 1 2]]
ユーザー0(購入: [0, 1])への推薦スコア: {2: 3, 3: 1}
最も推薦すべきアイテム: 2
(注:共起行列の対角はアイテムの総購入数。)ユーザー0はアイテム0と1を購入済み。未購入のアイテム2は「0や1と一緒に買われた回数」が3で、アイテム3の1より高い。だってアイテム1と2を一緒に買った人(ユーザー1,2)がいるからです。よってアイテム2を推薦 — 共起という関係構造だけから好みを推定できました。
ネットワークとしての推薦
graph LR
subgraph 二部ネットワーク
U["ユーザー"] --- I["アイテム"]
end
二部ネットワーク -->|"射影"| Sim["アイテム類似度(共起)"]
Sim -->|"リンク予測"| Rec["未購入エッジを推薦"]
二部ネットワーク -.->|"ランダムウォーク"| RW["パーソナライズPageRank"]
ランダムウォーク(ランダムウォークと拡散の数理)の視点も強力で、ユーザーから出発したパーソナライズドPageRankで「たどり着きやすいアイテム」を推薦する手法(例:Pixie)も実用されています。
数式の直観的意味
協調フィルタリングが効くのは、「好みは関係構造に埋め込まれている」からです。あなたが何を好むかを直接知らなくても、「あなたと似た人」「あなたが好きな物と一緒に消費される物」という間接的な関係から推定できる。共起行列 はその関係の強さを数えたもので、リンク予測の共通近傍スコア(リンク予測)と同じ「共有する相手が多いほど似ている」原理です。ここから先 — 疎な行列を埋める行列分解、非線形な好みを捉える深層学習やGNN — は機械学習のturfで、ネットワーク科学はその構造的土台を提供します。
⚠️ よくある誤解・落とし穴
- 人気バイアス:共起は人気アイテムを過大評価する。誰もが買う定番ばかり薦めてしまう。重みの正規化(TF-IDF的補正)が要ります。
- コールドスタート:新規ユーザー・新規アイテムは共起がゼロで推薦できない。内容ベースとの併用が必要。
- 「推薦=機械学習」と早合点しない:学習手法の前に、二部構造・共起・リンク予測という関係の枠組みがある。そこを飛ばすと評価設計を誤ります。
対応シミュレーション
本文のコードがそのまま検証用です。行列分解・GNN による推薦は機械学習へ(薄リンク)。
関連
- 前提:二部ネットワークと射影・リンク予測
- ランダムウォーク推薦:ランダムウォークと拡散の数理
- 上位ハブ:応用と実データ解析 目次