暇人日記

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

Coursera Machine Learning Week8 課題 苦闘日記⑦

今回はこの最後の課題↓recoverData.mとOptionalの5000の顔に取り組みます。

 

f:id:omoshiroamericanews:20191126155300p:plain

問題文とプログラム全体版(ex7pca.m)には

特にアドバイスめいたものは書かれていません。

 

答えが[-1.047-1.047]になるということなのでこれをGoalにします。

 

プログラム詳細版(recoverData.m)にはまるでloopで解くことを

勧めているような記述があります。

これは前の課題projectData.mもloopで進めていましたが、

結局ベクトルで解いたので今回もベクトルで解くことにトライしたいと思います。

 

Coursera Machine Learning Week8 Video後半 - 暇人日記

↑でLectureで次元を落としたデータをまたもとに戻す方法が

ありましたが、一番重要な式はコレ↓だと思います。

 

f:id:omoshiroamericanews:20191126175032p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

まんま、素直にこうしました。

f:id:omoshiroamericanews:20191126175749p:plain

 Errorが出ました。

f:id:omoshiroamericanews:20191126175901p:plain

前回projectData.mと同じErrorです。

 

次元をみると

まず復元されるDataは50X2でなければなりません。

Ureduceは2X1であり、Zは圧縮されて50X1となっているので、

これを考えるとZかけるUreduceの転置が正解になりそうです。

 

当たりました!

見事に問題文で『答えが[-1.047-1.047]になる』とありましたが

同じ値が出ました!

 

f:id:omoshiroamericanews:20191126180159p:plain

 

つづいてグラフで視覚的に次元を落としたことがどう表現されるか

をみようということが問題文に示されていましたので読み解いてみます。

f:id:omoshiroamericanews:20191126185746p:plain

黒の点線が邪魔だと思ったので青○と赤○だけにしてみます。

f:id:omoshiroamericanews:20191126185950p:plain

青○がオリジナルで赤○が復元ですが、かなり精度が低いんじゃないかと感じました。

いったんZの線を入れてみることを試してみます。

f:id:omoshiroamericanews:20191126190125p:plain

Zは一次元だが、片方の情報を0としてむりやりグラフ上に表現してみましたが

あまり意味がなさそうです。

 

精度を考えてみたいと思います。

f:id:omoshiroamericanews:20191126190253p:plain

精度についてVideoの中で↑のように説明されていました。

 

なので↓このように式を組んで結果をみました。

99%以上ではなく約86%なので精度は低いということですね。

f:id:omoshiroamericanews:20191126190400p:plain

 

最初の計算なので生ベクトルみて確認しましたが大丈夫そうです。

 

f:id:omoshiroamericanews:20191126190712p:plain

 

もう一つ精度検証をしてみます。

f:id:omoshiroamericanews:20191126191134p:plain

 

 こちらだと0.01以下が基準なところ0.50とかなり高いので

やはり精度は悪いようです。

 

ところでfeatureNormalizeする前のXで同じ計算を行ったところ、

f:id:omoshiroamericanews:20191126191448p:plain

 

値が大きすぎですね。

featureNormalizeした後の値にやるのが正しいようです。

 

↑と思いましたが

Coursera Machine Learning Week8 課題 苦闘日記⑧ optional取組 - 暇人日記 

で似たような課題に取り組んで間違いに気づきました。

片方の方式は精度86%でもう片方の方式は精度50%というのが

気にはなっていました。


SX_norm= (1/m)* sum*1.^2)の式が違います。

X_normの(x、y)の絶対値なのでx-yの2乗を足しています。

↑おかしいです。

xの2乗とyの2乗を足すのが正解ですね。

 

SX_norm= (1/m)*sum(sum(( X_norm . ^2)))

↑こちらが式になります。計算しました↓

 

f:id:omoshiroamericanews:20191127195940p:plain

14%なので精度86%ですね。

答えが一致しました!

 

Optionalの5000の顔に取り組もうと思いましたが次回にします。

ところで前回も今回も出てきたdrawlineですが、

Week2やWeek3あたりに出てきたDecision Boudaryの直線版なら

使えるんじゃないかと思いました。

いつか試してみたいと思います。

 

*1: X_norm(:, 1)- X_norm(:, 2