Coursera Machine Learning の受講記録（Week9）

[Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/welcome) WEEK9 のまとめ
# アノマリー検出　（異常検知）
## 概要
既知のデータセットに対し、あるデータが異常値かそうでないかを判断する手法。データセンタでの異常値検知等の分野で実用されている。
モデルをp(x)、x(i)をi個目の変数セットと定義し、
p(x)<ε
の場合異常値と判断する。もし、異常値の検出率が高すぎる場合はεの値を減らす。

## ガウス分布=正規分布の復習
ガウス分布の例は以下

![Kobito.MYB3Mk.png](https://qiita-image-store.s3.amazonaws.com/0/102387/e3e41f9f-1d7a-e4dd-9c15-8b119a3363ce.png "Kobito.MYB3Mk.png")

μは平均値　σは分散　赤い部分の積分値は1となる。

確率pは以下の式で表せる。
![Kobito.siNL50.png](https://qiita-image-store.s3.amazonaws.com/0/102387/69ec1626-f027-2800-655e-91fc10d49be2.png "Kobito.siNL50.png")
μ、σは以下
![Kobito.BqNHQK.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ac6effb6-c3cc-7522-a4ac-a2fa750c6792.png "Kobito.BqNHQK.png")

![Kobito.KP78Uy.png](https://qiita-image-store.s3.amazonaws.com/0/102387/2d8356a1-65be-d8c0-4fc2-2b145422c931.png "Kobito.KP78Uy.png")

## アノマリー検出のアルゴリズム
データセットがガウス分布（正規分布）していると仮定して、トレーニングのデータセットから平均値μ、分散σを算出し、確率pがε以下であればアノマリー（異常値）と判断する。データの次元数分pを掛け合わせる。

![Kobito.7u0wt8.png](https://qiita-image-store.s3.amazonaws.com/0/102387/2e65f296-3c60-4ee3-8b0d-a57ff0a44503.png "Kobito.7u0wt8.png")
![Kobito.bYzcs6.png](https://qiita-image-store.s3.amazonaws.com/0/102387/24f23a34-eeb2-1958-b84a-774bc213b224.png "Kobito.bYzcs6.png")
![Kobito.oRO0hd.png](https://qiita-image-store.s3.amazonaws.com/0/102387/1964fd61-be88-59b2-0597-6d660ed0d3c3.png "Kobito.oRO0hd.png")

![Kobito.QrFzKv.png](https://qiita-image-store.s3.amazonaws.com/0/102387/76303d18-f1ff-8a18-6c97-616eab5f9d26.png "Kobito.QrFzKv.png")

## アノマリー検出の適用　アルゴリズムの評価
アルゴリズムの評価には異常値(y=1)と正常値(y=0)にラベル付けされたデータを用いる。（具体例：0.2%の確率で異常値となるデータセットには60%をトレーニングデータセット、20%をクロスバリデーションデータセット、20%をテストデータセットとして用いる）
アルゴリズムの評価の手順は以下の通り
- モデル　p（x）にトレーニングセットx(i)を適用する。
- クロスバリデーションセット、テストセットに対して p(x)<εの場合はy=1(異常値）、p(x)>=εの場合はy=0(正常値）と予測させ、ラベル付けされたyとの差異を小さくする。

y=1のデータ数はy=0のデータに比べて非常に少なくなる（データが歪んでいる）ので、評価指標は  予測とリコール、や、F1スコア　等を用いる([WEEK6の偏りのあるクラス分類の問題を参照](http://qiita.com/agotoh/private/a1c0c02956bf61f7776a#%E5%81%8F%E3%82%8A%E3%81%AE%E3%81%82%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E9%A1%9E%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A60))
また、適当なεの値はクロスバリデーションセットを用いて決定する。

## 教師あり学習 vs アノマリー検出
アノマリー検出の学習には、異常値、正常値のラベル付けしたデータがあるのだから、ニューラルネットワーク等教師あり学習をなぜ使わないのか？という疑問を持つかもしれない。どのような場合にアノマリー検出を使うべきか？
### 以下の場合アノマリー検出を利用する
- 異常値データ(y=1)が正常値データ(y=0)より極端に少ない場合
- 異常値の種類が多い場合。例えば飛行機の故障の種類等。

### 以下の場合教師あり学習を利用する
- y=1,y=0両方のデータが十分にある場合


## アノマリー検出で、どの変数を利用するか？
どの変数を利用するか？はアノマリー検出の精度を大きく左右する。
変数をプロットし、正規分布しているかどうかを事前にチェックする事が有効。
正規分布していない場合はlog(x)、√x等に変換する等して正規分布するように変数を置き換えるとアルゴリズムの精度が上がる。

また、アノマリー検出で異常値がうまく検出できない場合、検出に失敗したデータを分析し、新たな変数xを利用して再度試してみる事が有効。

## アノマリー検出の拡張　
### 多変量ガウス分布
多変量ガウス分布は変数x(1),..x(i)を行列化して表現する。
![Kobito.g83AI7.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ba547606-4a44-6ab4-14ab-a54446faf2dc.png "Kobito.g83AI7.png")
![Kobito.mvlgT2.png](https://qiita-image-store.s3.amazonaws.com/0/102387/850fcd4b-ca21-4626-f625-0de08b618ab1.png "Kobito.mvlgT2.png")

これにより、変数間の相関を把握する事ができる。
μ、σの値と多変量ガウス分布のグラフの具体例は以下
![Kobito.aA8Dqs.png](https://qiita-image-store.s3.amazonaws.com/0/102387/306487ac-d77a-cf89-6450-ee05cf91bee1.png "Kobito.aA8Dqs.png")

![Kobito.hwsOCx.png](https://qiita-image-store.s3.amazonaws.com/0/102387/4e2eee2d-aa53-653e-21cc-fe0249b409f2.png "Kobito.hwsOCx.png")

![Kobito.GaSlO9.png](https://qiita-image-store.s3.amazonaws.com/0/102387/91dc19c0-1762-a167-ad54-338108fdfd12.png "Kobito.GaSlO9.png")

### 多変量ガウス分布のアノマリー検出への適用
#### 適用手順
![Kobito.ZIzMDX.png](https://qiita-image-store.s3.amazonaws.com/0/102387/4d6c9b86-80a3-f62a-0460-21f18199086e.png "Kobito.ZIzMDX.png")

#### 通常のガウス分布 vs 多変量ガウス分布
通常のガウス分布を用いた場合、変数間に相関がある場合に新たな変数を作り出す必要があるが、多変量ガウス分布はその必要がない点がメリット。
ただし、計算コストが高くなる点はデメリット。変数の数n×n行列の計算をするので、例えば変数n = 10,000の場合は通常のアノマリー検出を使う方が現実的。また多変量ガウス分布にはトレーニングデータの数mが変数の数nよりも大きい(m>n)という数学的な条件がある点にも注意。

# リコメンダーシステム
## リコメンダーシステムのモデル化
リコメんだーシステムは機械学習の重要な応用事例。
AmazonやNetflix等多くの企業で実際に適用されている。

モデルの定義は以下
![Kobito.Zo6VXu.png](https://qiita-image-store.s3.amazonaws.com/0/102387/7dfae22d-f2e3-f5e5-ac9d-f6156a2b2b8c.png "Kobito.Zo6VXu.png")

例）
![Kobito.SvN6M0.png](https://qiita-image-store.s3.amazonaws.com/0/102387/472311ca-1df3-5958-96b5-760663b18fe5.png "Kobito.SvN6M0.png")

nu =4 nm=5 r(2,1)=1 y(2,1)=5

## コンテントベースのリコメンダーシステム
それぞれの映画について、映画の内容を表す変数x1(ロマンス度）,x2(アクション度）を定義できるとする。
1つのアプローチとしては、線形回帰の問題として扱うという事。
バイアス項　x0=1　を加えて、パラメータθ(j)は3次元ベクトルになり、（θ(j))tx(i)でスターの数を予測できる。

![Kobito.DAVwco.png](https://qiita-image-store.s3.amazonaws.com/0/102387/293f0081-d7b7-54d9-e8a1-a163fc092ad7.png "Kobito.DAVwco.png")

![Kobito.XEhStG.png](https://qiita-image-store.s3.amazonaws.com/0/102387/c8db25e3-9b73-00be-7278-ee17b62481af.png "Kobito.XEhStG.png")

![Kobito.a2VyZ8.png](https://qiita-image-store.s3.amazonaws.com/0/102387/d435302f-96cb-0645-7f5a-a4a8a92e67a1.png "Kobito.a2VyZ8.png")


## 強調フィルタリング　によるリコメンダーシステム
### 概要
前項のように映画の内容を表す変数を予め定義できない事は多々ある。
（この映画のロマンティック度は0.5でアクション度は0.8 といった定義をここの映画に対して予めする事は困難）
その際、前項とは逆にθjが分かっている場合、逆に変数x1,x2の値を推計する事ができる。
![Kobito.SjzOGS.png](https://qiita-image-store.s3.amazonaws.com/0/102387/28bc4c69-2bc0-8192-61e3-72514d7455ed.png "Kobito.SjzOGS.png")

![Kobito.6Xg4fF.png](https://qiita-image-store.s3.amazonaws.com/0/102387/c59a782a-fdaf-59a1-35ad-99d2e914b1f8.png "Kobito.6Xg4fF.png")

現実の問題ではまずθにある値を推計してxを算出、xを利用してθを再度推計・・と繰り返してθ、x　の値の精度を上げていく。

### アルゴリズム
θ、xの値を交互に変更していくよりも効率的なアルゴリズムとしては以下。θ、　x両方を含んだ以下の目的関数を最小化する。

![Kobito.VfvRDx.png](https://qiita-image-store.s3.amazonaws.com/0/102387/244d8d12-691d-0ff6-478d-5d6ee9262427.png "Kobito.VfvRDx.png")

![Kobito.UHdPZ2.png](https://qiita-image-store.s3.amazonaws.com/0/102387/2e4450cc-6d5c-ec18-1c59-3df7437383af.png "Kobito.UHdPZ2.png")


### ベクトル化した実装　（低ランク行列分解)　概要
![Kobito.yRNQmu.png](https://qiita-image-store.s3.amazonaws.com/0/102387/a68c654d-9714-47a8-2e5a-05fcbfd96b06.png "Kobito.yRNQmu.png")
![Kobito.ehej5Q.png](https://qiita-image-store.s3.amazonaws.com/0/102387/ae95ab68-8989-a7ae-de22-a605282c3a60.png "Kobito.ehej5Q.png")

### ベクトル化した実装　（低ランク行列分解)　実装方法の詳細 (平均標準化）
全項までのリコメンダーシステムで、新たなユーザの評価を予測する際、θの初期値を0にセットするとY(各映画の評価）の値は0となり、どの映画もおすすめできなくなってしまう。
Yの値として、既にある書くユーザの評価値の平均値を設定する方法が「平均標準化」

![Kobito.8vvskN.png](https://qiita-image-store.s3.amazonaws.com/0/102387/aa85c768-99db-e987-8a74-66e4143301ce.png "Kobito.8vvskN.png")

![Kobito.gPD7D6.png](https://qiita-image-store.s3.amazonaws.com/0/102387/b2040383-c3b7-f75e-b5dd-8ca0ff61ebf0.png "Kobito.gPD7D6.png")

![Kobito.cOkGNo.png](https://qiita-image-store.s3.amazonaws.com/0/102387/2d1116d4-952d-431c-ff63-3560c85f0539.png "Kobito.cOkGNo.png")