暇人日記

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

Coursera Machine Learning Week3 課題 2周目③ -苦闘記憶- Compute Cost for CostFunction

今回はcostFunction.mに取り組んでみます。

costFunction.mは①『Compute cost for logistic regression』と

②『Gradient for logistic regression』に分かれていますが、

①の『Compute cost for logistic regression』に取り組んでみます。

 

f:id:omoshiroamericanews:20200125114413p:plain

 

 

・問題文

・プログラム全体ex2.m

・プログラム詳細costfunction.m

の順にみていきます。

 

まず、問題文です↓

 

f:id:omoshiroamericanews:20200125114546p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

枠で囲ったように

『Compute cost for logistic regression』と『Gradient for logistic regression』に

分かれています。

 

まず、 『Compute cost for logistic regression』部分に集中して取り組みます。

書いてある式はVideoでも説明されていた式です。

そして完成させてプログラミングで計算させると0.693という答えが出ると

説明されていますので0.693が出ることをゴールにやってみます。

 

 

そもそもLogistic Regressionの『Compute cost for logistic regression』

って何だったけ?と思いましたので、自分なりのサマリーをしてみたいと思います。

 

『Compute cost for logistic regression』の式を

Linear RegressionとLogistic Regressionで比較してみました↓

 

f:id:omoshiroamericanews:20200125114729p:plain

 

『Compute cost for logistic regression』は

予測値とSampleの誤差を全部足したもので、

合計が一番小さいものが一番精度がいいよね、というものです。

 

Logistic Regressionは0か1で判断したいので

『Compute cost for logistic regression』 の式の見た目がかなり変わっています。

 

f:id:omoshiroamericanews:20200125114955p:plain

 

この式は2つの式↓を合体させたものとVideoで説明されていました。

 

f:id:omoshiroamericanews:20200125115112p:plain

 

 

 

絵にすると↓になると思います。

 

f:id:omoshiroamericanews:20200125115138p:plain

赤枠の「y=0のとき0になる」、青枠の「y=1のとき0になる」を利用して

式を合体させています。

 

赤枠と青枠の部分が何だったかというと↓

f:id:omoshiroamericanews:20200125115229p:plain

 

f:id:omoshiroamericanews:20200125115250p:plainは0から1の間しかとらない関数なので

横軸が0~1の間しか

f:id:omoshiroamericanews:20200125115326p:plain


設定されていないということですね。

 

『Compute cost for logistic regression』部分に取り組んでいるわけですが、

『Compute cost for logistic regression』は予測値とSampleの誤差を見てるものになり、

誤差が小さければ小さいほど精度が高いというものです。

 

f:id:omoshiroamericanews:20200125115455p:plain

そういう目線でみると、このlogのグラフはy=1がわかっているSampleについて

予測値が0.9などで1に近いときほど誤差(=1-予測値)が小さくなります。

予測値が0.1などで1から遠いときほど誤差が大きくなります。

この意味で予測値とSampleの誤差を計算できる関数だと思います。

 

f:id:omoshiroamericanews:20200125115603p:plain

こちらも同じで、↑のグラフはy=0がわかっているSampleについて

予測値が0.1などで0に近いときほど誤差(=1-予測値)が小さくなります。

予測値が0.9などで1から遠いときほど誤差が大きくなります。

 

すごいなと思うのは、よくこんな都合のいい関数を見つけてきたなと思います。

 

Y=0のときに誤差を計算するのに欲しいのは

横軸が0のときに縦軸も0で横軸が1のときに縦軸は無限となるグラフがあれば

便利なわけで、

 

f:id:omoshiroamericanews:20200125115716p:plain

 

まさに↑の形のグラフが欲しいわけですが、

それが見事に見つけたことがすごいと思いました!

 

 

振り返りはここまでにして、先に進みたいと思います。

続いてプログラム全体ex2.mを見ましたが、

Costfunction.mについてヒントはありませんでした。

 

続いてプログラム詳細版のcostFunction.mです。

 

f:id:omoshiroamericanews:20200125115832p:plain

 

costFunction.mはtheta,X,yを入力したら、Jとgradが計算される関数となっています。

 

gradって何だ?と思いました。

 

costFunction.mは『Compute cost for logistic regression』と

『Gradient for logistic regression』に分かれているので

Jが『Compute cost for logistic regression』で

gradが『Gradient for logistic regression』に相当すると考えました。

 

Week2と比較してみたいと思います。

 

f:id:omoshiroamericanews:20200125115945p:plain

 

Week2はComputeCost.mでX,y,thetaを入力するとJが計算される関数でした。

今回のcostfunction.mはtheta,X,yを入力したら、

Jとgradが計算される関数となっているので、

Week2に比べるとgradが追加された形です。

 

gradという単語はWeek2の課題の中では出てきていません。

ただ、gradientからきていると思われます。

gradの謎は置いておいて、引き続きJに集中したいと思います。

 

Jはさっきの振り返りの通りなので、↓の関係になっています

 

f:id:omoshiroamericanews:20200125120042p:plain

 

 

データは100人のTEST1/2の点数と合否の結果です。

 

f:id:omoshiroamericanews:20200125120210p:plain

 

今回の予測と誤差を絵にすると、

f:id:omoshiroamericanews:20200125120246p:plain

 

Xを基にした予測値とYの引き算をするのはWeek2と同じですが、

Xを基にした予測値はSigmoidのおかげで0と1の間にあります。

 

引き算もY=1の時の誤差とY=0の時の誤差を分離するため、

Y=1の時の誤差を計算する時にY=0のSampleについては誤差が

0になるように仕掛けがされて誤差を計算するlogに放り込みます。

 

という概念を頭に入れて、プログラミングを考えてみると、

Jは、

 

f:id:omoshiroamericanews:20200125120514p:plain

 

と変更すればよいのかと思いました。

 

f:id:omoshiroamericanews:20200125120553p:plain

Y=0のSampleは0で計算されて誤差として勘定しなくていい分が

勘定されないようになります。

 

ベクトル的には↓

 

f:id:omoshiroamericanews:20200125150216p:plain

は、1X100になってほしいですけど、100X1になりそうだと思いました。

 

Week2と同様にXのTEST1とTEST2には1行すべての要素が1のベクトルを追加します。

 

f:id:omoshiroamericanews:20200125150328p:plain

 

これによりXは100X3のベクトルなのでthetaは3X1のベクトルになります。

問題文でinitial thetaは0 0 0で設定されているので、同様にします。

 

するとX *thetaは全て0になるはずです。

実行してみました↓

 

f:id:omoshiroamericanews:20200125150402p:plain

やはり、そうなりました。

100X1のベクトルですべて0です。

 

f:id:omoshiroamericanews:20200125150425p:plain

 

f:id:omoshiroamericanews:20200125150446p:plain

f:id:omoshiroamericanews:20200125150501p:plain

なってました。100X1のベクトルですべて0.5です。

 

次にこの0.5のベクトルをLogに放り込んでみました↓

f:id:omoshiroamericanews:20200125150524p:plain

f:id:omoshiroamericanews:20200125150558p:plain

100X1のベクトルでした。

 

f:id:omoshiroamericanews:20200125150618p:plain

となると、ベクトルの形でエラーが出ると思います。

やってみました↓

 

f:id:omoshiroamericanews:20200125150649p:plain

 

やはりエラーが出ますね。

どちらかを転置するしかないと判断しました。

Yを転置すれば1X100と100X1のベクトルの計算で

辻褄が合うように思いましたので計算してみると↓

 

f:id:omoshiroamericanews:20200125150712p:plain

 

f:id:omoshiroamericanews:20200125150730p:plain

問題文の数字↑と一致しました!

 

今回はここまでです。次回はgradに取り組みたいと思います。