前回できなかったオプション課題になっている5000の顔について取り組みます。
5000の顔のデータは1つ1つは32X32(=1024)のデータで
1列が1つの顔のデータに対応しているとのことです。
そして5000の顔だと数が多いので100の顔でPCAを試そうという
形式になっています。
基データは5000X1024で、1列1列が顔の情報なので、
顔の情報は5000、1つの顔の情報は1024となっています。
絵で表すとこういうことですね↓
一つの顔だけ取り出してみました↓
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
5000の顔を100の顔に削って、1024の次元を36の次元に落とすというのが
問題文にあるのでプログラミングしました。
5000の顔を100の顔に削る -->5000X1024を100X1024のベクトルへ加工
1024の次元を36の次元に落とす -->UをU(:,1:36)'へ加工
Uは1024X36だが「’」で36X1024にしている
問題文はここでUの36列目までを転置したDataを見てみましょう、
ということで↓の絵があります。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
わからないことがあります。
Zになって初めてData圧縮効果が見れるのでは?と思っていました。
途中のUreduceのDataって何を表しているのだろう?ということが分かりません。
100の顔データは100X1024つまり1024次元なので、Uは1024X1024になります。
今回は36次元に落としたので、Ureduceは1024X36になります。
これを転置して36X1024にしているので、まるで5000X1024から
36を取り出したみたいに見えますがsvdの関数を使っているので違うはずです。
このUの36列目までのグラフが↑の6X6の絵になっていますが、
なんかそれっぽい絵ですね。。。
Zを作ってそれと比較してみたいと思います。
Xは100X1024でUreduceは1024X36なのでZは100X36になります。
1024次元が36次元に圧縮されたことになります。
↓こうなりました。
つまり最初の1024次元のデータ(左)が36次元(右)になったということです。
このZの100X36とUreduceの36X1024は似ても似つかない形ですね。
やはりUreduceの36X1024のグラフの意味は分かりませんが前に進みます。
次はこのZの100X36を1024次元へ戻してみたいと思います。
左が基データで右が回復したデータです。
やっぱり粗くなっていますね。
精度を計算してみたいと思います。
精度検証はこの式↓なので実行してみます。
0.918なので基準を0.99とすると満たしてないですね。
こちらの式でもやってみます。
前回の計算式でやってみると、
いくらなんでもおかしい気がします。。。
SX_norm1の式がおかしいですね。
これだと100X1024のベクトルのうち、最初の2行しか計算してないですね。
しかしそもそもA(x,y)の原点(0.0)からの距離でx-yの2乗がおかしい気がしてきました。例えば(3,2)のような点があるとしたら原点からの距離は3の2乗足す2の2乗をルートです。3-2の2乗をルートではないですね。
前回も含めて間違えてますね。
単純に100X1024のすべての要素を2乗して合計するので、
こうなるはずです↓
SX_norm1= (1/m)*sum(sum((X_norm1.^2)))
計算してみました。
0.01以下なら基準を満たしていることろを0.08なのでダメですね。
ただ2つのやり方での答えは近いですね。
2つとも精度92%と言っていると思います。
次はK=100でやるということが問題文にあるので
100次元に落とし込むことに取り組みます。
pcaの計算に結構時間がかかるので、SとUのデータを保存して
loadすることで短縮したいと思います。
これとおなじ話を↓でしました。
Coursera Machine Learning Week8 課題 苦闘日記③ - 暇人日記
しかし前回よりもっといい方法を見つけました。
ワークスペース内の「S」を左クリックして変数エディタへコピーすると
この右の部分がでてきます。
後は保存を選ぶだけで「S.txt」で保存されます!
もう一度整理すると
基データは100X1024の100個の顔のデータです。
この1024の次元を100の次元に落とします。
Uは1024X1024ですが、Ureduceを1024X100とすることになります。
圧縮されたデータは100X100になります。
回復したデータは100X1024になります。
さっきは36次元、今回は100次元なので、
今回の方が精度が高く戻したDataが綺麗なのではと推測します。
式はK=36をK=100に入れ替えるだけですね。
結果です。↓
36次元と並べてみます。
一番気になる回復データを拡大します。
やはり100次元の方が細かく描写されてますね。
最後に精度です。
36次元では92%だったので、これ以上になっているか興味があります。
精度はほぼ100%ということです。
1024次元を100次元くらいだと基のデータを保持したまま
次元を削れるということですね。
最後に3Dのオプショナルに取り組みます。
と思って始めたんですが、これは
Coursera Machine Learning Week8 課題 苦闘日記⑤ - 暇人日記
でPCの演算速度が足りず諦めたやつと途中まで計算式が同じでしたorz
3D表現見てみたかったんですが、計算結果が出ないことには
どうしようもありません。諦めます。
次回はWeek9のVideoに取り組みたいと思います。