暇人日記

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

Coursera Machine Learning Week4 課題 2周目④ -苦闘記憶-  One vsALL②

今回も前回に引き続きoneVsAll.mに取り組みます。

 

f:id:omoshiroamericanews:20200226220631p:plain

 

 

プログラム詳細版oneVsAll.mの中にヒントらしきものがありました↓

 

f:id:omoshiroamericanews:20200226220831p:plain

fmincgの使い方が書いてあります。

というかこれをコピペでいいんじゃないだろうか、

というレベルで書いてある気がします。

 

ただ、0から9までのループはありませんので、ここを考える必要が残っています。

 

他のヒントです↓

 

f:id:omoshiroamericanews:20200226221302p:plain

theta(:)でmX1のようなベクトルになるということです。

mX1のようなベクトルにした方が解決できるということでしょうか。

 

y==cを利用するのは前回の日記のlogical arraysを利用するということだと思います。

 

cが1から10までをループするとあります。

 

ループは1から10まででnum_labelsが1から10と定義されているので

 

for c= 1: num_labels

 

end

 

というループになるのは確定だと判断しました。

 

 

ループの中で計算したいのは↓だと思います。

f:id:omoshiroamericanews:20200226221816p:plain

 

これを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が出てきました!

f:id:omoshiroamericanews:20200226222815p:plain

 

 この仮説があたっているとすると、

f:id:omoshiroamericanews:20200226223102p:plain

 

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行並んでほしいです。

実験結果です↓

 

f:id:omoshiroamericanews:20200226223340p:plain

 

残念ながら401X1の1行でした。

さっきのc=1のときと値が違うのでc=2のときの最適thetaと思われます。

 

ループしてシュミレーション取り出しですね。

何度もこれに苦しまされてきました。

 

ところでc=1のときのthetaでXを基に予測すると,

どうなるんだろうか?と思ったのでやってみました。

 

A= 1./(1+exp(-X * theta))

としてAをみてみました↓

 

f:id:omoshiroamericanews:20200227222906p:plain

外れてそうな値です。

 

yの1~19をみてみます。

f:id:omoshiroamericanews:20200227223109p:plain

10だから1~19は外れていて正解です。

 

yで1が並んでいるところを探してみました↓

f:id:omoshiroamericanews:20200227223239p:plain

500から519までが1だったので、

Aの500から519を見てみました。

f:id:omoshiroamericanews:20200227223337p:plain


 ほぼ1なので狙い通りです。

 

この仮説で行けそうな気がします。

ループシュミレーション取り出しができれば

401X10のthetaをXとかけて5000X10の予測を出して

最も1に近い値を選ぶという方法でできそうです。

 

f:id:omoshiroamericanews:20200226223102p:plain

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