今回も前回に引き続きoneVsAll.mに取り組みます。
プログラム詳細版oneVsAll.mの中にヒントらしきものがありました↓
fmincgの使い方が書いてあります。
というかこれをコピペでいいんじゃないだろうか、
というレベルで書いてある気がします。
ただ、0から9までのループはありませんので、ここを考える必要が残っています。
他のヒントです↓
theta(:)でmX1のようなベクトルになるということです。
mX1のようなベクトルにした方が解決できるということでしょうか。
y==cを利用するのは前回の日記のlogical arraysを利用するということだと思います。
cが1から10までをループするとあります。
ループは1から10まででnum_labelsが1から10と定義されているので
for c= 1: num_labels
end
というループになるのは確定だと判断しました。
ループの中で計算したいのは↓だと思います。
これをfmincgで計算するということのはずです。
ヒントから完コピして
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
[theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options)
となるはずです。
まずはc=1のときにどういう値になるか実験してみました↓
401X1のthetaが出てきました!
この仮説があたっているとすると、
for c= 1: 2
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
[theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options)
end
の時にthetaが401X2で2行並んでほしいです。
実験結果です↓
残念ながら401X1の1行でした。
さっきのc=1のときと値が違うのでc=2のときの最適thetaと思われます。
ループしてシュミレーション取り出しですね。
何度もこれに苦しまされてきました。
ところでc=1のときのthetaでXを基に予測すると,
どうなるんだろうか?と思ったのでやってみました。
A= 1./(1+exp(-X * theta))
としてAをみてみました↓
外れてそうな値です。
yの1~19をみてみます。
10だから1~19は外れていて正解です。
yで1が並んでいるところを探してみました↓
500から519までが1だったので、
Aの500から519を見てみました。
ほぼ1なので狙い通りです。
この仮説で行けそうな気がします。
ループシュミレーション取り出しができれば
401X10のthetaをXとかけて5000X10の予測を出して
最も1に近い値を選ぶという方法でできそうです。
今回はここまでです。また次回頑張ります!