暇人日記

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

Neural Networkでコロナ感染者数を予測してみたときの躓きのまとめ

懲りずに線形回帰取り組んだ東京都コロナ感染者予測をNeural Networkでも

やってみようとトライしてみました。

 

が、結果は散々です泣

 

Week5の課題はLogistic RegressionのNeural Networkだったので、

これを頑張ってLinear RegressionのNeural Networkに変えようとしたのですが、

プログラミングが不正確なせいか全然精度が出ませんでした↓

 

f:id:omoshiroamericanews:20200426234211p:plain

 

Linear Regressionの方がはるかにましです。

コーセラ機械学習で学んだ線形回帰でコロナ感染者数を予測してみる(4/18時点)※4/24UPDATE有 - 暇人日記II

 

構造は↓のようにしました。

全部でLayerは3つ、Hidden LayerのUnitは3にしました。

f:id:omoshiroamericanews:20200426120026p:plain

躓いたところのまとめです。

 

X = [ones(m, 1) X]にするタイミング

nnCostFunction内でX = [ones(m, 1) X]をするので、本文中に足してはいけないが

Theta1のためには必要なので一度足して削除する。

 

**************************************************************************

X = [ones(m, 1) X]

 

Week5課題の完コピ↓

--------------------------------------------------------------------------------------

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params*1;
--------------------------------------------------------------------------------------
X=X(:,2:end);

**************************************************************************

 

nn_paramsの初期値の設定

Week5の課題ではTheta1/Theta2のサイズについてや与えられていましたが、

今回は考えなければなりません。

Reshapeで合致させながら、一般化しようと思って作ったのが↓の式です。

 

nn_params=randperm(size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels)

 

Logistic RegressionからLinear Regressionへの変更

①Model Representationではsigmoidはいらないので削除しました。

 

②Jの計算式をLogistic RegressionからLinear Regressionへ変更する必要があります。

 

Week5の課題のJはLogistic RegressionのJと同じでした↓

↓が比較したものです。

f:id:omoshiroamericanews:20200426235133p:plain

 

Logistic RegressionのJ部分をLinear RegressionのJの式へ変更する必要

したらいいのでは、と思ったので変更しました。

f:id:omoshiroamericanews:20200426235151p:plain

 

③sigmoidGradientもLinear RegressionのGradientに削除する必要があります。

 

Week2の課題で↓のLinear RegressionのGradientのプログラミングを完コピしましたが

うまくいきませんでした。

f:id:omoshiroamericanews:20200426235443p:plain

 

なので、こっちの↓の赤枠で囲んだ式を再現したらサイズは合って

エラーなくプログラミング自体は走りました。

(ここが間違っているのかもしれませんが。。。)

 

f:id:omoshiroamericanews:20200426235607p:plain

CheckNNGradientsでサイズが合わないエラー

 

f:id:omoshiroamericanews:20200501112032p:plain

なんでエラーが出ると思ったら,CheckNNGradients.mで

初期設定されている↓の値のせいだとわかりました。


input_layer_size = 3
hidden_layer_size = 5
num_labels = 3

となっています。

 

Week5の課題は5000X400->25X10みたいな大きいサイズなので、

部分を取り出すという形で機能していますが、

私の今回は約20-30X1-->約20-30X3-->約20-30x1という小規模なので

元のサイズより大きいサイズを取り出そうとしているエラーです。

 

↓に直したらプログラミング自体はエラーなく走りました。

input_layer_size = 1
hidden_layer_size = 3
num_labels = 1

最終的に予測値はどう計算する?

Week5の課題では与えられていた部分が予測を出すのを担っていました↓

 

options = optimset('MaxIter', 50)
costFunction = @(p) nnCostFunction(p, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, X, y, lambda)

[nn_params, cost] = fmincg(costFunction, initial_nn_params, options)

 


Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))

 

Theta2 = reshape(nn_params*2

 

これらがこれから考えるWeek5の課題の中で解けたらいいなぁと思っています。

 

行きがかりで理解したことはマトリョーシカのように

ex4.mはCheckNNGradientを含み

CheckNNGradientはcomputeNumericalGradientとdebugInitializeWeightsを含んでいることです。

 

 

しっかりとWeek5の課題を理解できるよう頑張ってみます!

*1:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1

*2:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1