暇人日記

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

Coursera Machine Learning Week4 課題 2周目③ -苦闘記憶-  One vsALL①

今回はoneVSAll.mに取り組みます。

f:id:omoshiroamericanews:20200224195258p:plain

前回までRegularized Logistic Regressionに取り組んでいました。

 

 

One VS Allは↓のような

 

f:id:omoshiroamericanews:20200224195533p:plain

f:id:omoshiroamericanews:20200224195543p:plain

Logistic Regressionでできる0か1の答えを場合分けして(K=1のとき、K=2のとき、・・・・)いくものだとVIDEOで言っていたので、

作ったLogistic Regressionをループの場合分けで計算していくものと思います。

 

今回の課題では数字は0から9まで10パターンあるので、

10個の場合分けのループになると思います。

 

f:id:omoshiroamericanews:20200224200044p:plain

f:id:omoshiroamericanews:20200224200052p:plain

問題文にもK=10なので10個の場合分けとあります。

forでるループをして1から10のループをしなさいとあります。

yは1から10になっていて、10は「0」と認識するとあります。

 

そういえばまだyのデータを見たことがなかったので見てみました↓

 

f:id:omoshiroamericanews:20200224200400p:plain

最初の方は全て10で、

f:id:omoshiroamericanews:20200224200602p:plain

途中ですべて2という箇所もありました。

 

ランダムに100取り出さずに最初の100行とすると、

全て0だったんじゃないかと思います。

 

問題文が難しくて読めなくなったので一度解法をイメージしてみることにします。

 

f:id:omoshiroamericanews:20200224215346p:plain

f:id:omoshiroamericanews:20200224215445p:plain

 

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に近いものを採用する、

という構造と推測しました。

 

f:id:omoshiroamericanews:20200224221454p:plain


という仮説のもと、進んでみます。

 

 

 

 

問題文に戻ります。

f:id:omoshiroamericanews:20200226212815p:plain

classKに属しているかどうかを判断するためには

yが0か1でclassKに属しているかどうかを示すm次元のベクトルが必要と書いてあります。0か1はlogistic Regressionで行うということですね。

logical arraysが役に立つとヒントがあります。

logical arraysの説明が↓です。

 

f:id:omoshiroamericanews:20200226213510p:plain

最後の3行をプログラミングして実験してみなさいという指示があるので

やってみました↓

 

f:id:omoshiroamericanews:20200226213859p:plain

なるほど。

a=bとなっている3のところが1になって、他の場所が0になるプログラミング式ということですね。

 

これを使って問題を解決できるというアドバイスだと思いますが、

ピンときません。

 

問題文を読み進めます。

f:id:omoshiroamericanews:20200226214027p:plain

Week3の課題ではfminuncを使用しましたが、fmincgを使いなさいという指示が

出ました。 fmincgの方が多くのパラメーターを使う際にはfminuncより効率的だと

説明されています。

 

ここでプログラム詳細版oneVsAll.mを完成させてくださいという指示になっています。

 

oneVsAll.mをみてみます。

f:id:omoshiroamericanews:20200226215039p:plain

X,y,num_labals,lambdaを入力するとall_thetaを計算してくれる関数のようです。

 

lrCostFunction.mと見比べてみると違いますね。

f:id:omoshiroamericanews:20200226215407p:plain

 

num_labalsって何だろう?と思ってプログラム全体ex3.mを見てみました↓

 

f:id:omoshiroamericanews:20200226215544p:plain

 

数字の0-9を表しているようですね。

 

ということは

入力値のX,y,num_labals,lambdaは見当がついたので、

これはall_thetaというthetaを計算する関数と推測しました。

 

thetaを計算するためにはJとgradが必要なので、

前回の日記で行ったlrCostFunction.mを使用することになるはずです。

 

今回はここまでです。また次回頑張ります!