暇人日記

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

Coursera Machine Leraning Week9 課題 苦闘日記⑥ -Gradientに取り組む3日目-

今回もcofiCostFunc.mのGradient部分に取り組みます。

 

f:id:omoshiroamericanews:20191212112335p:plain

前回の宿題はTheta_gradの式の解明を進めていくことですが、

行き詰ったので、

いっそループなしの式に取り組もうと思いました。

前々回の日記でこの式が似ていると気づいたもので考えてみます。

 

f:id:omoshiroamericanews:20191214112446p:plain

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

 

上の式は一列ずつ取り出すような格好で、

下の式はすべて一気に計算しています。

 

J = (1/2)*(sum(sum(((X*Theta‘-Y).*R).^2)))から

1/2を削除します。そしてJは1X1の値でしたが、

X_gradは5X3のベクトルなのでSum(sum())を削除します。

そして要素ごと2乗も不要なので削除します。

最後にThetaをかける必要があるのでThetaをかけます。

そうすると、こうなります↓

X_grad=(X*Theta’-Y).*R)*Theta

 

Xは5X3でTheta’は3X4で計算結果が5X4、

YもRも5X4なので、Thetaにかける(X*Theta’-Y).*R)*は5X4になります。

Thetaは4X3なのでX_gradは奇跡的に5X3になります!!

これはいけそうな気がします!

 

計算してみました!

結果です↓

f:id:omoshiroamericanews:20191214112623p:plain

 

見事にX_gradの答えはあっているという結果が出ました!

Theta_gradは引き続き間違っているので、同じようにトライしてみます。

 

Theta_grad=(X*Theta’-Y).*R)*X

 

最後にXにかける(X*Theta’-Y).*R)*が5X4なので

5X4 X 5X3 なので計算できません。

 

ここでずっと示唆されている転置を思い出しました。

何かを転置して、4X3の答えを作るよう考えてみます。

Xにかける前は4X5であればいいですね。

あ、Xにかける前のものが5X4なので、これを転置してみます、

 

Theta_grad =(X*Theta’-Y).*R)’*X

 

計算してみました!

結果です!

f:id:omoshiroamericanews:20191214112723p:plain

 

 

全部合いました!

Submitしたら正解になりました!

3日間取り組んできましたが、ようやく正解にたどり着きました。

うれしいです^^

 

さて前回まで取り組んでいた列ごとに取り出した

Theta_gradの式も正解にこぎつけたいと思います。

これはほかのサイトで答えをみて見比べて進めたいと思います。

 

f:id:omoshiroamericanews:20191214121159p:plain

  

左が私の自前で右が正答例です。

違う行に黄色塗りして、違う個所を赤字にしています。

  

いきなり違いますね。

idx=find(R(j,:)==1)

idx=find(R(:,j)==1)

の違いをj=1のときでみてみます。

 

忘れたのでY,Rもみました。

f:id:omoshiroamericanews:20191214121316p:plain

 

 このY、Rについてのidxが↓です。

f:id:omoshiroamericanews:20191214121420p:plain

 

 

となりました。

 

図で書いてみると

 

f:id:omoshiroamericanews:20191214121504p:plain

 

 

これはidx=find(R(j,:)==1)は横に取り出して

idx=find(R(:,j)==1)は縦に取り出していることになります。

Yは横が映画で縦がユーザーでした。

そしてThetaはユーザーのパラメーターだから

ユーザーの縦列を取り出しているのかもしれません。

ふっと思いましたが、縦の3番目と4番目はそれぞれ

ユーザー3とユーザー4に該当しますが、全部0なので

彼らはレビューしたことがないということになりますね。

 

 

続いて3行目以降をみていきます。

f:id:omoshiroamericanews:20191214121159p:plain

X_tempは同じですね。

Theta_tempはないということですね。

Y_tempの取り出し方も違います。

さっきと同じように、縦と横の違いだと思いますが、確かめてみます。

f:id:omoshiroamericanews:20191214121622p:plain

 

 

やはりそうでした。

 

 

続いて6行目をみます。

f:id:omoshiroamericanews:20191214121159p:plain

 

X(j、:)だと

Xの5列目は抽出されませんね。

jは1-4の間をとるので。

そーするとTheta(j,:)が適切だったのかなと後になって思います。

もう1つ思うのは今回はidxもY_tempもユーザーごとを示す縦列で

取得していたので、

同じくユーザーごとのパラメーターを示すThetaの横列が

適切だったのかなと思います。

X_temp=X(idx,:)はidx X 3 のベクトル

Y_temp=Y(idx,j) はidx X 1のベクトル

Theta(j,:)は1x3のベクトル

だから

X_temp*Theta(j,:)‘ はidx X 1 のベクトルに常になるから

Y_tempのidx X 1のベクトルと引き算が可能ということですね。

そしてidx X 1 を転置させて 1X idx を

X_tempのidx X 3 のベクトルとかけるから常に1X3になるということですね。

 

ようやくGradientパートが終わりました!今日はおいしいお酒が飲めそうです!

次回は新しい課題に取り組みます!