暇人日記

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

Coursera Machine Learning Week5 課題 2周目④ Costfunction ループ有り

④前回に引き続き↓に取り組んでいきます。

f:id:omoshiroamericanews:20200416142351p:plain

without Regularizationなので、

f:id:omoshiroamericanews:20200416142640p:plain

 これ↑を式にして、Jが0.287629になることが目標です。

 

まずはヒントに合った通り、loopを使う前提で解いていきたいと思います。

 

f:id:omoshiroamericanews:20200418191039p:plain

 

loopでk=1のとき、k=2のとき、k=3のとき、・・・・k=10のときとするので、

まずはk=1のときを考えてみます。

 

考えるのはf:id:omoshiroamericanews:20200410113304p:plainf:id:omoshiroamericanews:20200410113338p:plainの2つです。

 

まずf:id:omoshiroamericanews:20200410113304p:plainです。 k=1なので↓のように直したいです。

 

f:id:omoshiroamericanews:20200418225645p:plain

Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記

で振り返ったように、↓が役立つはずです。

 

f:id:omoshiroamericanews:20200418225826p:plain

実行してみました。

y ==1

 

1以外の部分は『0』になりました。

f:id:omoshiroamericanews:20200423115228p:plain

1つ問題に気づきました。

y自体は変更されていません。

 

f:id:omoshiroamericanews:20200423115314p:plain

 

y==1はyを上書きはしていないということに気づきました。

↓の例を作ってみました。

 

f:id:omoshiroamericanews:20200423115520p:plain

上段でaを1~10で設定しました。

中段でa==1で1以外の場所を0に変更しています。

下段で再度aを呼び出しました。

中段になれば上書きですし、上段になれば上書きでないということです。

上書きでないという証明になりました。

ということは『==』機能は上書きではないので、

中段でデータを保持できないことになります。

 

これはCost Functionの計算に差支えがあります。

yをy==1に置き換えた値とf:id:omoshiroamericanews:20200410113338p:plainを引き算したいからです。

 

ネットで調べたところ、B=a==1というような数式ではありえないような

式をいれると↓

f:id:omoshiroamericanews:20200423120255p:plain

Bでデータを保持されることがわかりました。

 

なのでy_Vec = 1==yとして、

 

f:id:omoshiroamericanews:20200418230325p:plain

f:id:omoshiroamericanews:20200418230427p:plain


と必要だったものが作成されます。

 

次にf:id:omoshiroamericanews:20200410113338p:plainです。これはWeek4の課題と同じです↓

Coursera Machine Learning Week4 課題 2周目⑩ -苦闘記憶- Neural Network③ - 暇人日記

 

f:id:omoshiroamericanews:20200418231010p:plain

この↑の構造を計算するとOutput Layerが5000X10と計算されます。

 

ここで1つ問題があります。

f:id:omoshiroamericanews:20200410113304p:plainはK=1のとき、5000X1です。

なので、f:id:omoshiroamericanews:20200410113338p:plain=Output Layerも5000X1にする必要があります。

 

が、今はOutput Layerは5000X10です。

 

5000X1にしなければならないので1行目を選択します。

↓だと思ったからです。

f:id:omoshiroamericanews:20200418234847p:plain

ただよく考えるとNeural Networkでは1行目が1の予測をしているかどうか

ってどうしてわかるんだろう、とハタと悩みました。

 

f:id:omoshiroamericanews:20200411101314p:plain

1行目は2の予測でも3の予測でもいいような気がします。
FeedForwardでは確証がないのですが、

Backpropagationで誤差検証するからいいのかなと思いました。

今、k=1のときのYとOutput Layerの1行目の誤差を計算しても

きっと大きいはずです。

Theta1/Theta2は与えられたもので最適でないはずだからです。

そして現実の問題もThetaの最適値が最初から分かっていることはないはずです。

 

いわばFeedForwardは当て馬だなと思いました。

その当て馬のFeedForwardで計算しても、それが最適かどうかわかるはずがないので、

Backpropagationがあるのかなと思いました。

 

Output Layerから1行目を取り出すのは

Output Layer(:,1)とすると↓のように取り出せるはずです。

 

f:id:omoshiroamericanews:20200418235826p:plain

f:id:omoshiroamericanews:20200418235841p:plain

これでk=1のときのf:id:omoshiroamericanews:20200410113338p:plainの5000X1ができました。

ということは↓の計算ができるはずです。

f:id:omoshiroamericanews:20200419000620p:plain

 

この計算はlogisitic RegressionのCostFunctionそのままでWeek3の課題でした↓

 

Week3の課題のLogistic RegressionのCost Functionをコピペしました!

 

今度はこの単品のLogistic Regression(上の段)を複数のLogistic Regression(下の段)

にすればいいことになります。

f:id:omoshiroamericanews:20200419001103p:plain

 

これはKは1から10までなので

for i=1:k

end

で真ん中に単品のLogistic Regressionを挟めばいいはずです。

 

そうするとJはK=1のとき、K=2のとき、K=3のとき、・・・K=10のときと

10個のJが出るはずです。

 

この10個のJの取り出し方は↓の日記にまとめたのが役に立ちます。

www.courseradaisuki.com

 

Jは10個なので、

パターン①取り出すものが「値」です。(一覧がNX1になる)

が役に立ちます。

 

Jhistory=zeros(K,1)

と10X1の空ベクトルを用意すれば取り出せるはずです!

実行してみました!

f:id:omoshiroamericanews:20200419001740p:plain

取り出せました!

f:id:omoshiroamericanews:20200419001808p:plain

合計が目的通り0.28763になりました!

 

ただ、submitで合格すると正答するためには

sum(Jhisotry)が0.28763でなく、Jが0.28763になる必要があります。

 

色々な方法があると思いますが私は

単品Logistic RegressionをJpart、

ループシュミレーション取り出しの10X1をJhistory、

J=sum(Jhisotry)

としてみました。

(すみません、これで正解になるかどうかはわかりません。

 一度修了しているせいか提出できず採点してもらえませんでした。

 1回目はループ無しで解いたので、これでプログラミング的に正解かどうかが

   わかりません)

 

今回はここまでです。次回はループを使わない方法にTryしてみます。