本日はレコメンデーションやります。大昔にチラッと見たんですけどあの頃は興味がなくて全然してませんでした。ということで気が向いたのでやってみます。MFをメインに3つの手法を紹介します。発展版は次回の記事にします。
まずは用語からまとめます。どうやらレコメンデーションには2種類があるようです。
Recommendation System

- User Based Recommender Systems
- Item Based Recommender Systems
- [ USER x ITEM ] 行列を作成
- USER間の似ている具合を計算
- 似ているUSERを選択
- そのUSERの過去の経験からレコメンド

他にも購入履歴だったり、欲しい物リストとかですね。
ただ、このユーザーベースはたとえば年齢の変化につれて趣味も変わりますし、環境によっても変わりますよね。そこでアイテムベースという考え方を紹介します。これは先ほどとステップはほぼ同じですが異なる点は距離の対象です。先ほどはユーザー間の距離を測りましたが今回はアイテム間の距離を測ります。なのでたとえば相関をとって同じようなラーメンをレコメンドしようといった流れです。
なので動画のratingやジャンルはこちらにあたります。(ratingがこっちにくるのはイマイチふに落ちませんが)
もちろん長所と短所はそれぞれあります。ここでは一部だけ紹介します。詳しくは次のリンクへどうぞ。
行列のサイズをイメージすればわかりますが例えばアイテムが少なければコンテンツベースの方がいいです、逆にアイテムについて事前知識がなければ(ラーメンの具材など)ユーザーベースの方がいいのは自明でしょう。
ではこのくらいにして今回扱う3つの手法を簡単に説明します。他にも強強な手法がありますがまだよくわかっていないので次の記事で深入りできればなと思います。今回は触りです。
データ
その前にデータの説明ですが
Correlationをとるだけの作戦
まず一つ目はcorrelationをとる方法です。映画同士の相関を計算して同じような映画をレコメンドする作戦です。簡単すぎるのでスキップします。SVDを使う作戦
二つ目はSVDを用いて潜在的な特徴を作成し、それを使って未知のratingを計算してレコメンドする作戦です。

まず注目してほしいところは

次に



分解後に行列の積を取ることで未知のratingを計算して映画をレコメンドする手法です。計算については次のmfの方がわかりやすいのでそちらで解説します。ちなみにSVDは自然言語処理でもつかわれます。
ただ、勘のいい人なら気づくと思いますが今回の行列ってかなりスパースなんですよね。SVDはスパースだとよくないらしい。そこで強強のMFが登場するわけです。
Matrix Factorizationを使う作戦



これはMatrix Factorizationというアルゴリズムですがこれが凄すぎたので解説します。
もともとネットフリックスの映画のレコメンドのコンペがあったようで、その優勝者が提案したアルゴリズムらしいです。

MFのアルゴリズムは単純です。勾配法を使ってユーザー行列、アイテム行列を更新していき、元の行列Xに近似しようというものです。なので上の図で目的がそれぞれの行列の最小化になっています。(

で、このままやってもいいんですけど、正規化項を付与しちゃいます。




まとめますと
