協調フィルタリング シミュレーター 戻る
機械学習

協調フィルタリング シミュレーター

通販サイトの「この商品を買った人はこちらも買っています」を支える推薦アルゴリズム、協調フィルタリングを体験するツールです。評価行列・近傍数・類似度指標を変えると、ユーザーベース協調フィルタリングがある人の未知の評価をどう予測するか、誰が「趣味の近いユーザー」になるかがリアルタイムで分かります。

パラメータ設定
ユーザー数
評価行列の行数(仮想ユーザー)
アイテム数
評価行列の列数(仮想アイテム)
近傍ユーザー数 k
予測に投票させる「似たユーザー」の人数
類似度の指標
ユーザー同士の「趣味の近さ」の測り方
評価行列の疎度
%
「未評価(空欄)」にするセルの割合
計算結果
予測評価値
実際の評価値(隠した正解)
予測誤差(絶対)
最近傍ユーザーの類似度
評価行列の疎度 (%)
予測の判定
評価行列とユーザー × アイテムの可視化

行がユーザー、列がアイテム。セルの色が評価値(1〜5)、ハッチングが未評価セルです。黄枠が予測対象セル、青枠が選ばれた近傍ユーザーの行を示します。

予測誤差 vs 近傍数 k
各ユーザーの対象ユーザーへの類似度
理論・主要公式

$$\hat r_{u,i}=\bar r_u+\frac{\sum_{v\in N}\text{sim}(u,v)\,(r_{v,i}-\bar r_v)}{\sum_{v\in N}|\text{sim}(u,v)|}$$

ユーザー $u$ のアイテム $i$ への予測評価 $\hat r_{u,i}$。$N$ はアイテム $i$ を評価した中で最も類似度の高い $k$ 人の集合、$\bar r_u$ はユーザー $u$ の平均評価です。

$$\text{cos}(u,v)=\frac{\sum_{j} r_{u,j}\,r_{v,j}}{\sqrt{\sum_j r_{u,j}^2}\,\sqrt{\sum_j r_{v,j}^2}}$$

コサイン類似度。$j$ は $u$ と $v$ が共通して評価したアイテムを走ります。2人の評価ベクトルのなす角が小さいほど 1 に近づきます。

$$\text{pear}(u,v)=\frac{\sum_{j}(r_{u,j}-\bar r_u)(r_{v,j}-\bar r_v)}{\sqrt{\sum_j(r_{u,j}-\bar r_u)^2}\,\sqrt{\sum_j(r_{v,j}-\bar r_v)^2}}$$

ピアソン相関。各ユーザーの平均評価を引いてから相関を取るため、採点の甘い・辛いのクセを補正できます。

協調フィルタリングとは

🙋
通販サイトでよく見る「この商品を買った人はこちらも買っています」って、どういう仕組みで出てるんですか?商品の中身を AI が読んでるんですか?
🎓
いいや、それがおもしろいところで、あの「協調フィルタリング」というアルゴリズムは商品の中身をまったく見ていないんだ。映画なら「これはSF」「主演は誰」みたいな情報を一切使わない。代わりに使うのは「みんなが過去に付けた評価のパターン」だけ。要するに、人の好みの集合知で推薦しているんだよ。
🙋
えっ、中身を見ないで、どうやって「あなたへのおすすめ」が分かるんですか?
🎓
ざっくり言うと「あなたと趣味の近い人を探して、その人の意見を借りる」んだ。まず、過去の評価の付け方があなたとよく似ている人——いわば「趣味の隣人」を見つける。次に、その隣人たちがある商品に高評価を付けているなら、あなたもたぶん気に入るだろう、と予測する。左の評価行列を見てごらん。行がユーザー、列がアイテムで、色がその人の評価。黄色い枠のセルが「今から予測したい未知の評価」だ。
🙋
なるほど!その「趣味が近い」って、具体的にどう測るんですか?
🎓
2人が共通して評価したアイテムを並べて、評価の付き方がどれだけ揃っているかを数値化する。代表的なのが「コサイン類似度」——2人の評価ベクトルのなす角を見る方法だ。もう一つの「ピアソン相関」は、各自の平均点を引いてから比べる。これだと「全部に甘く5を付ける人」と「辛口で2ばかり付ける人」のクセを補正できる。左のセレクトボックスで切り替えると、青枠で選ばれる近傍ユーザーが変わるのが分かるよ。
🙋
近傍数 k のスライダーを動かすと予測値が変わりますね。k は大きいほど良いんですか?
🎓
それが一概には言えないんだ。k は「予測に投票させる隣人の人数」。k=1 だと一番似た1人だけで決めるから、その人がたまたま変な評価をしていると予測が大きく外れる。逆に k を増やしすぎると、そんなに似てない人まで投票に加わって予測がぼやける。だから「予測誤差 vs 近傍数 k」のグラフで、誤差が一番小さくなる k を探すんだ。実務では交差検証という手続きで最適な k を決めるよ。
🙋
「疎度」のスライダーを70%まで上げたら、予測がかなり外れました。これは何が起きてるんですか?
🎓
それこそが協調フィルタリングの最大の弱点、「スパース性(疎性)」だ。現実の評価行列は99%以上が空欄なんだよ。みんな見た商品のほんの一部にしか評価を付けないからね。空欄が多いと、任意の2人が「共通して評価したアイテム」が極端に少なくなって、類似度を信頼できるほど計算できない。新規ユーザーに至っては評価ゼロで誰とも比べられない——これが「コールドスタート問題」だ。疎度を上げると、まさにこの困難をシミュレートしていることになる。

よくある質問

コンテンツベース推薦は「アイテムそのものの中身」(映画ならジャンル・出演者、商品なら素材・価格)を特徴量として使い、あなたが過去に好んだものと似た中身のアイテムを薦めます。協調フィルタリングはアイテムの中身を一切見ません。代わりに「過去の評価パターン」だけを使い、あなたと評価の傾向が似た他のユーザー(趣味の近いユーザー)を見つけ、その人たちの評価から予測します。中身を知らなくても推薦できるのが協調フィルタリングの強みです。
コサイン類似度は2人の評価ベクトルのなす角だけを見るため、計算が単純で実装しやすい指標です。ピアソン相関は各ユーザーの平均評価を引いてから(平均中心化してから)相関を取るため、「全体に甘く点を付ける人」と「辛口の人」の評価のクセを補正できます。辛い人・甘い人が混在する実データではピアソン相関のほうが精度が出やすい一方、共通評価が少ないと相関が不安定になりやすい弱点もあります。本ツールでは両方を切り替えて結果を比較できます。
近傍数 k は「予測に投票させる似たユーザーの人数」です。k を小さくすると、ごく一部の非常に似たユーザーだけで予測するため、その人が外れ値だと予測も大きくぶれます。k を大きくすると多数決で安定しますが、あまり似ていないユーザーまで投票に加わって予測がぼやけます。実務では交差検証で予測誤差が最小になる k を探します。本ツールの「予測誤差 vs 近傍数 k」グラフで、誤差が最小になる k を目で確認できます。
コールドスタート問題は、新規ユーザーや新規アイテムには過去の評価が全く無いため、類似度を計算する手がかりがなく推薦できない問題です。スパース性(疎性)は、実際の評価行列の99%以上が空白だという問題です。ユーザーは見た商品のごく一部にしか評価を付けないため、任意の2人が共通して評価したアイテムが極端に少なく、類似度を信頼できるほど計算できません。協調フィルタリングの精度を左右する最大の現実的課題がこの2つです。

実世界での応用

EC・通販サイトの商品推薦:Amazon が広めた「この商品を買った人はこちらも買っています」は、協調フィルタリングの最も有名な応用です。膨大な購買履歴という巨大な評価行列から、あなたと似た購買パターンを持つ人を探し、その人がよく買う商品を提示します。商品説明文を読まなくても推薦できるため、書籍・家電・食品など中身がまったく異なるカテゴリにそのまま使えるのが強みです。

動画・音楽のストリーミング配信:Netflix のレコメンド、Spotify の「Discover Weekly」などは、視聴・再生履歴を評価行列とみなした協調フィルタリングを核にしています。Netflix が2006年に開催した「Netflix Prize」コンペは、予測誤差をわずか10%改善するチームに100万ドルを賭けたもので、行列分解(Matrix Factorization)という現代的な手法が一気に普及するきっかけになりました。

SNS・コミュニティの「知り合いかも」:友達申請の推薦やフォロー推薦も、ユーザー同士のつながりパターンを評価行列の代わりに使った協調フィルタリングの一種です。「あなたと共通の友達が多い人」「似たアカウントをフォローしている人」を見つけて提示します。アイテムの中身ではなく関係性のパターンだけで動く、という協調フィルタリングの発想がそのまま生きています。

ニュース・求人・広告のマッチング:ニュースアプリの記事配信、求人サイトの「あなたへのおすすめ求人」、広告のターゲティングなどでも使われます。クリック・応募・滞在時間といった暗黙的なフィードバックを評価値とみなすことで、ユーザーが明示的に星を付けなくても協調フィルタリングを回せます。実サービスの多くは協調フィルタリングとコンテンツベースを組み合わせたハイブリッド推薦を採用しています。

よくある誤解と注意点

まず大きな誤解が、「協調フィルタリングは人気のものばかり薦める公平なアルゴリズムだ」というものです。実際には逆で、評価の多い人気アイテムほど多くのユーザーと共通点を持ちやすく、ますます推薦されやすくなります。これを「人気バイアス」や「フィルターバブル」と呼びます。新作や少数派の良作は評価が少ないため推薦に乗りにくく、放置すると「売れ筋がさらに売れる」偏りが強まります。実務では、人気度で重みを下げる、あえて意外性のあるアイテムを混ぜるなど、多様性を確保する工夫が欠かせません。

次に、「類似度が高ければ予測も正確だ」と思い込むこと。本ツールで疎度を上げると体感できますが、共通評価がたった1〜2件しかない2人の類似度は、偶然そう見えているだけかもしれません。共通アイテムが1件だとコサイン類似度は常に1になってしまいます。実務では「共通評価が一定数以上ある相手だけを近傍に採用する」「共通数が少ないペアの類似度を割り引く(Significance Weighting)」といった処置を入れます。類似度の数値そのものより、それが何件の共通評価に支えられているかを必ず確認してください。

最後に、「協調フィルタリングだけで推薦システムは完成する」という過信です。協調フィルタリングはコールドスタート問題に弱く、新規ユーザー・新規アイテム・誰も評価していないニッチなアイテムをうまく扱えません。また評価行列が巨大になると、全ユーザーペアの類似度計算が重くなりスケーラビリティが課題になります。現実の推薦システムは、コンテンツベース推薦、行列分解、深層学習モデルなどを組み合わせ、さらに評価の水増し(シリングアタック)への対策まで含めた総合設計で初めて実用になります。本ツールはその出発点となる「素朴な協調フィルタリング」の直感を養うものだと考えてください。

使い方ガイド

  1. ユーザー数(10~500人)と商品数(5~200点)を設定して評価行列を生成します
  2. 近傍数k(3~20)を選択し、類似度指標(コサイン類似度またはピアソン相関係数)を決定します
  3. 疎度パラメータ(5~95%)を調整して、観測済み評価の割合を変え、欠損値がある現実的な状況をシミュレートします
  4. シミュレーション実行ボタンを押すと、対象ユーザーの未評価商品について予測評価値を計算し、隠された正解値との誤差(MAE)と最近傍ユーザー群の類似度スコアがリアルタイム表示されます

具体的な計算例

ユーザー数200人、商品数50点、k=5、コサイン類似度、疎度80%の設定で実験します。評価行列内に顧客Aの評価が15点観測済み、商品#42の評価は未観測とします。システムは類似度が高い5ユーザー(類似度0.87~0.92)の商品#42評価(4.2点、3.8点、4.5点、3.9点、4.1点)の加重平均を計算し、予測評価値4.1点を算出します。実際の隠し正解が4.3点の場合、予測誤差(絶対値)は0.2ポイントとなり、精度は高い判定です

実務での注意点