暇人日記

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

Coursera Machine Learning Week8 課題 苦闘日記⑥

 

f:id:omoshiroamericanews:20191123233750p:plain

 今回はpca.mとprojectData.mに下記順で取り組みます。

 

問題文を読みます

 

まずは2Dセットで慣れて、次に5000の顔イメージに取り組む手順のようです。

2Dから1Dにするのを↓のように視覚で見るというのがpca.mのGoalです。

 

f:id:omoshiroamericanews:20191123234308p:plain

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

 

具体的な計算方法が問題文に書かれており、Videoと同じ内容が書いてありました。

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

完全にVideo⑨と同じ内容です。

 

この課題pca.mは課題プログラム全体版も課題プログラム版も

特にアドバイスめいたことは書いてありません。

多分Video⑨で事細かに計算方法を書いてあるからだと思われます。

 

試行錯誤開始です。

まずはXのdataを見てみます。

f:id:omoshiroamericanews:20191124000031p:plain

 

Xは50X2のベクトルです。

 

Week2かWeek3でFeatureNormalizeをしましたがそれと同じですね。

featureNormalize.mがすでに用意されていたのでそれを使うと

こういうふうに変わりました。

 

f:id:omoshiroamericanews:20191124231849p:plain

 

今回はこの2つを組むだけなのですぐ正解できそうな気がします。

 

f:id:omoshiroamericanews:20191124234053p:plain

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

 

そんなことありませんでした。

しっかり躓きました。

 

f:id:omoshiroamericanews:20191124234250p:plain

しっかり組めたつもりだったんですが、

f:id:omoshiroamericanews:20191124234443p:plain

しっかりErrorが出ました。

Errorはex7_pca.mの↓の部分で出ました。

f:id:omoshiroamericanews:20191124234802p:plain

次元があわないというErrorのようです。

 

これはmuは1X2のベクトルなので、

『mu+1.5*S(1,1)*U(:,1)'』の「1.5*S(1,1)*U(:,1)'」この部分が

1X2にならないといけないのに、1X50になっているという指摘です。

S(1,1)は1X1なので、おかしいのはU(:,1)'です。

 

f:id:omoshiroamericanews:20191125162114p:plain

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

 

今回は2次元を1次元に落とす話すなので、

nxnは2x2でUも2X2を2X1へ変化させて次元を削除する話なので、

U(:,1)'が1X50はおかしいと気づきました。

 

XとX'が逆ですね。

逆にしたら正解になりました。

 

それにしても

 

f:id:omoshiroamericanews:20191124234802p:plain

この式は何を意味しているのでしょうか?

f:id:omoshiroamericanews:20191125162858p:plain

これは2行ありますので下の行を削ってみます。

 ↓こうなりました。

f:id:omoshiroamericanews:20191125163611p:plain

 なので解答の線は2つありましたが、↓このような

役割分担だったと考えられます。

f:id:omoshiroamericanews:20191125163902p:plain

 drawLine(mu, mu + 1.5 * S(1,1) * U(:,1)', '-k', 'LineWidth', 2);

つぎに'-k'が果たしている役割を考えます。

 

'-k'を削ったら線が青になりました。ここでこれは色のことを示していると思ったので、

 '-r'といれたら線が赤になりました。'-k'は黒を意味していますね。

f:id:omoshiroamericanews:20191125164258p:plain

drawLine(mu, mu + 1.5 * S(1,1) * U(:,1)', '-k', 'LineWidth', 2);

これでこの式は'-k'以降が直線の形式ということがわかりました。

最初2つは点でこの2つの点を結ぶ直線を描かせる式ということですね。

drawline(A,B,色,線の太さ,線の太さ数字)という構成ですね。

 

mu + 1.5 * S(1,1) * U(:,1)'は   2.1853   3.1988

muは 3.9893   5.0028なので、

グラフは↓こういうことだったとわかりました。

f:id:omoshiroamericanews:20191125164727p:plain

さて最後に考えるのは「mu + 1.5 * S(1,1) * U(:,1)'」の式の意味です。

ですがSが入っているんで、Video⑪に絡んでいそうなので後回しにします。

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

 

ということで次の課題projectDataに取り組みます。

問題文・課題プログラム全体版も特にアドバイスらしきものはありません。

Xは50X2のベクトルなので、これをZ;50X1のベクトルにすることが

目的です。

 

課題プログラム詳細版はまるでloopを勧めるような記述に見えますが、

Video⑩のベクトルの式で取り組んでみたいと思います。

f:id:omoshiroamericanews:20191125175436p:plain

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

これ↑の下2つの式ですね。

 

<一般>   <今回>

U=nxn               U=2X2 ※2次元だから

Ureduce=nxK   Ureduce=2x1 ※K=1の1次元にしたいから

X(i)=nx1               X(i)=2x1  ※nx1だから(i)で取り出している

Ureduce’=kxn   Ureduce=1x2 

 

Ureduce‘=2x1でX(i)=2x1なので次元が喧嘩しそうです。

加えてこれはベクトルで一気に処理というよりは

一つ一つ計算しているパターンですね。

だからloopを勧めているのかもしれません。

 

 

素直に真似てこうしてみました。

f:id:omoshiroamericanews:20191125175656p:plain

Errorが出ました。次元が違うということです。

Ureduceは2x1なのでUreduce'は1X2、X(X_norm)は50X2だから

だめですね。ということはX*Ureduceにすればうまくいきそうです!

正解しました!

レクチャーとは違うのは多分loopで計算しなかったからですが、

正解なのでとりあえずよしとすることにします!

 

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