暇人日記

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

Coursera Machine Learning Week8 課題 苦闘日記③

今回はこの課題↓Compute Centroid Meansに取り組みたいと思います。

f:id:omoshiroamericanews:20191121104447p:plain

(出典;『Coursera Machine Learning 』By Mr.Andrew Ng)

 

 

こういう順番で取り組んでいきます。

 

 

 

 

問題文を読む

f:id:omoshiroamericanews:20191121104752p:plain

(出典;『Coursera Machine Learning 』By Mr.Andrew Ng)

 

赤枠で囲った式を作るということですね。

findclosestcentroidsで割り付けたxについて平均値を出して、

それを中心点とするということですね。

 

足し算するときは各要素の足し算でいいか?

Xの1行目の平均、Xの2行目の平均で(○、△)=μkとなるのか?

1/Ckは1/2と表現されているが、これはカテゴリーの2か、それとも要素数の2か?

 

これらを試行錯誤の中で確認ですね。

 

また、実行方法について

ループFunctionでもvectorized functionでも実行可能とあるのでどっちで実行するか?

 

これも試行錯誤の中で確認ですね。

 

課題プログラム全体版を読み解く(ex7.m)

f:id:omoshiroamericanews:20191121105520p:plain

(出典;『Coursera Machine Learning 』By Mr.Andrew Ng)

 

ComputeCentroidsはX,idx,Kを変数としてcentroidsを計算する関数ですね。

 

演算結果が

[ 2.428301  3.157924 ]

[ 5.813503  2.633656 ]

[ 7.119387  3.616684 ]

となったら正解ということですね。

 

課題プログラム個別版を読み解く(Compute Centroids Means)

この中ではloopを推奨されているように読み取れました。

 

loopにすると取り出すのでまた躓くんじゃないかという不安があります。

悩みますね。。。

 

 

 

正答が提示されてるのでそれをGoalとして設定

[ 2.428301  3.157924 ]

[ 5.813503  2.633656 ]

[ 7.119387  3.616684 ]

これを目指します。

 

 

試行錯誤開始

 まずはループ方法かベクトル方法かを選ぶということですね。

 

少しベクトル方法を考えてみることにします。

 

Goalは3X2のベクトルになるということで、まず計算要素の

 X,idx,Kをみてみると、

f:id:omoshiroamericanews:20191121123117p:plain

なので、次元だけ合わせるように考えると

f:id:omoshiroamericanews:20191121123252p:plain

こういう風に計算となりますが、

ベクトルの形は合いますが、

答えの

[ 2.428301 3.157924 ]

[ 5.813503 2.633656 ]

[ 7.119387 3.616684 ]

で示されている1行目がカテゴリー1、2行目がカテゴリー2、3行目がカテゴリー3が、

ベクトルで計算する場合それをどう示すか?がわかりません。

 

ループ方式で行くことにします。

 

f:id:omoshiroamericanews:20191121124014p:plain

やりたいことはこの2つのベクトルで

idxで1になってるXだけを抜き出して平均を計算

idxで2になってるXだけを抜き出して平均を計算

idxで3になってるXだけを抜き出して平均を計算

 

になります。

 

for i=1:size(X,1)で1-300をループさせて

   idx(i)=1 のとき

  idx(i)=2のものはidxを0へ変換

  idx(I)=3のものはidxを0へ変換

  idx’ * X で1X2で

   1のものだけ残ってそれの平均を計算

  それをmeanXとして履歴取り出し

  meanXは1X2のベクトルだからresultが適している?

という概略がいいかと思ってこれで進んでいこうと思います。

 

いきなり 躓きました。

   idx(i)=1 のとき

  idx(i)=2のものはidxを0へ変換

  idx(I)=3のものはidxを0へ変換

これを表現するに

if idx(i)==1

  idx(i)==2,idx(i)=0

みたいになってしまって訳が分かりません。

 

 

   idx(i)=1 のとき

  idx(i)=2のものはX(i,:)を0へ変換

  idx(I)=3のものはX(i,:)を0へ変換

にしたいと思います。

 

まず簡単版として

idx(i)=1のとき、X(i,:)を0へ変換を実験してみます。

 

f:id:omoshiroamericanews:20191121124859p:plain

結果です。

f:id:omoshiroamericanews:20191121125015p:plain

うまくいきました。

ただ、X(i,:)=[0 0]が一般化できてなくて、Xのデータが3行とか4行になったら

対応できないので、↓変更しました。

X(i,:)=zeros(1, size(X,2))

 

これで idx(i)=1のとき、X(i,:)を0へ変換の実験は成功です。

 

次に↓を解決できればこの課題をクリアできそうです。

  idx(i)=1 のとき

  idx(i)=2のものはX(i,:)を0へ変換

  idx(I)=3のものはX(i,:)を0へ変換

 

プチノート<idx保存>

********************************************************************************************

findclosestcentroidsを計算しないとidxはでないが、

この計算はかなり時間がかかるので、idxをテキストに保存して

loadを使って短縮化しようとした話です。 

 

直接のコピペは行が長すぎてマウスをドラッグできなかったので諦めて、

 ここを左クリックで値コピーしました。

f:id:omoshiroamericanews:20191122010153p:plain

 

結果がこうです。

 

f:id:omoshiroamericanews:20191122010242p:plain

 

このままコピペでテキストファイルに保存するとloadできませんでした。

 

そこでこのように↓処理して保存したらloadできました。

f:id:omoshiroamericanews:20191122010356p:plain

もっといい方法を

Coursera Machine Learning Week8 課題 苦闘日記⑧ optional取組 - 暇人日記

 で見つけました!

*******************************************************************************************

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