暇人日記

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

Coursera Machine Learning Week8 課題 苦闘日記①

今回はこの一番上の課題に取り組みます。

f:id:omoshiroamericanews:20191119133007p:plain

 

問題の趣旨はまずは2D Datasetを使ってK-meansに慣れてくださいということですね。

 

x1,x2,・・・・xmのTraining Setについて、

どのCentroid(中心点)に最も近いかを振り分けていくことが求められています。

 

中心点はProgramの中で、↓のように規定されていました。

 

f:id:omoshiroamericanews:20191119194626p:plain

クラスターは3つということですね。

 

続いてTraining Set;Xがどんなベクトルか見ていきます。

f:id:omoshiroamericanews:20191119194812p:plain

こういうベクトルで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つ目という意味で

↓こうしました。

f:id:omoshiroamericanews:20191119195810p:plain

答えが3だけです。これでは望みどおりでありません。

 

よく中心点のベクトルをみてみます。

 

f:id:omoshiroamericanews:20191119200024p:plain

1列目が欲しいということに気づきました!

 

ということは、

f:id:omoshiroamericanews:20191119200146p:plain

うまく取り出せました!

 次は300セットあるXから(3,3)を引きます。

300セットあるXは300X2のベクトルで

(3,3)は1X2のベクトルなので、思い通り引き算されるかどうか確認したいです。

 

f:id:omoshiroamericanews:20191119200509p:plain

うまいこと行きました!

 

次は各要素ごとの2乗です。これはWeek5/6あたりに出てきましたね。

 

f:id:omoshiroamericanews:20191119200629p:plain

うまいこと行きました!

 

これを横に足せればOKです。とりあえずSumしてみます。

 

f:id:omoshiroamericanews:20191119200752p:plain

 

縦に足されてしまいました。。。

 

横に足すためにはどうすればいいのか、

 1  2

 3  4

といった小さい例で実験してみました。

 

f:id:omoshiroamericanews:20191119231743p:plain

Sum(X,2)とすると横に足してくれることがわかりました。

 

f:id:omoshiroamericanews:20191119231938p:plain

 

できました!これで1つの中心点に対する300セットの計算結果は出ました!

あとは

①中心点を1-3でループさせて300セットX3つの900の計算結果を出す

②900の結果を300X3に表記する

③各列の3つの数字で最も小さいものを選び、その行=カテゴリーとする

 

頭の中のイメージは↓こういう感じです。

f:id:omoshiroamericanews:20191119233635p:plain

 

まずループして900の計算結果を出したいと思います。

f:id:omoshiroamericanews:20191119234650p:plain

 

disの結果が3通り表示されましたが、

3通りとも計算結果が全く同じです。。。

これは何かおかしい。

 

あ!

f:id:omoshiroamericanews:20191119235455p:plain

 

ここがKだと3で固定されてる!

だからdisの答えが一緒なんだと思います!

 

K->iにしたらdisの答えがきちんと3つになりました!

 

次はこれを300X3の形にすることです。

ループでのシュミレーション結果を取り出すというのは

ここで↓やりました。

Coursera Machine Learning Week7 課題 苦闘日記⑤ -loop simの履歴取り出し - 暇人日記

 

このときは

f:id:omoshiroamericanews:20191120000610p:plain

 

そしてこれがプログラミングでした。

f:id:omoshiroamericanews:20191120001211p:plain

 

これを参考にこうしました。

 

f:id:omoshiroamericanews:20191120001639p:plain

しかしresultsが900X1で縦一行になってしまいました。

欲しいのは300X3です。

 

そこで前回(C,sigma,error)と並べたように(K,dis)と並べることにしました。

f:id:omoshiroamericanews:20191120004636p:plain

 

errorが出ました。

f:id:omoshiroamericanews:20191120003613p:plain

どうやらiは1X1でdisは300X1だから並べれないようです。

 

それでは(K,dis)と並べることは諦めて、

week5-6で実践した「dis(i)」に取り組みます。

 

f:id:omoshiroamericanews:20191120004825p:plain

 

Errorがでました。どうやらさっきと同じで

iは1X1でdisは300X1だから並べれないようです。

f:id:omoshiroamericanews:20191120005056p:plain

 

Week6では↓でうまくいった方法ですが、Week7でも今回でも

うまく機能しませんでした。

 

f:id:omoshiroamericanews:20191120005745p:plain

 

これはWeek6の例↑では(i)をつけて取り出そうとしているerror_train,error_valが

1X1だから機能したのかもしれません。

機能しなかったWeek7の例では取り出そうとしたのは1X3のベクトルでした。

今回の例では取り出そうとしたのは300X1のベクトルでした。

 

(i)をつける方法は1X1のデータを取り出すのには有効で、

ベクトルには不向きなのかもしれません。

 

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