Coursera Machine Learning Week8 課題 苦闘日記①
今回はこの一番上の課題に取り組みます。
問題の趣旨はまずは2D Datasetを使ってK-meansに慣れてくださいということですね。
x1,x2,・・・・xmのTraining Setについて、
どのCentroid(中心点)に最も近いかを振り分けていくことが求められています。
中心点はProgramの中で、↓のように規定されていました。
クラスターは3つということですね。
続いてTraining Set;Xがどんなベクトルか見ていきます。
こういうベクトルで300X2でした。
2Dに慣れるように、という問題文の主旨どおりですね。
ということはこの300セットを3つの中心点と距離っぽいものを計算して、
一番近いものを選ぶということですね。
具体的には、
1番目のSet(1.84208,4.60757)と1つ目の中心点(3,3)の距離っぽいものは
(1.84208 - 3)の2乗と(4.60757-3)の2乗の足し算と計算されます。
あとはこれを300セット X 3つの中心点なので合計900の計算結果がほしいです。
プログラム素人のおっさんなので、まずOctaveの操作の検証をします
そもそも上記の計算をOctaveにプログラムできるかどうか自信がないもので。
まず1つ目の中心点の取り出しです。
(3,3)と取り出したいので、1つ目という意味で
↓こうしました。
答えが3だけです。これでは望みどおりでありません。
よく中心点のベクトルをみてみます。
1列目が欲しいということに気づきました!
ということは、
うまく取り出せました!
次は300セットあるXから(3,3)を引きます。
300セットあるXは300X2のベクトルで
(3,3)は1X2のベクトルなので、思い通り引き算されるかどうか確認したいです。
うまいこと行きました!
次は各要素ごとの2乗です。これはWeek5/6あたりに出てきましたね。
うまいこと行きました!
これを横に足せればOKです。とりあえずSumしてみます。
縦に足されてしまいました。。。
横に足すためにはどうすればいいのか、
1 2
3 4
といった小さい例で実験してみました。
Sum(X,2)とすると横に足してくれることがわかりました。
できました!これで1つの中心点に対する300セットの計算結果は出ました!
あとは
①中心点を1-3でループさせて300セットX3つの900の計算結果を出す
②900の結果を300X3に表記する
③各列の3つの数字で最も小さいものを選び、その行=カテゴリーとする
頭の中のイメージは↓こういう感じです。
まずループして900の計算結果を出したいと思います。
disの結果が3通り表示されましたが、
3通りとも計算結果が全く同じです。。。
これは何かおかしい。
あ!
ここがKだと3で固定されてる!
だからdisの答えが一緒なんだと思います!
K->iにしたらdisの答えがきちんと3つになりました!
次はこれを300X3の形にすることです。
ループでのシュミレーション結果を取り出すというのは
ここで↓やりました。
Coursera Machine Learning Week7 課題 苦闘日記⑤ -loop simの履歴取り出し - 暇人日記
このときは
そしてこれがプログラミングでした。
これを参考にこうしました。
しかしresultsが900X1で縦一行になってしまいました。
欲しいのは300X3です。
そこで前回(C,sigma,error)と並べたように(K,dis)と並べることにしました。
errorが出ました。
どうやらiは1X1でdisは300X1だから並べれないようです。
それでは(K,dis)と並べることは諦めて、
week5-6で実践した「dis(i)」に取り組みます。
Errorがでました。どうやらさっきと同じで
iは1X1でdisは300X1だから並べれないようです。
Week6では↓でうまくいった方法ですが、Week7でも今回でも
うまく機能しませんでした。
これはWeek6の例↑では(i)をつけて取り出そうとしているerror_train,error_valが
1X1だから機能したのかもしれません。
機能しなかったWeek7の例では取り出そうとしたのは1X3のベクトルでした。
今回の例では取り出そうとしたのは300X1のベクトルでした。
(i)をつける方法は1X1のデータを取り出すのには有効で、
ベクトルには不向きなのかもしれません。
今回はここまでです。また次回頑張ります。