暇人日記

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

ループシュミレーション取り出しについて

度々でてくるループシュミレーション取り出しのまとめです。

 

ループシュミレーションの取り出しとは、

1からnまでのパターンを計算して、その計算結果を一覧にすることです。

 

一覧にすることで1からnまでの間で、一番小さい計算結果になるのはどのときか、

あるいは一番大きい計算結果になるのはどれかが見える化できるのがpointです。

 

これが見える化できるとBestなPredictinonを選ぶことができるので、

Coursera Machine Learningの課題では度々でてきます。

 

 

書いている日記の中ではWeek2/Week3/Week4/Week7で出てきています。

 

今のところ、パターンが2つあると思います。

取り出すものが「値」(NX1)の場合と「ベクトル」の場合(NXM)です。

 

 

 

 

パターン①取り出すものが「値」です。(一覧がNX1になる)

 

Week2では↓の回に出てきました。

 

具体的なコードの構成はこうでした↓

f:id:omoshiroamericanews:20200302214858p:plain



赤枠が『The ループ』とでも呼べるくらいループっぽい箇所です。

for iter = 1:num_iters ~endまでがまさにループそのものです。

ループはできるのですがループでシュミレーションした結果を一覧にしたいというときに『The ループ』の場所だけがあると困ります。

 

例えばこんな感じです↓

f:id:omoshiroamericanews:20200301223116p:plain

これだと

iter=1のときのJ_historyはXX

iter=2のときのJ_historyは〇〇

iter=3のときのJ_historyは■■

*

*

*

iter=n(最後)のときのJ_historyは△△

 

と計算されるのですが、

計算し終わった後にJ_historyを見に行くと最後の計算結果の△△しか見えません。

XXや○○や■■の結果が見えません。

 

これを解決するために青枠と黒枠があります。

 

特に大事なのが黒枠の一覧にしたい結果の後ろに

今回みたいに(iter)とつけるか(i)とつけるのが必須です。

 

これをつけると、

iter=1のときのJ_historyはXX   --->J_history(1)=XX

iter=2のときのJ_historyは〇〇 -->J_history(2)=○○

iter=3のときのJ_historyは■■ -->J_history(3)=■■

のように認識されて一回一回の結果が保持されます。

 

なぜ保持されるのかというのは

青枠のところが鍵です。

 

青枠があると取り出したい結果一覧の形を最初に決定していて

一覧の形のベクトルを決めています。

 

どういうことかというと今回の場合は

for iter = 1:num_itersのループはnum_itersは1500だったので

1から1500のループで1500の結果が出ることがわかっていました。

 

なので一覧にしてみたいのは1500の結果を1500X1のベクトルの形で

見れると狙い通りです。

 

青枠の

J_history = zeros(num_iters, 1)

はJ_historyがすべての要素が0の1500X1のベクトルを意味しています。

 

先にすべての要素が0の1500X1のベクトルの箱を作って

赤枠のループでそれを1つずつ上書きしていっているイメージだと思います。

 

絵にするとこういうイメージ↓だと思います。

 

f:id:omoshiroamericanews:20200308104640p:plain

 

 

Week3でも出てきました↓ 

 

www.courseradaisuki.com

 

こちらはWeek2の例と同じです。

p(i)のシュミレーション取り出しでした。

 

これは100x1で要素が全て0のベクトルを用意しておいて

上書きしていくパターンでした。

 

f:id:omoshiroamericanews:20200309103116p:plain

このFunction↑を利用して、↓のように上書きしていくパターンですね。

f:id:omoshiroamericanews:20200302221203p:plain

 

 

 

もう一つのパターンは取り出すのが値ではなくベクトルのパターンです。

 

パターン②取り出すのがベクトルです。(一覧がNXMになる)

 (i)上書きパターン

 

Week2ででてきました↓

www.courseradaisuki.com

 

このときの構成は↓でした。

f:id:omoshiroamericanews:20200302220749p:plain

赤枠が同じく『The ループ』です。

このときはij の2重ループのシュミレーション取り出しでしたが、

箱を上書きしていく点で値のシュミレーション取り出しと同じです。

 

青枠の箇所は、

 

f:id:omoshiroamericanews:20200302220947p:plain

だったので、

100x100で要素が全て0のベクトルを用意して上書きしていっています。

 

J_vals(i,j)は

J_vals(1,1)=○○

J_vals(1,2)=■■

J_vals(1,3)=XX

*

*

*

J_vals(100,100)=△△

というように100パターンの計算結果を出していって上書きしています。

 

 5X5のベクトルで実験してみます。

f:id:omoshiroamericanews:20200308104907p:plain

例えばA(1,1)は

f:id:omoshiroamericanews:20200308105029p:plain

左上の17の場所です。

 

これをA(1,1)=0として17が0になるかどうか実験です。

f:id:omoshiroamericanews:20200308105244p:plain

なりました。

 

A(1,2)=1000も試してみます。

 

f:id:omoshiroamericanews:20200308105353p:plain

というように

J_vals(i,j)は

J_vals(1,1)=○○

J_vals(1,2)=■■

J_vals(1,3)=XX

*

*

*

J_vals(100,100)=△△

で上書きしていっています。

 

 (ii)追加パターン

Week7の課題で出てきました↓

なんと表現していいかわかりませんが上書きではないので

追加パターンと名付けました。

 このパターンはこの日記の中に詳細に書かれているのでここでは簡単に触れます。

www.courseradaisuki.com

 

この時シュミレーション結果でほしいのは↓形のものでした。

f:id:omoshiroamericanews:20200308110116p:plain

 

これはC/sigma/errorが3行並んでいます。

Cを8パターン、sigmaを8パターン選んでいて、合計64パターン中で

どのときにerrorが最小値になるかという一覧化しています。

 

結果、64X3のベクトルになっています。

パターン①のときの青枠に相当するのが↓です。

f:id:omoshiroamericanews:20200308110734p:plain

これで一覧の形を決めに行っている感じです。

 

パターン②のときの黒枠((i)をつけるのが大事)に相当するのが↓です。

f:id:omoshiroamericanews:20200308110848p:plain

 

pointは赤枠で囲った部分です。

f:id:omoshiroamericanews:20200308111258p:plain

なぜ必要かは説明できませんがとにかくないとできないとうのは分かっています。

 

これは取り出した形は64X3のベクトルに見えるものの1つ1つは

値だと思います。というのは計算結果のErrorもcvecもsigmavecも

2X1のようなベクトルではなく1X1の値だからです。

 

今回はここまでです。

これを応用してWeek4のループシュミレーション取り出しに挑みます。