今回はGradient Decentに取り組みます。
個人的にはGradient Decentが一番難しくてわからないです。
1周終わっても同じです。
それはさておき、まずは問題文を読んでみます。
Loop Structureは既に用意されていて、
ΘのUpdateの式にのみ注力すればいいようです 。
Jはθでのみ変化することが説明されています。
X,yでは変化しないことが説明されています。
Jが正しく計算されていることを確認するために、
計算ステップでJが減少していっていることを確認しなさいと書いてあります。
計算が正しくできるとこのグラフが作成されると書いてあります。
問題文はここで終わっていますので
プログラム詳細版gradientDescent.mをみてみます。
gradientDescent.mはX,y,theta,alpha,num_itersを入力すると
thetaとJ_historyが計算される式です。
thetaは入力にも計算結果にもいるのは謎です。
おそらく式↓の左辺にも右辺にも入っているからだとは思います。
続いてgradientDescent.mを上から順に見ていきます。
m=length(y)で、個数が設定されています。
num_itersはex1.mでiterationとなっているので、1500になります。
ということでJ_historyは全要素が0になっている1500X1のベクトルです。
J_historyは計算する前から0と答えがわかっているということでしょうか。。。
と1周目の時に思っていました。(何をやっているかは後段に記します)
そしてloopが組まれています。
1から1500をループするということですね。
YOUR CODE HEREに自分で式を入れるということですね。
J_history(iter)=ComputeCost(X,y,theta)の意味が1周目ではわかりませんでしたが
これはループシュミレーションの履歴取り出しです。
1から1500までループさせて計算させるわけですが、
その1回1回ごとにthetaが計算されます。
thetaがあればJが計算できます。
JはXとthetaで予測値を出したものとyとの差分を見るものだからです。
1回1回計算結果をみるので1500の計算結果があります。
この1500の計算結果を先に紹介した『J_historyは全要素が0になっている
1500X1のベクトルです。』に上書きしていきます。
最初は0ですが、1回1回の計算結果が上書きされていき、
1500の計算結果が見えるようになります。
最初にJ_history = zeros(num_iters, 1)とするのは
形を固定しておくという役割があるように思います。
この辺はループシュミレーションの履歴取り出しだけを書いた日記を
作成したのでこちらも読んでみてください。
というわけでYOURCODEHEREに戻ります。
これをプログラミングしなさいということですね。
Θjってなんだろうと思うのですが、それは置いときます。
1周目の時、ふと気づきました。
作らなければならない↑の式の赤で囲った部分が、
Costfunctionで作った↓の式の赤で囲った部分と同じです。
この部分は(1/m)*(X*theta-y)ですので、(97X1のベクトルですね)
これを基にすると
theta = theta – alpha *(1/m)*(X*theta-y)*X
になります。小文字のjを無視しています。
これで正解になりました!
小文字のjはわからないですがとりあえず正解にはなりました。
問題文に 『Jが正しく計算されていることを確認するために、
計算ステップでJが減少していっていることを確認しなさい』と書いてあります。
J_historyがちゃんと減っていっているのか↓の式で検証してみます。
結果です↓
4.4799から4.477へと
収束しています
そのときのthetaは↓です。
あまり収束した感じがないのでもう一つ実験してみます。
thetaを(0,0)に初期設定しました。
先ほどとは出発点が異なるはずです。
6.7372から4.4834へと
収束しています
そのときのthetaは↓です。
異なる値になりました。
収束が部分収束になるかもしれないと
Videoでいっていましたがこういうことなんだと思います。
今回はここまでです。
次回は計算結果にもとづく予測結果に取り組みます!