今回はpredict.mに取り組みます。
前回の日記で予測は計算して値は0と1の間で狙い通りですが、
最終的には全て0か1になってほしいです。
予測計算結果↓
問題文を読むことにします↓
TEST1が45点でTEST2が85の生徒の合格確率は0.776になることを
確認しなさいとあります。
プログラム全体ex2.mには↓の箇所があり、
sigmoid([1 45 85] * theta)
これがTEST1が45点でTEST2が85点の生徒を示しています。
最初の1は足した1ですね。(↓の図のやつです)
thetaはfminuncで↓の通り計算されています↓
thetaがあるので計算してみました。
見事になりました!
続けて問題文を読むことにします↓
現在の予測値は0と1の間ですが、0か1にはなってないので、0か1にしなさいという課題です。
絵にすると↓
こういう風になってほしいということです。
1周目の時は分からなくてググりました。
1行で解ける解答が載ってました。
今回は問題文のヒント通り進んでみたいと思います。
If文を使えばいいのかなあと思ってプログラム詳細predict.mをみると↑
ほぼほぼ答えが書いてあるように思いました。
と思って,ほぼほぼコピペの
if sigmoid(X,theta)>=0.5
predict1
else
predict 0
End
とするとErrorが出ました。
Predict1がまずかったようです。
前回,prediction=sigmoid(X,theta)で計算したので
if prediction >=0.5
prediction=1
else
predict tion=0
End
としました。
1X1のベクトルになってしまいました。。。
答えは100X1になるべきなので明らかな間違いです。
答えが1X1になってしまったことと
プログラム詳細predict.mに
p = zeros(m, 1);とあることで、
これはLoopして履歴取り出しかと思いました。
1から100のloopにして↓のように1つずつ0か1か判断する形ですね。
1つずつ判断するのに役立つのがこのFunctionです↓
prediction(1)=0で1行目を0に置き換えという意味になります。
predicton(2)=1or0,prediction(3)=1or0としていけばいいので、
prediction(i) >= 0.5なら
prediction(i)=1、でなければprediction(i)=0という風に
For I =1:m(=100)でループさせると1つずつ判断してくれます。
できました!
こういう風にすることができました!
ググった解答例は1行で解けてたのですごいなと思いました。
ところでこの予測はどれくらいの精度だったでしょうか?
Linear RegressionではJくらいしか目安がなく20憶より下がらなくて、
精度がいいか悪いかはわからないということを↓の日記で思ってました。
今回は0か1なので、かなりはっきりと予測精度を%で示すことができます。
つまり100個のうち、何個当たっているのかがわかるからです。
それではこれを計算していきたいと思います。
この計算はWeek7の課題の時に使ったものが役に立ちます↓
Coursera Machine Learning Week7 課題 苦闘日記② - 暇人日記
この式で誤差率が計算できる優れものです!
応用してこの式を正答率に変えます!
~を=に変えます。
実行しました↓
0.89なので正答率89%です。
この正答率89%を別の方法で検証したいと思います。
まずpとyを並べてみます
A=[p y]として
そこそこあっているのがわかります。
それでは異なっている個数を知りたいので’p-y’をしたいと思います。
これで同じものは0で、異なるものは-1か1です
B=p-yとして
このまま足すと-1と1が入り乱れて足し算の結果が意味をなさなくなるので、
2乗することで-1も1に変換します。
そうすると足し算の結果は間違えた個数になります。
c=sum((p-y).^2)
として計算すると
となりました。
100個中11個が間違いということは89個が正解なので
89%の正答率でさっきの式と答えが一致しました!
今回はここまでです。また次回頑張ります!