Coursera Machine Learning Week8 課題 苦闘日記③
今回はこの課題↓Compute Centroid Meansに取り組みたいと思います。
(出典;『Coursera Machine Learning 』By Mr.Andrew Ng)
こういう順番で取り組んでいきます。
- 問題文を読む
- 課題プログラム全体版を読み解く(ex7.m)
- 課題プログラム個別版を読み解く(Compute Centroids Means)
- 正答が提示されてるのでそれをGoalとして設定
- 試行錯誤開始
問題文を読む
(出典;『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)
(出典;『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をみてみると、
なので、次元だけ合わせるように考えると
こういう風に計算となりますが、
ベクトルの形は合いますが、
答えの
[ 2.428301 3.157924 ]
[ 5.813503 2.633656 ]
[ 7.119387 3.616684 ]
で示されている1行目がカテゴリー1、2行目がカテゴリー2、3行目がカテゴリー3が、
ベクトルで計算する場合それをどう示すか?がわかりません。
ループ方式で行くことにします。
やりたいことはこの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へ変換を実験してみます。
結果です。
うまくいきました。
ただ、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を使って短縮化しようとした話です。
直接のコピペは行が長すぎてマウスをドラッグできなかったので諦めて、
ここを左クリックで値コピーしました。
結果がこうです。
このままコピペでテキストファイルに保存するとloadできませんでした。
そこでこのように↓処理して保存したらloadできました。
もっといい方法を
Coursera Machine Learning Week8 課題 苦闘日記⑧ optional取組 - 暇人日記
で見つけました!
*******************************************************************************************
今回はここまでです。また次回頑張ります。