暇人日記

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

Week2の課題(家の値段)をNeural Networkで解いてみる-後編①-

CourseraにはDiscussion Forumなるものがありまして、

そこにNeural NetworkでLinear Regressionを解こうとした問い合わせがないか

検索してみました。

 

その中の1つにVideoのレクチャーノートのボーナスにそれについて

触れてあるものがあるとありました。

 

読んだところ、具体的な変更方法が記載されていて

 

①num_labels(=output layer)は削除。

 ただしThetaやnn_paramsで使われている箇所は1へ変更

②yは47X1を無理やり47X10にすることなく、47X1で

 y-a3をすること

③hiden layerでは依然としてnon linearにしておくこと

 Sigmoidを使うということかなと思っていたら、

④Sigmoidの代わりにtanh関数を使うこと

 tanh関数は導入すると-1から1の間に収まる関数ということです。

 (Sigmoidは0-1の間に収まる関数でした)

⑤Backpropagationの中のSigmoid関数のGradientの代わりに↓のtanh関数の

 Gradientを使うこと

f:id:omoshiroamericanews:20200708225440p:plain

⑥Feedforwardのoutput layerであるa(3)にはsigmoidもtanhも使わないこと。

⑦JはRegularizationでない部分はLinear RegressionのCostFunctionを使い、

 Regularizationの部分はWeek5と同じにすること

 

とありました。

 

Errorが出て修正してErrorが出て修正してを繰り返して

プログラムが実行されました↓

 

f:id:omoshiroamericanews:20200708224550p:plain

 

やった!できました!

 

さっそく予測しようと思いましたが、予測する前にX側のデータを

FeatureNormalizeしておこうと思いました。

f:id:omoshiroamericanews:20200704151135p:plain

これは今回のX側のデータのように↑、データの桁数がばらついていると

計算時間が長くなるので、Xのデータを行ごとに平均値を出して、

データ個々-平均値を計算して、標準偏差で割るというものでした。

Week2の課題でアドバイスされていたのでそれにのっとります。

 

具体的には行ごとの平均値です↓

f:id:omoshiroamericanews:20200711143925p:plain

 

データ個々-平均値です↓

f:id:omoshiroamericanews:20200711144019p:plain

 

行ごとの標準偏差です↓

f:id:omoshiroamericanews:20200711144100p:plain

 

行ごとに割ったものです↓

f:id:omoshiroamericanews:20200711144135p:plain

 

FeatureNormalizeしてもGradinent Checkingが大丈夫かどうか

念のため確認してみました↓

f:id:omoshiroamericanews:20200711144258p:plain

大丈夫でした!

 

CostFucntion/Gradientがそろったので最適θをfmincgで計算して予測してみます!

f:id:omoshiroamericanews:20200711144739p:plain

左が予測値で、右が答えだったので大幅なずれです泣

 『ついにLinear RegressionでもNeuralNetworkを使えるようになりました!

 感動です泣

 

 次回はちょっと前にやっていたコロナ感染者予測にあてはめることを

 別の日記でやってみたいと思います。』

 

というフィナーレを思っていたのですが、延期です。。。

 

なぜgradient ChekingはOKなのに予測がダメダメなんだろう。

 

また次回取り組みます。