暇人日記

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

Coursera Machine Learning Week4 課題 2周目⑦ -苦闘記憶-  One vsALL⑤

前回気づいたこの点に取り組みたいと思います。

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

が、問題文詳細oneVSAll.mを読んで

問題文とは違うことをやっていることに気づきましたorz

 

問題文詳細oneVSAll.mでは、ユーザーが変更しない箇所に

all_theta = zeros(num_labels, n + 1)

と書いてあります。

これは私が最適thetaの401X10と同じことを狙っているベクトルなのですが、

all_thetaは10X401のベクトルなので、このままではコースで点がとれません。

(ベクトルの形が違うのでエラーになります。)

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

 

ということで今回はoneVSAll.mとpredictOneVsAll.mに取り組みます。

f:id:omoshiroamericanews:20200328170818p:plain

 

改めてプログラム詳細oneVSAll.mを読みます。

f:id:omoshiroamericanews:20200226215039p:plainX,y,num_labals,lambdaを入力するとall_thetaを計算してくれる関数です。

 

 %ONEVSALL trains multiple logistic regression classifiers and returns all
%the classifiers in a matrix all_theta, where the i-th row of all_theta
%corresponds to the classifier for label i

 

プログラム中に↑のコメントがありi列が0-9に対応と書いているので、

all_thetaは10列X401行になるということですね。

よく読んでおけばよかったです泣

 

前回の日記では↓のプログラミングで行ったわけですが、

f:id:omoshiroamericanews:20200308115607p:plain

resultsは401X10だったので、これを10X401になるよう考える必要があります。

 

まず、resultsをall_thetaに置き換えました。

f:id:omoshiroamericanews:20200308214249p:plain

 

401X10を10X401にしたいので、

まずall_theta=zeros(size(X,2),num_labels)の縦横を入れ替えるために

all_theta=zeros(num_labels,size(X,2))にします。

これで10X401になります。

 

all_theta(:,c) = thetaも401X10の上書きではなく、10X401の上書きなので、

all_theta(c,:) = theta

に直します。

 

これで問題文に沿った形になりました!

 

Predictのやり方は前回の日記と同じですが、

問題文に即した形にしたいと思います。

 

プログラム詳細predictOneVsAll.mを読んでみます。

f:id:omoshiroamericanews:20200328171323p:plain

predictOneVsAll.mはall_thetaとXを入力されるとpが計算される

関数になっています。

 

pは予測精度で5000の実サンプルと予測が何%あっているかを

示すものになっています。

 

解き方は前回の日記に書いたので今回は逆から並べてみます。

 

5000の実サンプルと予測の差は

f:id:omoshiroamericanews:20200328171910p:plain

を使います。

 

yは5000の実サンプルで、pは5000の予測です。

 

5000の予測は5000行全てに10個の予測を行い、

最も1に近いものを選びます。

f:id:omoshiroamericanews:20200328172148p:plain

 

最も1に近いものを選ぶ式が↓でした。

f:id:omoshiroamericanews:20200328171834p:plain

 

5000x10の予測を作るのに必要なのが401x10もしくは10X401のthetaでした。

これをOneVSA11①-③の日記で書いてました。

 

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

predictOneVsAll.mはall_thetaとXを入力されるとpが計算される

関数になっています。

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

というわけで、all_thetaは10X401でXは5000X400なので

Xに要素がすべて1のベクトルを1行足して5000X401に変化させるので

5000X10の予測ができます。

 

5000X10の予測を作ったら

f:id:omoshiroamericanews:20200328171834p:plain

↑の式を利用して

5000X1の予測に変化させます。

 

そうすると5000X1の予測と5000X1の実サンプルを比べることができ、

f:id:omoshiroamericanews:20200328171910p:plain

を使えます!

 

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