暇人日記

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

Coursera Machine Learning Week9 課題 苦闘日記④

今回はcosiCostFunc.mのGradientパートに取り組みます↓

 

f:id:omoshiroamericanews:20191212112335p:plain

 

 

そもそもcofiCostFuncはこのFuncionでした。

 

[J, grad] = cofiCostFunc(params, Y, R, num_users, num_movies, ...
                                  num_features, lambda)

 

前回「J」の計算式を構築したので、

今回は「grad」の計算式の構築に取り組みます。

gradって苦手なんですよね。。。。

 

問題文を読んでみます。

f:id:omoshiroamericanews:20191212112923p:plain

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

 

大きいヒントが出てきました。

X_gradはXと同じsizeだから5X3

Theta_gradはThetaと同じsizeだから4X3

のベクトルということになります。

 

f:id:omoshiroamericanews:20191212113118p:plain

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

 

X_gradとTheta_gradをSingle Vectorにする

それってWeek5でもやったような。。。

 

やっぱり、Neural Networkの時にも同じような考え方でやってますね。↓

 

f:id:omoshiroamericanews:20191212113343p:plain

 

これはcosiCostFunc.mに入っているのかな。

あ、ありました↓

f:id:omoshiroamericanews:20191212113513p:plain

coficostFunc.mは

[J, grad] = cofiCostFunc(params, Y, R, num_users, num_movies,num_features, lambda)

なので、X_grad.Theta_gradは媒介の役割を果たしているということですね。

 

問題文にワンポイントアドバイスがのっていました。

f:id:omoshiroamericanews:20191212113955p:plain

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

 第1のアドバイスはループだと時間がかかるからベクトルでやった方がいいになります

第2のアドバイスはmovieのパラメーターであるXについてループをする、ユーザーのパラメーターであるThetaについてループをする、と書いてあります。。。。

 

ループしたほうがいいのか、しない方がいいのかわからなくなりました。

 

第3のアドバイスはまずはベクトルじゃない方から取り掛かって

ループの中にinner loopをもつバージョンを作成して、

それからinner loopをベクトルにするのが良いと書いてあります。

そうしたら2つのループだけが残ることになると書いてあります。

 

なので、こういうことなのかな↓と思いました。

f:id:omoshiroamericanews:20191212114709p:plain

MovieとUserでループは1つずつ残って2つあるけど、

inner loopはベクトルでやろうね、ということかと。

課題に取り組みながら検証していこうと思います。

 

f:id:omoshiroamericanews:20191212115016p:plain

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

↑の式は前回やったJの式↓に似ています。

ただ、↑の式はnX1の縦一列のベクトルで、↓のJは1X1の値になります。

何か後でヒントになるかもしれません。

f:id:omoshiroamericanews:20191212115131p:plain

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

 

f:id:omoshiroamericanews:20191212163906p:plain

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

まずはYもThetaもr(I,j)=1のみ抽出してやりなさいといっています。

 

f:id:omoshiroamericanews:20191212164502p:plain

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

 

Idx=find(R(I,:)==1)を用いて

Theta_temp=Theta(idx,:)と

Y_temp=Y(I,idx)を用いて

ith movieのレビューがあるものだけ抽出するようという指示に見えます。

X_gradの式も書いてあるのでプログラミングしてみました。

 

f:id:omoshiroamericanews:20191212164859p:plain

 

結果です。

f:id:omoshiroamericanews:20191212170400p:plain

 

図解してみました↓

f:id:omoshiroamericanews:20191212170513p:plain

水色枠がi=1のときです。

i=1のときはYの1列目をみるので、5 4 0 0なので

レビューがある1番目と2番目がidxとして表記されています。

それをもとにThetaとYのレビューのある部分だけが抽出されています。

1番目と2番目はいわばユーザー1とユーザー2のレビューがあるので、

Thetaでユーザー1とユーザー2を示す1列目と2列目が抽出されています。

当然Yも関係のある5 4だけが取り出されています。

 

X_gradが1X3で表現されています。

答えは5X3なので1X3を5個積み重ねるのかもしれません。

 

メインの式のサイズの確認をしてみました。

f:id:omoshiroamericanews:20191212171304p:plain

あとはhistoryをとって5X3にするのにTryしてみます。

 

loopしてhistoryを取り出すのは、↓でやっているので、

Coursera Machine Learning Week8 課題 苦闘日記④ - 暇人日記

 

 

それに倣って、こう書きました↓

f:id:omoshiroamericanews:20191212172243p:plain

 

結果です。

f:id:omoshiroamericanews:20191212172354p:plain

f:id:omoshiroamericanews:20191212172450p:plain

ヒントの通り↓のサイズとなりました!

 

X_gradはXと同じsizeだから5X3

Theta_gradはThetaと同じsizeだから4X3

 

Submitしたら不正解でしたorz

 

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