暇人日記

アラフォーおっさんのコーセラの機械学習の課題を解こうと頑張っています!

Coursera Machine Learning Week9 振り返り

11/30から12/17までやっていたので約2週間取り組んだことになります。

 

最初の方を忘れてしまったので笑

内容を振り返ってみたいと思います。

 

Anomaly Detectionの課題では

307のTraining Setが与えられていました。

 

これをもとに307Setのpを作り、そのpがεより上か下かをみていました。

 

pは307Setの平均(μ)と分散(sigma2)からきていたので固定値でした。

307のpについてεを変化させてどこが一番いい値かを探していました。

εが一番いいかはFscoreを基準に行なっていました。

 

multivariateGaussian.mが課題ではないですが最重要だった思います。(苦闘日記①)

(X,mu,sigma2)を放り込むとpを返してくれる関数だったんだと思います。

 

そういえば、この関数とVideoでやった分布の話はどういう関係だったんでしょうか?

 

f:id:omoshiroamericanews:20191221233007p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

Videoではmuとsigma2 を変更すると、分布を変更できるという話でしたが、

課題の中ではその実践はありませんでした。

 

multivariateGaussian.mの中に変更できる要素があるかもしれないので見てみます。

見てみましたが、ありませんでした。

 

muとsigma2はXから計算されていて、それを使う流れにex8.mでは

なっているのですが、意図的にそれを変えてみます。

 

sigma2を倍にしてみました。

山の裾野が広くなり、山の高さが低くなる変更のはずです。

山の高さはpの大きさなので、pが小さくなるはずです。

なのでεのより小さい値が赤丸で表記される今回の課題は

赤丸の数が少なる変更になるのかなと思いました。

f:id:omoshiroamericanews:20191221234557p:plain

左が課題そのままで、右が変更したものです。

赤丸の数が減りました。

 

続いて値を直接みてみます。

f:id:omoshiroamericanews:20191221235036p:plain

 

おぉ、見事に変わっています!

 pが小さくなりました。

 

確かVideoでは正規分布じゃないときなどに正規分布に変更するために

分布をいじった方がいい、というようなことをいっていました。

 

こちらの方のこのブログの「Choosing what features to use」の説明が

分かりやすかったです。

ちゃんと理解できる人が羨ましいです。

 

ushiji.hatenablog.com

 

 

Week9の苦闘日記は7つありますが、

5つがcollaborative filterで

内2つがcostfunction,3つがgradientでした。

 

costfunctionについてはYは明示されているので、

あとは予測値を作って (予測値ーY)の2乗を作れば良いというのは

ピンときたんですけど、予測値を作るのに戸惑いました。

 

今まではTrainig set かける パラメーターが予測値だったんですが、

今回はTrainig setはYだけで従来のTraining set(X,Y)という組み合わせが

ありませんでした。

 

つまり予測値=X *Thetaみたいな姿に見えませんでした。 

 

私の目には

Training set がYだけ、パラメーターがXとthetaで2つという風に見えていました。

だから予測値の計算がピンときませんでした。

 

もう一つはループを使った方が簡単という指示が問題文にあったのですが、

ループの方が私には難しかったです。

予測値計算が分かっていなかったのでループして何を取り出すかが

全く分かっていなかったからだと思います。

 

 結局はvideoの分を良く読んだのと、

映画目線論を考えたのがうまくハマって答えに辿りつけたという感じです。

 

従来は

答えの定数(Y)と要素の定数(X)とパラメータの

定数2とパラメータが1つで計算でしたが、

今回は

答えの定数(Y)とパラメータ2つという

定数1とパラメーター2つで計算しています。

 

パラメーターはランダムで決めて良いとすれば、

これはYだけあれば予測出来るということになるんでしょうか?

 

図で考えてみました↓

 

f:id:omoshiroamericanews:20191223111902p:plain

 

こうして考えると

パラメーターは固定値が与えられてなくても、最初に何らかの値を

ふってもできそうな気がします。

今回の課題ではRがあって予測不要部分を削除していましたが、

これはいわば欠損部分の削除という風に思います。

 

例えばWeek2の課題、家の値段あてを今回の方法であるCollaborativeFiletering

でやろうとするとどうなるかを考えてみました。

 

Week2の課題はLinear Regressionでした。

課題は2つありましたが今回はmultiの方をやってみたいと思います。

 

Yは47X1、Xは47X2でした。従来はパラメーターを1つ設定するのですが、

Collaborative Filteringをしたいので、Xは知らない体で進めます。

 

つまりYに47X1は既知ですが、Xは使わずにやってみます。

代わりにパラメーターA,Bという2つでやってみます。

図にするとこういう感じですね。

 

f:id:omoshiroamericanews:20191223234123p:plain

 

プログラミングしてみました。

f:id:omoshiroamericanews:20191223234400p:plain

f:id:omoshiroamericanews:20191223234452p:plain

 Rは全て1ですが作成しました。

 

結果です↓

f:id:omoshiroamericanews:20191223235021p:plain

 

PはほぼYと同値なので予測精度としては高いと思いますが、

crossvalidationしていないのでOverfitの疑いがあると感じました。

 

やはりDataはTraining/CrossValidation/Testの3つに分解する方が

良いんだと身をもって感じました。

 

 

 

そういえば苦闘日記②で計算順序に疑いを持っていました↓

Coursera Machine Learning Week9 課題 苦闘日記② - 暇人日記

***********************************************************************************

f:id:omoshiroamericanews:20191223112230p:plain

 *************************************************************************************

問題文の順番で合っていますね。

 

①cofiCostFunc.mで『J,grad』を出す

②fmincgでJ,grad,lambda,initial_パラメーター,optionsを基に最適thetaを出す

 

このときはcollaborative Filteringがよくわかってなかったんだと思いました。

(今もかもしれませんが汗)

 

collaborative FilteringはXとThetaという2つのパラメータについて、

それぞれGradientを計算していました。

 

つまりXgradとThetagradを計算していました。

 

そしてそれをfmincgに放り込むために

grad = [X_grad(:); Theta_grad(:)]

で1つのgradとみなして、fmincgで計算させて、1つのgradを計算します。

 

そしてそれをreshapeでXgradとThetagradに分解するというやり方でした。

 

X = reshape(theta(1:num_movies*num_features), num_movies, num_features)
Theta = reshape(theta(num_movies*num_features+1:end), ...
                num_users, num_features)

 

一度1つのgradにして分解するというのがcollaborative Filteringで

苦闘日記②を書いた時に知らなかったのでわからなかったです。

 

 

今回はここまでです。また次回頑張ります。