暇人日記

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

Coursera Machine Learning Week3 2周目⑧ -苦闘記憶- RegularizationのCost Function&Gradient

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

 

f:id:omoshiroamericanews:20200131172018p:plain

テーマはRegularizationです。

Regularizationは予測があたりすぎのOverfitの状態を解消するための方法でした。

 

f:id:omoshiroamericanews:20200131172204p:plain

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

 

一番右のOverfitの状態を真ん中のJust rightに戻す手法がRegularizationですね。

一番左のUnderfitの状態を真ん中へ戻せないと思います。

色々実験した結果、そう思っています↓

Week2の課題でRegularizationを使用するとJは小さくなるか? - 暇人日記

 

では、問題文を読んでいきます。

 

f:id:omoshiroamericanews:20200131172552p:plain

製品の品質TESTに関する問題です。

2つのTESTを行っている製品がOKかNGだったかを判断するという

問題になっています。

 

まずdatasetを見ます↓

118個のSampleがあり2つの試験と合否の結果がSetになってます。

 

f:id:omoshiroamericanews:20200131174318p:plain

Xは1から-1の間をとっています。

 

これをグラフにするとこうなると説明されています↓

 

f:id:omoshiroamericanews:20200131174401p:plain

 

グラフにする方法は前回の課題の試験の合否の方法と同じですね↓

Coursera Machine Learning Week3 課題 2周目① -苦闘記憶- データのグラフ化 - 暇人日記

 

さて、問題文には今回の品質問題の分布は直線では良い境界線をひくことが

できないと説明されています。

 

見た目からするとその通りですね。境界線は円が良いように見えます。

 

直線ではいい境界線が作れないので、曲線にするために

Polynomial(=多項式化)が紹介されています↓

 

f:id:omoshiroamericanews:20200131174742p:plain

Week2の課題でPolynomial=多項式化するとどうなるか?-前半- - 暇人日記

Polynomial(=多項式化)については↑のリンクでやった内容になりますね。

今回はdegreeを6なので6乗を最高としてXはTEST1/TEST2の2つの要素だったのに

28個の要素まで引き上げています。

 

境界線を直線ではなく曲線にすることができたので、

Compute for CostFunctionに取り組むます。

 

問題文です↓

f:id:omoshiroamericanews:20200131175213p:plain

 

これをRegularlizationがないJの式↓と比べてみると、

 

f:id:omoshiroamericanews:20200131175410p:plain

 

この部分が↓変わったことがわかります。

 

f:id:omoshiroamericanews:20200131175619p:plain

 

λ/2mは定数なのでこの部分↓が計算できれば完了となります。

 

f:id:omoshiroamericanews:20200131175648p:plain

 

この部分はθの2乗を合計すればいいことになります。

今回はFeatureを28個にしているので、

 

f:id:omoshiroamericanews:20200131175708p:plain

 

のxが28だからθは28X1のベクトルになります。

 

f:id:omoshiroamericanews:20200131175725p:plain

 

このベクトルで各要素を2乗して合計すればいいということですね。

 

f:id:omoshiroamericanews:20200131175757p:plain

あとはこれをSumで合計すればいいですね。

 

と思って提出したら間違いでした。

Videoを見返しました。

 

f:id:omoshiroamericanews:20200131175845p:plain

 

これですね。

Θの1番最初を削除する必要があるんでした。

↓の入力でθの1番最初が取り出せるので

f:id:omoshiroamericanews:20200131175911p:plain

これを2乗したもの引き算すればOKですね。

 提出したら正解になりました!

 

また正しく計算されるとJ=0.693になると問題文にあるのですが↓

f:id:omoshiroamericanews:20200131180659p:plain

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

 

その通りの計算結果になりました!

f:id:omoshiroamericanews:20200131180809p:plain

 

続いてGradientです。

 

Regularizationに書かれているGradientの式は↓です。

 

f:id:omoshiroamericanews:20200131180928p:plain

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

 

これをRegularlizationがないGradientの式↓と比べてみると、

f:id:omoshiroamericanews:20200131181108p:plain

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

 

2行に分かれたこととが

f:id:omoshiroamericanews:20200131181458p:plainが足されたことが違いです。

 

とはいえ、1周目のときも今もgradを完全に理解していないので、

ここからはググった答えから逆算して考えたことも多いです。

 

そして1周目で得た経験から考えていることも多いです。

 

まずgradですがthetaが28X1のベクトルならgradも28X1と一致するということを

1周目の他のWeekの課題から得ています。

 

一番最初のθを計算しない=0でカウントすればいい、という考えでいいと思います。

一度場合分けせずに28X1のgradを計算しきってから、

一番最初のgradを0にするという考えでいいと思います。

 

f:id:omoshiroamericanews:20200131182212p:plain

 

この部分↑は前回の合格の合否の時の計算式と同じなので、

f:id:omoshiroamericanews:20200131182344p:plain

この部分だけを考えればいいと考えました。

 

θは28X1のベクトルでgrad(=f:id:omoshiroamericanews:20200131182524p:plain)も28X1のベクトルのままなので、

(λ/m)X θをそのまま計算すればOKのはずです。

 

一番最初のθを0にして

theta(1)=0

としたいところですが、

f:id:omoshiroamericanews:20200131184010p:plain

↑の部分にもθが入っているのでよくありません。

 

こういうイメージです↓

f:id:omoshiroamericanews:20200131184227p:plain

 

これを実現するためにkeisanyouで28X1のベクトルで最初が0、残りは1を

作ります。これを28X1のthetaとかければ先頭行だけが0になります!

f:id:omoshiroamericanews:20200131184809p:plain

これで正解になりました!

というかググって答えをみた私の解釈が↑です笑

 

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