今回もcofiCostFunc.mのGradient部分に取り組みます。
前回の宿題はTheta_gradの式の解明を進めていくことですが、
行き詰ったので、
いっそループなしの式に取り組もうと思いました。
前々回の日記でこの式が似ていると気づいたもので考えてみます。
(出典;『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になります!!
これはいけそうな気がします!
計算してみました!
結果です↓
見事に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
計算してみました!
結果です!
全部合いました!
Submitしたら正解になりました!
3日間取り組んできましたが、ようやく正解にたどり着きました。
うれしいです^^
さて前回まで取り組んでいた列ごとに取り出した
Theta_gradの式も正解にこぎつけたいと思います。
これはほかのサイトで答えをみて見比べて進めたいと思います。
左が私の自前で右が正答例です。
違う行に黄色塗りして、違う個所を赤字にしています。
いきなり違いますね。
idx=find(R(j,:)==1)
と
idx=find(R(:,j)==1)
の違いをj=1のときでみてみます。
忘れたのでY,Rもみました。
このY、Rについてのidxが↓です。
となりました。
図で書いてみると
これはidx=find(R(j,:)==1)は横に取り出して
idx=find(R(:,j)==1)は縦に取り出していることになります。
Yは横が映画で縦がユーザーでした。
そしてThetaはユーザーのパラメーターだから
ユーザーの縦列を取り出しているのかもしれません。
ふっと思いましたが、縦の3番目と4番目はそれぞれ
ユーザー3とユーザー4に該当しますが、全部0なので
彼らはレビューしたことがないということになりますね。
続いて3行目以降をみていきます。
X_tempは同じですね。
Theta_tempはないということですね。
Y_tempの取り出し方も違います。
さっきと同じように、縦と横の違いだと思いますが、確かめてみます。
やはりそうでした。
続いて6行目をみます。
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パートが終わりました!今日はおいしいお酒が飲めそうです!
次回は新しい課題に取り組みます!