暇人日記

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

Coursera Machine Learning Week9 課題 苦闘日記⑦ -Reguralization-

今回はcosiCostFunc.mのRegularized Costに取り組みます。

f:id:omoshiroamericanews:20191214220511p:plain

 

まずは問題文を読んでみます。

f:id:omoshiroamericanews:20191214220831p:plain

後ろ2つの式↓を追加することが目的になりますね。

f:id:omoshiroamericanews:20191214220957p:plain

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

 

そしてこの2つの式を足したJが31.34になれば正解ということですね。

 

全体プログラムex8cofi.mと詳細プログラムcofiCostFunc.mには

特に大きなヒントはありませんでしたので試行錯誤を始めます。

 

 2つの式を読み取ると

レビューのある値だけ2乗してSum(sum())で足し合わせれば、

いいのかなぁと思いました。

 

まず1つめのThetaを考えてみます。

いきなり壁にぶち当たりました。

Thetaは4X3でRは5X4で形が違いますから、

ThetaとRをかけ算をしてRが0の部分をThetaの方も0にするということができません。

 

Thetaで0にしたいのは、Rで縦がすべて0になっている行ですね。

 

図でいうと↓

 

f:id:omoshiroamericanews:20191214223025p:plain

 

Rの縦の3行目と4行目が0なので、

Thetaの横の3列目と4列目を0に変えたいですが、方法が思いつきません。。。

 

Theta;4X3 X ? =NewTheta 4X3

にしたいんですが、

?に入るパターンはサイズから考えて

①要素通しをかける4X3の何か

②3X3の何か

になります。

 

Rは5X4なので①も②も無理な気がします。。。

 

問題を先送りするような形ですが、

とりあえず2乗してレビューのない値を0にするという2乗を先にします。

 

A= (1/2)*lambda*(sum(sum((Theta.*Theta))));
B=  (1/2)*lambda*(sum(sum((X.*X)))) ; 

 

これからRを駆使してレビューのない値を削除したいです。

 

驚いたことにこれをSubmitしたら正解になりました!!

 

あれ、レビューのない値って削除しなくていいんだろうか。。。

 

分からなかったので他の人のブログを読んでみました。

↓こちらの方の説明がわかりやすかったです。

 

qiita.com

 

要はするに、Videoでこの式を教えてもらったのですが、

f:id:omoshiroamericanews:20191216102451p:plain

 

Regularizationを担当している↓この式には

f:id:omoshiroamericanews:20191216102810p:plain

 

レビューがあるときの条件を付けている↓この式がないということですね。

f:id:omoshiroamericanews:20191216102937p:plain

 

なるほど~、あまり記号を読んでないから気づきませんでした。

読んでも分からないだろうという文系の悲しい習性です泣

 

 

Regularization Costができたので、Gradient with Regularizationに取り組みます。

f:id:omoshiroamericanews:20191216103320p:plain

 

では、問題文を読んでみます。

f:id:omoshiroamericanews:20191216103514p:plain

これはほとんど答えが書いてある気がします。

前回正解したX_gradにlambda かけるXを足すだけに見えます。

提出してみました。

正解になりました!

 

問題文がここまでヒント書いてくれると簡単に正解にたどりつけるんですけどねぇ。

 

続いてオプションやります。

 

f:id:omoshiroamericanews:20191216104134p:plain

どうやら、自分の好みを反映したRecommender Systemを作成できるようです。

Movieidx.txtを変更すればいいんでしょうか?

 

まずはmovie_idx.txtをみてみます。

f:id:omoshiroamericanews:20191216220616p:plain

映画の対応表のようです。

 

さらにmovieListという似たようなデータがあります。

 

f:id:omoshiroamericanews:20191216220755p:plain

こちらも映画の対応表ですね。

 

なぜ似たようなファイルが2つあるのかわかりませんが、

とりあえず前に進んでいきます。

 

プログラムの流れは↓こうなっています。

 

f:id:omoshiroamericanews:20191217235208p:plain

 

表示されたものです。

うまいこと、私の好みが反映されています。(ガチで自分の好みをつけてみました)

f:id:omoshiroamericanews:20191217235433p:plain

ここまではmy_ratingsの反映の確認だったようです。

my_ratingsは1682X1のベクトルで上の映画以外は全て0です。

1682個中約10しか評価してないのは少なさぎる気もしますが、

これでも良いrecommendが出るかどうか興味あります。

 

とりあえず前に進みます。

ここからが作ったmy_ratingsを使用しながらのrecommender Systemのようです。

 

f:id:omoshiroamericanews:20191218000520p:plain

 

まず、1682X943のデータをロードします

 

f:id:omoshiroamericanews:20191218000612p:plain

 

 

自分のmy_ratingをYとRに1行ずつ足しています。

これでYとRは1682X944になります。

 

f:id:omoshiroamericanews:20191218000810p:plain

 

そしてNormalizeしていますね。

ただ、ratingsは1-5だからNormalizeしなくても大丈夫に様な気がします。

あぁ、でも間違えて50とかをつけても、ここで修正されることになるわけですね。

ちなみにこういう次元でした↓ 

f:id:omoshiroamericanews:20191218001210p:plain

 

f:id:omoshiroamericanews:20191218001416p:plain

 

ユーザーの数をYの縦行の数、映画の数をYの横列の数、

パラメーターを10にする

←これは時間かかりそうですね。。。。

試行錯誤用に3に変えるかどうか悩むところです。

 

XとThetaのSizeが決まったので、Ramdomに初期パラメーターを設定して、

cofiCostFunc.mでやったように横一列にしています

 

f:id:omoshiroamericanews:20191218001640p:plain

fmincgのための設定をしていますね。

 

 

f:id:omoshiroamericanews:20191218001904p:plain


 

Regularization用にlambdaが10と設定されています。

cofiCostFunc.mはJとgradを計算する式でした。

そのJとgradは、そのままfimincgに適用されているイメージでしょうか。

前回fmincgを使った式を思い出してみます。

 

f:id:omoshiroamericanews:20191218002100p:plain

Week4の課題でつかったのを見ると、やはり

fmincg((@(t)(costfunction=J&Grad), initialtheta, options)の

3つの要素の構成になっていますね。

 

f:id:omoshiroamericanews:20191218002355p:plain

 

fmincgで出てきた横一列のパラメーターをXとThetaの形に再編成しています。

Xは1682X3 映画数Xパラメーター数

Thetaは944X3 ユーザー数Xパラメーター数

 ですね。

 

f:id:omoshiroamericanews:20191218002505p:plain

 

XとThetaがあるので、各映画の計算によるRecommendができていることになります。

Pは1682X944で944行目が私へのRecommendですね。

 

f:id:omoshiroamericanews:20191218002607p:plain

 

と、思いきや、この↑からするに私のRecommendは1行目ですね。

そーいえば、私がRatingしていないところはほかの人の

平均値を足すということでしたね。

 

f:id:omoshiroamericanews:20191218002847p:plain

 

これはなんでしょうか?

まず、実行してみます。

結果です↓

f:id:omoshiroamericanews:20191218002950p:plain

rはRatiingで値が大→小に並べ替えられてあります。

ixはIndexで何番目かを示していますね。

 

f:id:omoshiroamericanews:20191218003054p:plain

Rもixも大きい順から並んでいるので

1-10を引っ張れば、Recommendの高い順に並ぶということですね。

結果が出ました↓

f:id:omoshiroamericanews:20191218004121p:plain

知らない映画が多くて自分の好みかどうかわかりません笑

 

変更前と変更後のRecommendの違いです。

f:id:omoshiroamericanews:20191218004239p:plain

ちゃんとRecommendが変わっていますが、

やはり10個くらいのレビューだと、ほかの人のレビューに左右されるのか、

同じものもおおいですね。

 

後は全て5.0ですね。。。

パラメーターが10くらいだと計算要素が少なすぎるんでしょうか。

パラメーターを10から20に増やすともっとよくなるのかもしれません。

 

というわけでレビューを約20に増やしてみました↓

f:id:omoshiroamericanews:20191218171638p:plain

 

 結果です↓

f:id:omoshiroamericanews:20191218171832p:plain

順番が変わっただけでそこまで変更がない気がします。。。

もっとレビューを増やさないとだめなのでしょうか。

 

ということで今回はここまでです。

 

次回からようやくWeek10に突入です。