今回はcostFunction.mに取り組んでみます。
costFunction.mは①『Compute cost for logistic regression』と
②『Gradient for logistic regression』に分かれていますが、
①の『Compute cost for logistic regression』に取り組んでみます。
・問題文
・プログラム全体ex2.m
・プログラム詳細costfunction.m
の順にみていきます。
まず、問題文です↓
(出典;『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で比較してみました↓
『Compute cost for logistic regression』は
予測値とSampleの誤差を全部足したもので、
合計が一番小さいものが一番精度がいいよね、というものです。
Logistic Regressionは0か1で判断したいので
『Compute cost for logistic regression』 の式の見た目がかなり変わっています。
この式は2つの式↓を合体させたものとVideoで説明されていました。
絵にすると↓になると思います。
赤枠の「y=0のとき0になる」、青枠の「y=1のとき0になる」を利用して
式を合体させています。
赤枠と青枠の部分が何だったかというと↓
は0から1の間しかとらない関数なので
横軸が0~1の間しか
設定されていないということですね。
『Compute cost for logistic regression』部分に取り組んでいるわけですが、
『Compute cost for logistic regression』は予測値とSampleの誤差を見てるものになり、
誤差が小さければ小さいほど精度が高いというものです。
そういう目線でみると、このlogのグラフはy=1がわかっているSampleについて
予測値が0.9などで1に近いときほど誤差(=1-予測値)が小さくなります。
予測値が0.1などで1から遠いときほど誤差が大きくなります。
この意味で予測値とSampleの誤差を計算できる関数だと思います。
こちらも同じで、↑のグラフはy=0がわかっているSampleについて
予測値が0.1などで0に近いときほど誤差(=0-予測値)が小さくなります。
予測値が0.9などで1から遠いときほど誤差が大きくなります。
すごいなと思うのは、よくこんな都合のいい関数を見つけてきたなと思います。
Y=0のときに誤差を計算するのに欲しいのは
横軸が0のときに縦軸も0で横軸が1のときに縦軸は無限となるグラフがあれば
便利なわけで、
まさに↑の形のグラフが欲しいわけですが、
それが見事に見つけたことがすごいと思いました!
振り返りはここまでにして、先に進みたいと思います。
続いてプログラム全体ex2.mを見ましたが、
Costfunction.mについてヒントはありませんでした。
続いてプログラム詳細版のcostFunction.mです。
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と比較してみたいと思います。
Week2はComputeCost.mでX,y,thetaを入力するとJが計算される関数でした。
今回のcostfunction.mはtheta,X,yを入力したら、
Jとgradが計算される関数となっているので、
Week2に比べるとgradが追加された形です。
gradという単語はWeek2の課題の中では出てきていません。
ただ、gradientからきていると思われます。
gradの謎は置いておいて、引き続きJに集中したいと思います。
Jはさっきの振り返りの通りなので、↓の関係になっています
データは100人のTEST1/2の点数と合否の結果です。
今回の予測と誤差を絵にすると、
Xを基にした予測値とYの引き算をするのはWeek2と同じですが、
Xを基にした予測値はSigmoidのおかげで0と1の間にあります。
引き算もY=1の時の誤差とY=0の時の誤差を分離するため、
Y=1の時の誤差を計算する時にY=0のSampleについては誤差が
0になるように仕掛けがされて誤差を計算するlogに放り込みます。
という概念を頭に入れて、プログラミングを考えてみると、
Jは、
と変更すればよいのかと思いました。
Y=0のSampleは0で計算されて誤差として勘定しなくていい分が
勘定されないようになります。
ベクトル的には↓
は、1X100になってほしいですけど、100X1になりそうだと思いました。
Week2と同様にXのTEST1とTEST2には1行すべての要素が1のベクトルを追加します。
これによりXは100X3のベクトルなのでthetaは3X1のベクトルになります。
問題文でinitial thetaは0 0 0で設定されているので、同様にします。
するとX *thetaは全て0になるはずです。
実行してみました↓
やはり、そうなりました。
100X1のベクトルですべて0です。
なってました。100X1のベクトルですべて0.5です。
次にこの0.5のベクトルをLogに放り込んでみました↓
100X1のベクトルでした。
となると、ベクトルの形でエラーが出ると思います。
やってみました↓
やはりエラーが出ますね。
どちらかを転置するしかないと判断しました。
Yを転置すれば1X100と100X1のベクトルの計算で
辻褄が合うように思いましたので計算してみると↓
問題文の数字↑と一致しました!
今回はここまでです。次回はgradに取り組みたいと思います。