今回はpca.mとprojectData.mに下記順で取り組みます。
問題文を読みます
まずは2Dセットで慣れて、次に5000の顔イメージに取り組む手順のようです。
2Dから1Dにするのを↓のように視覚で見るというのがpca.mのGoalです。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
具体的な計算方法が問題文に書かれており、Videoと同じ内容が書いてありました。
Coursera Machine Learning Week8 Video後半 - 暇人日記
完全にVideo⑨と同じ内容です。
この課題pca.mは課題プログラム全体版も課題プログラム版も
特にアドバイスめいたことは書いてありません。
多分Video⑨で事細かに計算方法を書いてあるからだと思われます。
試行錯誤開始です。
まずはXのdataを見てみます。
Xは50X2のベクトルです。
Week2かWeek3でFeatureNormalizeをしましたがそれと同じですね。
featureNormalize.mがすでに用意されていたのでそれを使うと
こういうふうに変わりました。
今回はこの2つを組むだけなのですぐ正解できそうな気がします。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
そんなことありませんでした。
しっかり躓きました。
しっかり組めたつもりだったんですが、
しっかりErrorが出ました。
Errorはex7_pca.mの↓の部分で出ました。
次元があわないという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)'です。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
今回は2次元を1次元に落とす話すなので、
nxnは2x2でUも2X2を2X1へ変化させて次元を削除する話なので、
U(:,1)'が1X50はおかしいと気づきました。
XとX'が逆ですね。
逆にしたら正解になりました。
それにしても
この式は何を意味しているのでしょうか?
これは2行ありますので下の行を削ってみます。
↓こうなりました。
なので解答の線は2つありましたが、↓このような
役割分担だったと考えられます。
drawLine(mu, mu + 1.5 * S(1,1) * U(:,1)', '-k', 'LineWidth', 2);
つぎに'-k'が果たしている役割を考えます。
'-k'を削ったら線が青になりました。ここでこれは色のことを示していると思ったので、
'-r'といれたら線が赤になりました。'-k'は黒を意味していますね。
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なので、
グラフは↓こういうことだったとわかりました。
さて最後に考えるのは「mu + 1.5 * S(1,1) * U(:,1)'」の式の意味です。
ですがSが入っているんで、Video⑪に絡んでいそうなので後回しにします。
Coursera Machine Learning Week8 Video後半 - 暇人日記
ということで次の課題projectDataに取り組みます。
問題文・課題プログラム全体版も特にアドバイスらしきものはありません。
Xは50X2のベクトルなので、これをZ;50X1のベクトルにすることが
目的です。
課題プログラム詳細版はまるでloopを勧めるような記述に見えますが、
Video⑩のベクトルの式で取り組んでみたいと思います。
(出典;『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を勧めているのかもしれません。
素直に真似てこうしてみました。
Errorが出ました。次元が違うということです。
Ureduceは2x1なのでUreduce'は1X2、X(X_norm)は50X2だから
だめですね。ということはX*Ureduceにすればうまくいきそうです!
正解しました!
レクチャーとは違うのは多分loopで計算しなかったからですが、
正解なのでとりあえずよしとすることにします!
今回はここまでです。また次回頑張ります!