Coursera Machine Learning Week8 課題 苦闘日記②
前回に引き続き↑のFind Closest Centroidsに取り組みます。
前回はこの式で計算結果を取り出せるけど900X1のベクトルになってしまっている
ので、これを300X3にしたいというところで躓いていました。
900X1のベクトルは↓のようにすれば、300X3にできます。
しかし、これを一般化するとなると難しいです。
results(1:size(X,1)),results(size(X,1)+1:size(X,1)*2,・・・・
とまではかけるのですが、そもそも何行になるかはK次第なので、
どうやって締めていいのかわかりません。。。
試行錯誤している中でresultsの中のdisに(1)をつけたところ、
↑のように最初のセットの3パターンの結果が表示されました。
ずっと300X3にしてから、一番小さいものを選ぶという考え方をしていましたが、
行き詰っていました。
しかし、↑のように1セットずつ表現できることに気付いたので、
『「1セットについて3パターンのシュミレーションをして
一番距離の小さいものを選ぶ」ことを300回ループさせる』
という発想に変更することにしました。
ループの2重構造を作ることにします。
1~300までループさせたいので、300=size(X,1)を利用します。
というわけでjを1-300からループする式を↑のように入れ込みましたが
900X1のベクトルが返ってきましたorz
何かが悪いですね。
まだ、これだと300X1の計算を一気にやってしまっていることに気づいたので、
↓のように変えます。
赤線のようにXを300x1ではなく1X1で取り出ようにしました。
青線のようにjのループの箇所を変えました。
ですが、Errorです。
どうやらdis(j)がダメです。
(j)をとってdis(j)-->disにしたら、また900X1の結果に戻ってしまいました。
『「1セットについて3パターンのシュミレーションをして
一番距離の小さいものを選ぶ」ことを300回ループさせる』
というコンセプトなので
1-300のjのループの中に1-3のkのループに入るべきではと思ったので、
式を修正してみます。(今までは1-3のループの中に1-300のループが入っています)
結果です。
1セット目はうまく計算できましたが、2セット目にたどり着けなかったようです。
ここでgithubをみました。どうやら今回はresultsじゃない方良いようです。
(Week7ではうまくいってたのに!)
results = [] --> results=zeros(K,1) へ変更
results = [results;dis(j)] --> results(i)= disへ変更
結果です!うまいこと1セットずつとれている感じです!
よくみると
一番上がすべて11.616になっています。
これは1つ目のシュミが11.616、2つ目のシュミが39.404、3つ目のシュミが50.349と
計算しているので、上書きされるまでは残っているみたいです。
この並んだ3つで一番小さいものを選びたいんですが、
このresultsの中ですべてが適切な結果ではないということですね。
どうやって取り出せばいいんだろう???
とりあえず手を動かしてみます。
3つのシュミレーションを取り出せたので、一番小さいものを選んで
カテゴリーを決定する部分を作成します。
これはWeek7でやったことですね。
結果です。
この300セット目では11.616 39.404 50.349の中から
11.616を選んで1とするのが正解です。
なのでやっぱりカテゴリーが回数的に多く計算されてしまっています。
[minresults, minidx] = min(results)は1-3のループが終わった後に
一回あればいいので、1-3のループの外に置いてみようと思いました。
結果です。
うまくいきました。カテゴリーが一つです。
あとはこのカテゴリーを300並べれば完了です。
これ↓が課題に組み込まれているので、
idx = zeros(size(X,1), 1);
赤の部分を加えます。
正解になりました!
時間あるときに一度loopのシュミ結果の取り出し方をサマりたいと思います。
今回はここまでです。また次回頑張ります。