今回はoneVSAll.mに取り組みます。
前回までRegularized Logistic Regressionに取り組んでいました。
One VS Allは↓のような
Logistic Regressionでできる0か1の答えを場合分けして(K=1のとき、K=2のとき、・・・・)いくものだとVIDEOで言っていたので、
作ったLogistic Regressionをループの場合分けで計算していくものと思います。
今回の課題では数字は0から9まで10パターンあるので、
10個の場合分けのループになると思います。
問題文にもK=10なので10個の場合分けとあります。
forでるループをして1から10のループをしなさいとあります。
yは1から10になっていて、10は「0」と認識するとあります。
そういえばまだyのデータを見たことがなかったので見てみました↓
最初の方は全て10で、
途中ですべて2という箇所もありました。
ランダムに100取り出さずに最初の100行とすると、
全て0だったんじゃないかと思います。
問題文が難しくて読めなくなったので一度解法をイメージしてみることにします。
K=1について、5000行全てをthetaを用いて予測値を出して、
それをyと引き算して誤差(=J)が最も小さい最適thetaを計算すると思います。
つづいてK=2についても同様に5000行全てをthetaを用いて予測値を出して、
それをyと引き算して誤差(=J)が最も小さい最適thetaを計算すると思います。
K=1のときの最適thetaとK=2のときの最適thetaは違うはずです。
これをK=10まで行うので、10個の最適thetaが計算されると思いました。
10個の最適thetaで各行で計算して最も1に近いものを採用する、
という構造と推測しました。
という仮説のもと、進んでみます。
問題文に戻ります。
classKに属しているかどうかを判断するためには
yが0か1でclassKに属しているかどうかを示すm次元のベクトルが必要と書いてあります。0か1はlogistic Regressionで行うということですね。
logical arraysが役に立つとヒントがあります。
logical arraysの説明が↓です。
最後の3行をプログラミングして実験してみなさいという指示があるので
やってみました↓
なるほど。
a=bとなっている3のところが1になって、他の場所が0になるプログラミング式ということですね。
これを使って問題を解決できるというアドバイスだと思いますが、
ピンときません。
問題文を読み進めます。
Week3の課題ではfminuncを使用しましたが、fmincgを使いなさいという指示が
出ました。 fmincgの方が多くのパラメーターを使う際にはfminuncより効率的だと
説明されています。
ここでプログラム詳細版oneVsAll.mを完成させてくださいという指示になっています。
oneVsAll.mをみてみます。
X,y,num_labals,lambdaを入力するとall_thetaを計算してくれる関数のようです。
lrCostFunction.mと見比べてみると違いますね。
num_labalsって何だろう?と思ってプログラム全体ex3.mを見てみました↓
数字の0-9を表しているようですね。
ということは
入力値のX,y,num_labals,lambdaは見当がついたので、
これはall_thetaというthetaを計算する関数と推測しました。
thetaを計算するためにはJとgradが必要なので、
前回の日記で行ったlrCostFunction.mを使用することになるはずです。
今回はここまでです。また次回頑張ります!