暇人日記

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

Coursera Machine Learning Week8 課題 苦闘日記②

f:id:omoshiroamericanews:20191119133007p:plain

 

前回に引き続き↑のFind Closest Centroidsに取り組みます。

 

f:id:omoshiroamericanews:20191120233818p:plain

 

前回はこの式で計算結果を取り出せるけど900X1のベクトルになってしまっている

ので、これを300X3にしたいというところで躓いていました。

 

900X1のベクトルは↓のようにすれば、300X3にできます。

f:id:omoshiroamericanews:20191120232234p:plain

しかし、これを一般化するとなると難しいです。

results(1:size(X,1)),results(size(X,1)+1:size(X,1)*2,・・・・

とまではかけるのですが、そもそも何行になるかはK次第なので、

どうやって締めていいのかわかりません。。。

 

f:id:omoshiroamericanews:20191120233951p:plain

試行錯誤している中でresultsの中のdisに(1)をつけたところ、

f:id:omoshiroamericanews:20191120234333p:plain

↑のように最初のセットの3パターンの結果が表示されました。

 

ずっと300X3にしてから、一番小さいものを選ぶという考え方をしていましたが、

行き詰っていました。

 

しかし、↑のように1セットずつ表現できることに気付いたので、

『「1セットについて3パターンのシュミレーションをして

  一番距離の小さいものを選ぶ」ことを300回ループさせる』

という発想に変更することにしました。

ループの2重構造を作ることにします。

 

1~300までループさせたいので、300=size(X,1)を利用します。

 

f:id:omoshiroamericanews:20191121000054p:plain

というわけでjを1-300からループする式を↑のように入れ込みましたが

900X1のベクトルが返ってきましたorz

 

何かが悪いですね。

まだ、これだと300X1の計算を一気にやってしまっていることに気づいたので、

↓のように変えます。

 

f:id:omoshiroamericanews:20191121001519p:plain

赤線のようにXを300x1ではなく1X1で取り出ようにしました。

青線のようにjのループの箇所を変えました。

 

f:id:omoshiroamericanews:20191121001747p:plain

ですが、Errorです。

どうやらdis(j)がダメです。

 

(j)をとってdis(j)-->disにしたら、また900X1の結果に戻ってしまいました。


 

『「1セットについて3パターンのシュミレーションをして

  一番距離の小さいものを選ぶ」ことを300回ループさせる』

というコンセプトなので

1-300のjのループの中に1-3のkのループに入るべきではと思ったので、

式を修正してみます。(今までは1-3のループの中に1-300のループが入っています)

 

f:id:omoshiroamericanews:20191121002712p:plain

 

結果です。

f:id:omoshiroamericanews:20191121002812p:plain

 1セット目はうまく計算できましたが、2セット目にたどり着けなかったようです。

 

ここでgithubをみました。どうやら今回はresultsじゃない方良いようです。

(Week7ではうまくいってたのに!)

 

f:id:omoshiroamericanews:20191121003417p:plain

results = [] --> results=zeros(K,1) へ変更

results = [results;dis(j)] --> results(i)= disへ変更

 

結果です!うまいこと1セットずつとれている感じです!

f:id:omoshiroamericanews:20191121003840p:plain

よくみると

f:id:omoshiroamericanews:20191121004053p:plain

一番上がすべて11.616になっています。

これは1つ目のシュミが11.616、2つ目のシュミが39.404、3つ目のシュミが50.349と

計算しているので、上書きされるまでは残っているみたいです。

 

この並んだ3つで一番小さいものを選びたいんですが、

このresultsの中ですべてが適切な結果ではないということですね。

 

どうやって取り出せばいいんだろう???

とりあえず手を動かしてみます。

3つのシュミレーションを取り出せたので、一番小さいものを選んで

カテゴリーを決定する部分を作成します。

これはWeek7でやったことですね。

 

f:id:omoshiroamericanews:20191121004853p:plain

結果です。

f:id:omoshiroamericanews:20191121010512p:plain

この300セット目では11.616 39.404 50.349の中から

11.616を選んで1とするのが正解です。

なのでやっぱりカテゴリーが回数的に多く計算されてしまっています。

 

[minresults, minidx] = min(results)は1-3のループが終わった後に

一回あればいいので、1-3のループの外に置いてみようと思いました。

 

f:id:omoshiroamericanews:20191121011107p:plain

結果です。

f:id:omoshiroamericanews:20191121011228p:plain

うまくいきました。カテゴリーが一つです。

 

あとはこのカテゴリーを300並べれば完了です。

 

これ↓が課題に組み込まれているので、

idx = zeros(size(X,1), 1);

 

f:id:omoshiroamericanews:20191121011504p:plain

赤の部分を加えます。

 

正解になりました!

 

時間あるときに一度loopのシュミ結果の取り出し方をサマりたいと思います。

 

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