今週のテーマはAnomaly detectionとRecommender system
Anomaly detectionはめったに起こらない異常な状態、故障を検知する方法。
Recommender systemは映画のratingの情報から次に見るお勧めを提示したり、ratingから映画を分類する方法。
Anomaly detection
各featureのガウス分布の積からある小さなεより小さい事象が起きたらanomalyだと判断する。
起こりにくい方を1として検出するようにすることでPesision/Recallでアルゴリズムの出来を判断できる用意する。通常状態を1とするとほとんど1として検出するのでとりあえず1を出せばPrecision/Recallの成績がよくなるから。これは何週か前にも説明していた。
Multivariate Gaussian DistributionはOptionalになっている。先週PCAの説明でΣとして出てきたcovariance matrixが再び登場。数学的に高度な話になるのでOptionalの扱いなんでしょうか。話としてはそんなに難しくないですが特異値分解とその応用については理解できるようにしようと思います。
Recommender System
映画を見た人が星いくつかで映画を評価し、それに基づきその人におすすめの映画を提案すると同時に映画の分類もするというシステム。
個人個人の評価から決まるΘと映画の分類をするXと、その人が評価を行った映画かどうかを区別るるためのRこれらの行列を学習し、レコメンドを提案する。やっていることはそんなに難しいことではないので簡単と思っていたらPrograminの課題でちょっとてこずることになった。ΘとXの2つの変数を同時に学習していき、個人の好みから映画を提案するだけでなく映画の分類もしてしまうのが面白い。
Programming
今週の提出物は下記の3つ
- estimateGaussian.m - Estimate the parameters of a Gaussian distribution with a diagonal covariance matrix
- selectThreshold.m - Find a threshold for anomaly detection
- cofiCostFunc.m - Implement the cost function for collaborative filtering
採点は6つのパートに分かれています。
Anomaly detectionが2つの残りがRecommender systemに関するもの。
Anomaly detection
estimateGaussian.m
与えられた行列から各列の平均と分散を求めます。
分散はvar()を用いるとデフォルトでは不変分散だからねってpdfに注意書きがありますのでその通り対応すること。
selectThreshold.m
forループでεを変化させて最適なεを求める。F1スコアが一番良いεを返せばよい。
PrecisionとRecallを求めてF1を計算するという問題
一応 division by 0とならないように注意した。
Recommender Systems
octaveのコードをどう書くのかてこずりました。PDFで説明されたとおりにやればできるんですがgradの計算で使うfindの使い方を知らなかったので最初はどういうことなのか理解できなかった。
コストJ(X,Θ)の計算のΣの(i,j):r(i,j)=1の処理とgradienntの計算のΣのj:r(i,j)=1とi:r(i,j)=1の処理をどうするのかてこずりました。どちらもpdfにImplement Note, Implementation Tipに説明がありますのでそれを参考にすればわかると思います。
コストの方は R.*M という形でRを作用させればOKです。
gradientの方はidx = find(R(i, :)==1)という列を選択する変数を使います。
gradientのもう一方のThetaのgradientはidx = find(R(:, j)==1)として行を選択してやればいいのですがY_tmpを転置しないと行x列が合わなくなるとこに気が付かないで時間がかかってしまいました。こういう時は各行列の大きさを書き出して隠しながらやるといいですね。