【推薦システム】レコメンドアルゴリズムまとめ①【入門/協調フィルタリング/NMF】

# 協調フィルタリング
* 一言で表すと、ユーザーの行動履歴に基づいた推薦アルゴリズム。
* メモリベースの手法とモデルベースの手法の二種類があります。

## メモリベース手法
ユーザ間の類似性やアイテム間の類似性に着目して推薦を生成する手法です。
このうち、さらにユーザーベースの手法とアイテムベースの手法に分類されます。

### 特徴
* ドメイン知識を必要としない(商品の内容を知らなくてもレコメンドできる)
* 異なるジャンルをまたいだ推薦ができる
* 利用者が多い場合に有利
* 推定の都度全データに対して計算を行う(類似度を計算する)アプローチをとるのでデータのサイズに比例して計算コストが高くなる。

### ユーザーベース 
対象となるユーザーと類似した嗜好を持つユーザーのグループを調べることによって、各ユーザーに適したレコメンデーションを提供する手法です。

* **メリット**
    * アルゴリズムがシンプル、データセットが頻繁に変更されても対応できる。

* **デメリット**
    * 巨大なデータセットを用いると時間がかかる。ユーザ（製品）が増えるほど時間がかかる。

**(補足)代表的なユーザーの類似度を評価する方法**

* ピアソン相関係数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/e5a01d9f-93e7-e9fb-7273-2015d0f6d972.png)


いわゆる相関係数というやつ。ユーザー同士の線形な関係が強いほど大きな値をとり、ユーザー同士の類似度を図ることができる。

* コサイン類似度
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/cb9983b6-356f-fd6c-3f79-e265fb20c486.png)

ユーザー同士の評価ベクトル r  (あるユーザーのそれぞれのアイテムに対する評価値を表現したベクトル)の類似度をベクトルのなす角の余弦の値によって評価する。

* その他
    * 強制ピアソン相関係数
    * スピアマン相関係数
    * ケンドールのτ相関係数
    * 調整済みコサイン類似度

### アイテムベース
あるユーザーのアイテムに対する評価値をそのアイテムと似ているアイテムに付けられた評価値を利用して予測する手法です。Amazonで採用されているらしい。
**類似度の計算をオフラインで行うことでスケーラビリティを確保している。**

* **メリット**
    * 疎なデータセットに対して性能が優れている（高速）。
    * 事前に共起情報をチェックすることで計算時間を短縮することが可能

* **デメリット**
    * アイテムの類似度のディクショナリの管理をする必要がある。
    * すべてのユーザーに同じ商品が推薦される。

### 推薦手順
1. ユーザーの嗜好データを取得する(ユーザー×アイテム行列)
2. 1で得た嗜好データに基づいてユーザー間の類似度を計算
3. ターゲットのユーザーに対して似ているユーザーを抽出
4. 似ているユーザーが購入している商品をレコメンド

## モデルベース手法
決定木、ルールベース推論、ナイーブベイズ分類器、行列因数分解技術などの機械学習やデータマイニング技術を用いて、対象となるユーザーに適したアイテムを予測する手法です。**メモリベース手法が蓄積したデータを推薦時に直接用いて予測するのに対して事前に調べておいたデータの規則性(モデル)を使って予測します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/b117f0d6-40f9-e258-718d-eb7ed27650f5.png)


## Cold Start問題

### とは？
協調フィルタリング手法ではメモリベースでは特に、ユーザーとアイテムの嗜好に関するデータがある程度集まらないと有意な推薦ができないという問題が生じます。ユーザーがアイテムを評価しないと協調フィルタリングでは新しいユーザーにアイテムを推薦したり新しいアイテムをユーザーに推薦することができません。

### 対処方法
* **新規ユーザーに対して**
    * 新規ユーザーの属性(性別や年齢などの特徴)を用いて似ているユーザーが過去に高い評価を与えたアイテムをおすすめする。

* **新規アイテムに関して**
    * 新規アイテムの属性(カテゴリや値段などの特徴)を用いて似ているアイテムに高い評価を与えたユーザーに新規アイテムをおすすめする方法。

* **その他参考事例**
    * LINE( https://logmi.jp/tech/articles/322247)
    * バンディットアルゴリズムとよばれる手法を用いてユーザーの行動ログ・行動パターンが不足している新しいアイテムの推薦にデータを取得して予測精度を上げることと一番良いアイテムを選ぶことの2つを同時に行うとで高性能な推薦を実現してる様子


# 特異値分解(SVD)

## とは？
* スパースな行列を密な表現に変換する次元削減手法の一つ。
* 以下のように m × n の行列 A を三つのベクトルに分解します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/742ced81-6705-a976-d7cd-e31309bc1430.png)

詳細に書くと以下のようになります。(以下では次元数は r ⇒nとなっている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/652cacb8-63bd-17b1-b79b-cafaedc099a9.png)

ここでU、Vはそれぞれ直交行列(転置行列がそのまま逆行列になるような行列)であり、Γは対角成分上に上か降順で特異値と呼ばれる値が並んでいる正方行列です。

* U,Vの列ベクトルをそれぞれ**左特異ベクトル、右特異ベクトル**と呼ぶ。
* 行列Aの特異値の二乗 = 行列AAT 、ATAの固有値が成立
* 分解の方法には一般に以下の二つがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/fb621271-4ed0-7fb0-5ff2-a903751e2e20.png)



(2)の表記では 0 を特異値に入れてΓをm×mの形に成型し,0の特異値の分の得意ベクトルをそれぞれU,Vに追加している。
(3)でも同様に０を特異値に入れるがこちらではΓをm × n に成型しています。追加した０の特異値の分の特異ベクトルをそれぞれU、Vに追加しています。
(2),(3)いずれもグレーの部分はかけ合わせて0 になるのでΓの成型方法の選択による実質的な影響はありません。

## どう使うのか? 
* 降順に並んでいる特異値のうち、任意の上位n個だけについて行列積を計算する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/e1ec87f0-c1cb-17c6-45d6-0dbce57a4f4e.png)


上の画像であれば、k個の特異値のうち上から l 個(上図の濃い青)についてだけ考えると U はm × l 、Vはk ×n の重要な部分(特異値が大きい部分)だけを取り出して考えることができる。(ここで l < k)

* 具体的に自然言語処理で単語の分散表現を扱う例を考えると、分散表現Aにたいして特異値分解を用いると以下のように三つの行列に分解できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/aeeced96-f9af-193e-7072-d9dfcd475206.png)

ここで次元数を見てみると最終的に出てくる単語の表現ベクトルはUの各行ベクトルであることがわかります(行数が単語数に相当しているため)。ここで特異値σについて、上から任意のk ( < n)個だけを見てやると、行列 U の行ベクトルは以下のようにより小さい次元に圧縮できることがわかります(図の赤い部分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/9fbe7211-15b8-ae34-b4ff-97feca3393f1.png)


このようにして、特異値分解を用いてより密な分散表現を得ることができました。

## 固有値分解との違い

* 固有値分解(A = PDPt、Dは固有値を対角成分に持つ対角行列、大学のテストとかでAnを求めさせる問題でよく出るやつ)は正方行列にしか使えないが、特異値分解は長方行列にも可能。

# Matrix Factorization 
* SVD同様、ユーザー×アイテム行列の次元削減のために取られる手法。
* ユーザーアイテム行列R (m×n)が R ≒ UVTのように二つの行列の積に近似することを考えます。(ここで一見U,Vがそれぞれユーザー、アイテムのそれぞれの相関を表しているように思えますが、U,Vの各要素は単なる潜在因子なので必ずしも解釈可能だとは限りません。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/30243ada-cc1c-8f28-9fc4-5bd484cc4e74.png)

ここで考えたいのは当然近似した二つの行列積とRそのものの誤差を小さくするために損失関数を考えます。ここでは行列同士の距離としてユークリッド距離を採用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/2b48c52c-527b-a51b-ed68-19714f3ef2b6.png)

実際のデータには欠損値が数多く含まれているため、このままではうまく最適化できないため、実際に観測されたユーザーアイテムペア(i, j)∈Sの評価値 ri,jを用いて書き直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/e84259bd-3601-4def-21db-9d6a2e5eaf60.png)


右辺の後半二項は正則化項です。

* 重みの更新自体は**SGD,ALS**を用いて更新することが多い。

# NMF(Nonnegative Matrix Factorization) 
* Matrix Factorizationのうちで、元行列Vと分解したW,Hの要素の値がすべて非負値であるものの行列分解を指してNonnegative Matrix Factorizationと呼んでいる(?)。
* レコメンドで用いるユーザーによるアイテムの評価値は非負で表すことが一般的であり、また基底ベクトルと係数を非負に限定することで、係数が疎になりやすくなって理解しやすくなるらしい。

* NMFで用いる行列間の距離いろいろ
    * ユークリッド距離  
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/47d25ca3-7154-ef43-0a0b-13ecd0259265.png)
    * カルバック・ライブラー距離(KLダイバージェンス)
   
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/bcaa4128-ec5c-3696-cbe4-8aa83b100ca1.png)

    * **Itakura-Saito距離（IS）**
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/d601e63f-3d6b-6b41-ac90-0ffe1ac22a54.png)


* どのようにして非負の値に分解していくのか
    * 「最初の値がすべて非負」と「更新式に引き算がない」という条件を満たせば原理的にすべての要素が非負の行列に分解できる。
    * ruiをユーザーuによるアイテムi の評価値,、p,qをそれぞれ分解した行列P,Qの各要素だとすると更新式は以下のようになります。
     
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/be7dd160-45e3-eb81-8712-f78a2b8a0ac3.png)


更新式から引き算を消すために真ん中の式から学習率を以下のように表して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/1a17a720-1aa6-8bb0-c546-ea092bb0ff56.png)

代入すると以下のように、引き算の無い形で更新をおこなうことが出来、非負の行列に変換することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647807/4941aa58-0ce5-9ec5-0b09-fc7cc3fbd5cd.png)