今回はcosiCostFunc.mのRegularized Costに取り組みます。
まずは問題文を読んでみます。
後ろ2つの式↓を追加することが目的になりますね。
(出典;『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になっている行ですね。
図でいうと↓
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したら正解になりました!!
あれ、レビューのない値って削除しなくていいんだろうか。。。
分からなかったので他の人のブログを読んでみました。
↓こちらの方の説明がわかりやすかったです。
要はするに、Videoでこの式を教えてもらったのですが、
Regularizationを担当している↓この式には
レビューがあるときの条件を付けている↓この式がないということですね。
なるほど~、あまり記号を読んでないから気づきませんでした。
読んでも分からないだろうという文系の悲しい習性です泣
Regularization Costができたので、Gradient with Regularizationに取り組みます。
では、問題文を読んでみます。
これはほとんど答えが書いてある気がします。
前回正解したX_gradにlambda かけるXを足すだけに見えます。
提出してみました。
正解になりました!
問題文がここまでヒント書いてくれると簡単に正解にたどりつけるんですけどねぇ。
続いてオプションやります。
どうやら、自分の好みを反映したRecommender Systemを作成できるようです。
Movieidx.txtを変更すればいいんでしょうか?
まずはmovie_idx.txtをみてみます。
映画の対応表のようです。
さらにmovieListという似たようなデータがあります。
こちらも映画の対応表ですね。
なぜ似たようなファイルが2つあるのかわかりませんが、
とりあえず前に進んでいきます。
プログラムの流れは↓こうなっています。
表示されたものです。
うまいこと、私の好みが反映されています。(ガチで自分の好みをつけてみました)
ここまではmy_ratingsの反映の確認だったようです。
my_ratingsは1682X1のベクトルで上の映画以外は全て0です。
1682個中約10しか評価してないのは少なさぎる気もしますが、
これでも良いrecommendが出るかどうか興味あります。
とりあえず前に進みます。
ここからが作ったmy_ratingsを使用しながらのrecommender Systemのようです。
まず、1682X943のデータをロードします
自分のmy_ratingをYとRに1行ずつ足しています。
これでYとRは1682X944になります。
そしてNormalizeしていますね。
ただ、ratingsは1-5だからNormalizeしなくても大丈夫に様な気がします。
あぁ、でも間違えて50とかをつけても、ここで修正されることになるわけですね。
ちなみにこういう次元でした↓
ユーザーの数をYの縦行の数、映画の数をYの横列の数、
パラメーターを10にする
←これは時間かかりそうですね。。。。
試行錯誤用に3に変えるかどうか悩むところです。
XとThetaのSizeが決まったので、Ramdomに初期パラメーターを設定して、
cofiCostFunc.mでやったように横一列にしています
fmincgのための設定をしていますね。
Regularization用にlambdaが10と設定されています。
cofiCostFunc.mはJとgradを計算する式でした。
そのJとgradは、そのままfimincgに適用されているイメージでしょうか。
前回fmincgを使った式を思い出してみます。
Week4の課題でつかったのを見ると、やはり
fmincg((@(t)(costfunction=J&Grad), initialtheta, options)の
3つの要素の構成になっていますね。
fmincgで出てきた横一列のパラメーターをXとThetaの形に再編成しています。
Xは1682X3 映画数Xパラメーター数
Thetaは944X3 ユーザー数Xパラメーター数
ですね。
XとThetaがあるので、各映画の計算によるRecommendができていることになります。
Pは1682X944で944行目が私へのRecommendですね。
と、思いきや、この↑からするに私のRecommendは1行目ですね。
そーいえば、私がRatingしていないところはほかの人の
平均値を足すということでしたね。
これはなんでしょうか?
まず、実行してみます。
結果です↓
rはRatiingで値が大→小に並べ替えられてあります。
ixはIndexで何番目かを示していますね。
Rもixも大きい順から並んでいるので
1-10を引っ張れば、Recommendの高い順に並ぶということですね。
結果が出ました↓
知らない映画が多くて自分の好みかどうかわかりません笑
変更前と変更後のRecommendの違いです。
ちゃんとRecommendが変わっていますが、
やはり10個くらいのレビューだと、ほかの人のレビューに左右されるのか、
同じものもおおいですね。
後は全て5.0ですね。。。
パラメーターが10くらいだと計算要素が少なすぎるんでしょうか。
パラメーターを10から20に増やすともっとよくなるのかもしれません。
というわけでレビューを約20に増やしてみました↓
結果です↓
順番が変わっただけでそこまで変更がない気がします。。。
もっとレビューを増やさないとだめなのでしょうか。
ということで今回はここまでです。
次回からようやくWeek10に突入です。