暇人日記

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

Coursera Machine Learning Week2 課題 2周目④ -苦闘記憶- Gradient

今回はGradient Decentに取り組みます。

 

 f:id:omoshiroamericanews:20200103145551p:plain

 

個人的にはGradient Decentが一番難しくてわからないです。

1周終わっても同じです。

 

それはさておき、まずは問題文を読んでみます。

 

f:id:omoshiroamericanews:20200103145828p:plain

 

Loop Structureは既に用意されていて、

ΘのUpdateの式にのみ注力すればいいようです 。

 

f:id:omoshiroamericanews:20200103150138p:plain

 

Jはθでのみ変化することが説明されています。

X,yでは変化しないことが説明されています。

 

f:id:omoshiroamericanews:20200103150252p:plain

Jが正しく計算されていることを確認するために、

計算ステップでJが減少していっていることを確認しなさいと書いてあります。

 

f:id:omoshiroamericanews:20200103150439p:plain

  

計算が正しくできるとこのグラフが作成されると書いてあります。

 

問題文はここで終わっていますので

プログラム詳細版gradientDescent.mをみてみます。

 

f:id:omoshiroamericanews:20200103150922p:plain

 

gradientDescent.mはX,y,theta,alpha,num_itersを入力すると

thetaとJ_historyが計算される式です。

thetaは入力にも計算結果にもいるのは謎です。

おそらく式↓の左辺にも右辺にも入っているからだとは思います。

f:id:omoshiroamericanews:20200103151042p:plain

 

続いて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に戻ります。

 

f:id:omoshiroamericanews:20200103151042p:plain

これをプログラミングしなさいということですね。

Θjってなんだろうと思うのですが、それは置いときます。

 

 

1周目の時、ふと気づきました。

 

f:id:omoshiroamericanews:20200103151608p:plain

作らなければならない↑の式の赤で囲った部分が、

Costfunctionで作った↓の式の赤で囲った部分と同じです。

 

f:id:omoshiroamericanews:20200103151652p:plain

 

この部分は(1/m)*(X*theta-y)ですので、(97X1のベクトルですね)

これを基にすると

theta = theta – alpha *(1/m)*(X*theta-y)*X

になります。小文字のjを無視しています。

 

これで正解になりました!

 

小文字のjはわからないですがとりあえず正解にはなりました。

 

問題文に 『Jが正しく計算されていることを確認するために、

計算ステップでJが減少していっていることを確認しなさい』と書いてあります。

 

J_historyがちゃんと減っていっているのか↓の式で検証してみます。

f:id:omoshiroamericanews:20200103152114p:plain


結果です↓

f:id:omoshiroamericanews:20200103152219p:plain

4.4799から4.477へと

収束しています

そのときのthetaは↓です。

f:id:omoshiroamericanews:20200103152305p:plain

 

 

あまり収束した感じがないのでもう一つ実験してみます。

 

f:id:omoshiroamericanews:20200103152356p:plain

thetaを(0,0)に初期設定しました。

先ほどとは出発点が異なるはずです。

 

f:id:omoshiroamericanews:20200103152453p:plain

 

6.7372から4.4834へと

収束しています

そのときのthetaは↓です。

f:id:omoshiroamericanews:20200103152601p:plain

異なる値になりました。

 

収束が部分収束になるかもしれないと

Videoでいっていましたがこういうことなんだと思います。

 

今回はここまでです。

次回は計算結果にもとづく予測結果に取り組みます!