懲りずに線形回帰取り組んだ東京都コロナ感染者予測をNeural Networkでも
やってみようとトライしてみました。
が、結果は散々です泣
Week5の課題はLogistic RegressionのNeural Networkだったので、
これを頑張ってLinear RegressionのNeural Networkに変えようとしたのですが、
プログラミングが不正確なせいか全然精度が出ませんでした↓
Linear Regressionの方がはるかにましです。
コーセラ機械学習で学んだ線形回帰でコロナ感染者数を予測してみる(4/18時点)※4/24UPDATE有 - 暇人日記II
構造は↓のようにしました。
全部でLayerは3つ、Hidden LayerのUnitは3にしました。
躓いたところのまとめです。
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と同じでした↓
↓が比較したものです。
Logistic RegressionのJ部分をLinear RegressionのJの式へ変更する必要
したらいいのでは、と思ったので変更しました。
③sigmoidGradientもLinear RegressionのGradientに削除する必要があります。
Week2の課題で↓のLinear RegressionのGradientのプログラミングを完コピしましたが
うまくいきませんでした。
なので、こっちの↓の赤枠で囲んだ式を再現したらサイズは合って
エラーなくプログラミング自体は走りました。
(ここが間違っているのかもしれませんが。。。)
CheckNNGradientsでサイズが合わないエラー
なんでエラーが出ると思ったら,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の課題を理解できるよう頑張ってみます!