マイリストから動画を推薦する
問題設定
マイリストの集合$ \mathcal{L} = \{l_1,l_2,\dots,l_n\}
動画の集合$ \mathcal{V} = \{v_1,v_2\dots v_m\}
マイリスト$ l_iが与えられたとき,そのマイリストに入れるべき動画を$ p件取得したい
他の人も入れている動画を$ p件取得する.
マイリストはいくつかの動画の集合として考えられる.
すなわち,$ l_i = \{v_{i,1},v_{i,2},\dots,v_{i,k_i}\}
明らかに$ k_i \leq |\mathcal{V}|
すなわち$ J_{i,j}=\frac{|l_i \cap l_j|}{|l_i \cup l_j|}
マイリスト$ l_iに含まれないが$ l_jに含まれる動画の集合を$ l_j - l_iと表す.
すなわち,$ l_j - l_i = \{v_n \mid v_n \notin l_i, v_n \in l_j\}
マイリスト$ l_iに含まれない動画すべての集まりを$ l_i' = \mathcal{V} - l_iと表す.
ここで,$ l_i' = \{ v'_{i,1}, v'_{i,2}, \dots, v'_{i,k_i}\}とする.
動画$ v'_{i,h}を$ l_j - l_iに含むすべての$ l_jの集合を$ \mathcal{L}_{i,h}と表す.
$ \mathcal{L}_{i,h} = \{ l_j \mid v'_{i,h} \in l_j, l_j \in \mathcal{L}\}
後述の理由でこれを素朴に実装することは推奨されない.
動画$ v'_{i,h}の推薦度$ r(v'_{i,h})を以下で定める.
$ r(v'_{i,h}) = \sum^{l_i}_{\mathcal{L_{i,h}}} f(J_{i,j})
ただし,$ fは$ J_{i,j}を重み付ける関数とする.
例えば(このうちどれ(あるいはどの組み合わせ)が有効なのかは要検討)
$ f_o(J_{i,j}) = 1(定数関数)
$ f_1(J_{i,j}) = J_{i,j}(恒等関数)
$ f_2(J_{i,j}) = \frac{1}{1 - J_{i,j}}(強烈に重み付ける)
実験したところこれを入れないと全然まともに推薦が働いてくれなかった
今$ l'_iのすべての要素に対して推薦度を計算する.
$ r(v'_{i,1}), r(v'_{i,2}), \cdots, r(v'_{i,k_i})
$ rの値が大きい順に$ p件動画を取得する.
ただし,
$ \mathcal{L}_{i,h}を素朴に実装しようとすると$ l_j \in \mathcal{L}では多すぎる
$ l_iが含んでいない動画$ v'_{i,h}を含むマイリストをすべて取ってこようとしてしまう.
推薦度が非常に大きくなってしまう
計算量が増える.
対策として,似てる傾向のあるマイリストからに絞る.
実際はこのようにするべきだろう.
$ l_iとのJaccard係数が大きい順にマイリストを$ q件集めた集合$ \mathcal{L}^i \sube \mathcal{L}として,
$ \mathcal{L}_{i.h} = \{ l_j \mid v'_{i,h} \in l_j, l_j \in \mathcal{L^i} \}として推薦度を計算する.
$ \mathcal{L}^iは,$ l_iが含んでいない動画$ v'_{i,h}を含むマイリストで,特に$ l_iと近いマイリストの集合.
あるいは,
$ l_i'の定義を変える方法もある
やはり$ l_iとのJaccard係数が大きい順にマイリストを$ q件集めた集合$ \mathcal{L}^iとする.
$ l_i' = \bigcup_{\mathcal{L}^i}l_j - l_iとする
$ l_iと近いマイリストが含む動画の和集合に領域を絞る
こうすれば上の手順はいらなくなる
ただし網羅性は減る.
どちらをとっても(もしかしたらどちらも取ればいいか),$ qを適切な値にバランスする必要がある.
$ qが$ |\mathcal{L}|に近ければ近いほど推薦度はあまり当てにならなくなる(と思う)
実験の例
https://gyazo.com/26443605a786d681dab3a46bc32dc83f
$ f(J_{i,j}) = \frac{1}{1 - J_{i,j}}として雑に算出