暇人日記

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

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

前回できなかったオプション課題になっている5000の顔について取り組みます。

 

5000の顔のデータは1つ1つは32X32(=1024)のデータで

1列が1つの顔のデータに対応しているとのことです。

 

そして5000の顔だと数が多いので100の顔でPCAを試そうという

形式になっています。

 

基データは5000X1024で、1列1列が顔の情報なので、

顔の情報は5000、1つの顔の情報は1024となっています。

 

絵で表すとこういうことですね↓

 

f:id:omoshiroamericanews:20191127131940p:plain

 

一つの顔だけ取り出してみました↓

f:id:omoshiroamericanews:20191127132630p:plain

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

 

5000の顔を100の顔に削って、1024の次元を36の次元に落とすというのが

問題文にあるのでプログラミングしました。

 

5000の顔を100の顔に削る -->5000X1024を100X1024のベクトルへ加工

1024の次元を36の次元に落とす -->UをU(:,1:36)'へ加工

                 Uは1024X36だが「’」で36X1024にしている

 

f:id:omoshiroamericanews:20191127133823p:plain

 

 問題文はここでUの36列目までを転置したDataを見てみましょう、

ということで↓の絵があります。

f:id:omoshiroamericanews:20191127164141p:plain

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

 

わからないことがあります。

 

f:id:omoshiroamericanews:20191127164401p:plain

 

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次元に圧縮されたことになります。

 

↓こうなりました。

f:id:omoshiroamericanews:20191127171233p:plain

 

 つまり最初の1024次元のデータ(左)が36次元(右)になったということです。

f:id:omoshiroamericanews:20191127171338p:plain

 このZの100X36とUreduceの36X1024は似ても似つかない形ですね。

やはりUreduceの36X1024のグラフの意味は分かりませんが前に進みます。

 

次はこのZの100X36を1024次元へ戻してみたいと思います。

左が基データで右が回復したデータです。

やっぱり粗くなっていますね。

f:id:omoshiroamericanews:20191127172712p:plain

 

精度を計算してみたいと思います。 

精度検証はこの式↓なので実行してみます。

f:id:omoshiroamericanews:20191126190253p:plain

f:id:omoshiroamericanews:20191127185519p:plain

0.918なので基準を0.99とすると満たしてないですね。

 

f:id:omoshiroamericanews:20191127185841p:plain

こちらの式でもやってみます。

前回の計算式でやってみると、

f:id:omoshiroamericanews:20191127190008p:plain

いくらなんでもおかしい気がします。。。

 

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)))

 

計算してみました。

f:id:omoshiroamericanews:20191127190930p:plain

0.01以下なら基準を満たしていることろを0.08なのでダメですね。

 

ただ2つのやり方での答えは近いですね。

2つとも精度92%と言っていると思います。

 

 

次はK=100でやるということが問題文にあるので

100次元に落とし込むことに取り組みます。

 

pcaの計算に結構時間がかかるので、SとUのデータを保存して

loadすることで短縮したいと思います。

 

これとおなじ話を↓でしました。

Coursera Machine Learning Week8 課題 苦闘日記③ - 暇人日記

 

しかし前回よりもっといい方法を見つけました。

ワークスペース内の「S」を左クリックして変数エディタへコピーすると

この右の部分がでてきます。

後は保存を選ぶだけで「S.txt」で保存されます!

f:id:omoshiroamericanews:20191127174411p:plain

 

もう一度整理すると

基データは100X1024の100個の顔のデータです。 

この1024の次元を100の次元に落とします。

Uは1024X1024ですが、Ureduceを1024X100とすることになります。

圧縮されたデータは100X100になります。

回復したデータは100X1024になります。

 

さっきは36次元、今回は100次元なので、

今回の方が精度が高く戻したDataが綺麗なのではと推測します。

 

式はK=36をK=100に入れ替えるだけですね。

結果です。↓

f:id:omoshiroamericanews:20191127225624p:plain

 

36次元と並べてみます。

f:id:omoshiroamericanews:20191127225848p:plain

 

一番気になる回復データを拡大します。

やはり100次元の方が細かく描写されてますね。

 

f:id:omoshiroamericanews:20191127230158p:plain

最後に精度です。

36次元では92%だったので、これ以上になっているか興味があります。

 

f:id:omoshiroamericanews:20191127230819p:plain

精度はほぼ100%ということです。

1024次元を100次元くらいだと基のデータを保持したまま

次元を削れるということですね。

 

最後に3Dのオプショナルに取り組みます。

と思って始めたんですが、これは

Coursera Machine Learning Week8 課題 苦闘日記⑤ - 暇人日記

でPCの演算速度が足りず諦めたやつと途中まで計算式が同じでしたorz

 

3D表現見てみたかったんですが、計算結果が出ないことには

どうしようもありません。諦めます。

 

次回はWeek9のVideoに取り組みたいと思います。