今回も↓の課題に取り組みます。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
①idxが1のときにはXはそのままで
idxが=2と3のXの要素は0にさせて、
②縦行ごとに平均をとろうという作戦でした。
まず①の実験です。
結果です。
うまくいきました
続いて②の平均をとります。
mean(X)としました。
正解は前回の日記のとおり、これ↓なのですが、一致しませんね。。。
[ 2.428301 3.157924 ]<--コレ
[ 5.813503 2.633656 ]
[ 7.119387 3.616684 ]
ただ、mean(X)は合計数/300としている気がします。
本当は合計数/1の数 にしたいので、もう少し検証します。
1の数はWeek3で出てきたposを利用します。
これで1になっているidxだけ引き出せるので、
size(pos=find(idx==1),1)とすると191あることがわかりました。
続いてSum(X)すると463.81 603.16が出てきます。
これを191で割ると2.4283 3.1579!
正解になりました!
ではプログラムの式にしていきます。
まずはカテゴリー1の計算の完成を目指します。
これで2.4283 3.1579の結果が出ました。
これをカテゴリー2/3にするにはKのループがよさそうです。
Kの1-3のループの中に1-300のループが欲しいです。
そして平均値の計算は1-300のループが終わった後がいいです。
ということでこうしました。
答えもばっちりです!
ここでcomputeCentroids.mを完成させにかかります。
computeCentroidsはX,idx,Kを変数としてcentroidsを計算する関数でした。
meanの代わりにcentroidsを入れます。
ただこれだと履歴取り出しにはならず,
centroidsは計算が最後のK=3のときだけが出てきます。
なのでK=1~3のループで出てくる回答をcentroid,
履歴で複数重なったものをcentroidsとして
↓のようにしました。
Error↓がでました。
K=1のときのcentroidはできましたが、centroidsにするときに、
1X2であることが問題になっているようです。
これはfindclosestcentroidsの課題の時も、Week7の64通りシュミでも
苦労したところです。
どうやら
XX(i)=△△
で履歴を取り出す技はどうやら△△が1x1でないとだめなようです。
△△が1X3で取り出した実践例はWeek7の64通り取り出しになるので
こちらでTryします。
Week7の実践例のまとめはこちらでした。
一つ問題に気づきました。
centroidsは
centroids = zeros(K,n)
と決定されていました。(回答者は変更不要とされている領域でこうなっています)
なので、centroids=にしない方向でいったんすすめます。
結果です↓。
最初の0の3セットがなければ成功ですね。
これはcentroids = zeros(K, n);からきているので、
この部分を削除してみます。
そーすると、0の3セットが消えてうまくいくかもしれません。
ダメでした。
やはりcentroids=にした方が良さそうです。
うまくいきました!
この次のK-means example on dataseは
コードが用意されていたのでそのままできました。
なるほどーこーやって動いていくんですね。
次のRandom Initializationも問題文に答えが書いているので、
これを↑のグラフに足してどうなるかをみてみます。
確かに最初の場所が変わったので、違う絵になりました!
今回はここまでです。また次回頑張ります!