Coursera Machine Learning Week5 課題 2周目④ Costfunction ループ有り
④前回に引き続き↓に取り組んでいきます。
without Regularizationなので、
これ↑を式にして、Jが0.287629になることが目標です。
まずはヒントに合った通り、loopを使う前提で解いていきたいと思います。
loopでk=1のとき、k=2のとき、k=3のとき、・・・・k=10のときとするので、
まずはk=1のときを考えてみます。
考えるのはとの2つです。
まずです。 k=1なので↓のように直したいです。
Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記
で振り返ったように、↓が役立つはずです。
実行してみました。
y ==1
1以外の部分は『0』になりました。
1つ問題に気づきました。
y自体は変更されていません。
y==1はyを上書きはしていないということに気づきました。
↓の例を作ってみました。
上段でaを1~10で設定しました。
中段でa==1で1以外の場所を0に変更しています。
下段で再度aを呼び出しました。
中段になれば上書きですし、上段になれば上書きでないということです。
上書きでないという証明になりました。
ということは『==』機能は上書きではないので、
中段でデータを保持できないことになります。
これはCost Functionの計算に差支えがあります。
yをy==1に置き換えた値とを引き算したいからです。
ネットで調べたところ、B=a==1というような数式ではありえないような
式をいれると↓
Bでデータを保持されることがわかりました。
なのでy_Vec = 1==yとして、
と必要だったものが作成されます。
次にです。これはWeek4の課題と同じです↓
Coursera Machine Learning Week4 課題 2周目⑩ -苦闘記憶- Neural Network③ - 暇人日記
この↑の構造を計算するとOutput Layerが5000X10と計算されます。
ここで1つ問題があります。
はK=1のとき、5000X1です。
なので、=Output Layerも5000X1にする必要があります。
が、今はOutput Layerは5000X10です。
5000X1にしなければならないので1行目を選択します。
↓だと思ったからです。
ただよく考えるとNeural Networkでは1行目が1の予測をしているかどうか
ってどうしてわかるんだろう、とハタと悩みました。
1行目は2の予測でも3の予測でもいいような気がします。
FeedForwardでは確証がないのですが、
Backpropagationで誤差検証するからいいのかなと思いました。
今、k=1のときのYとOutput Layerの1行目の誤差を計算しても
きっと大きいはずです。
Theta1/Theta2は与えられたもので最適でないはずだからです。
そして現実の問題もThetaの最適値が最初から分かっていることはないはずです。
いわばFeedForwardは当て馬だなと思いました。
その当て馬のFeedForwardで計算しても、それが最適かどうかわかるはずがないので、
Backpropagationがあるのかなと思いました。
Output Layerから1行目を取り出すのは
Output Layer(:,1)とすると↓のように取り出せるはずです。
これでk=1のときのの5000X1ができました。
ということは↓の計算ができるはずです。
この計算はlogisitic RegressionのCostFunctionそのままでWeek3の課題でした↓
Week3の課題のLogistic RegressionのCost Functionをコピペしました!
今度はこの単品のLogistic Regression(上の段)を複数のLogistic Regression(下の段)
にすればいいことになります。
これはKは1から10までなので
for i=1:k
end
で真ん中に単品のLogistic Regressionを挟めばいいはずです。
そうするとJはK=1のとき、K=2のとき、K=3のとき、・・・K=10のときと
10個のJが出るはずです。
この10個のJの取り出し方は↓の日記にまとめたのが役に立ちます。
Jは10個なので、
パターン①取り出すものが「値」です。(一覧がNX1になる)
が役に立ちます。
Jhistory=zeros(K,1)
と10X1の空ベクトルを用意すれば取り出せるはずです!
実行してみました!
取り出せました!
合計が目的通り0.28763になりました!
ただ、submitで合格すると正答するためには
sum(Jhisotry)が0.28763でなく、Jが0.28763になる必要があります。
色々な方法があると思いますが私は
単品Logistic RegressionをJpart、
ループシュミレーション取り出しの10X1をJhistory、
J=sum(Jhisotry)
としてみました。
(すみません、これで正解になるかどうかはわかりません。
一度修了しているせいか提出できず採点してもらえませんでした。
1回目はループ無しで解いたので、これでプログラミング的に正解かどうかが
わかりません)
今回はここまでです。次回はループを使わない方法にTryしてみます。