前回気づいたこの点に取り組みたいと思います。
*********************************************************************
が、問題文詳細oneVSAll.mを読んで
問題文とは違うことをやっていることに気づきましたorz
問題文詳細oneVSAll.mでは、ユーザーが変更しない箇所に
all_theta = zeros(num_labels, n + 1)
と書いてあります。
これは私が最適thetaの401X10と同じことを狙っているベクトルなのですが、
all_thetaは10X401のベクトルなので、このままではコースで点がとれません。
(ベクトルの形が違うのでエラーになります。)
**************************************************************************
ということで今回はoneVSAll.mとpredictOneVsAll.mに取り組みます。
改めてプログラム詳細oneVSAll.mを読みます。
X,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行になるということですね。
よく読んでおけばよかったです泣
前回の日記では↓のプログラミングで行ったわけですが、
resultsは401X10だったので、これを10X401になるよう考える必要があります。
まず、resultsをall_thetaに置き換えました。
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を読んでみます。
predictOneVsAll.mはall_thetaとXを入力されるとpが計算される
関数になっています。
pは予測精度で5000の実サンプルと予測が何%あっているかを
示すものになっています。
解き方は前回の日記に書いたので今回は逆から並べてみます。
5000の実サンプルと予測の差は
を使います。
yは5000の実サンプルで、pは5000の予測です。
5000の予測は5000行全てに10個の予測を行い、
最も1に近いものを選びます。
最も1に近いものを選ぶ式が↓でした。
5000x10の予測を作るのに必要なのが401x10もしくは10X401のthetaでした。
これをOneVSA11①-③の日記で書いてました。
**************************************************************************
predictOneVsAll.mはall_thetaとXを入力されるとpが計算される
関数になっています。
**************************************************************************
というわけで、all_thetaは10X401でXは5000X400なので
Xに要素がすべて1のベクトルを1行足して5000X401に変化させるので
5000X10の予測ができます。
5000X10の予測を作ったら
↑の式を利用して
5000X1の予測に変化させます。
そうすると5000X1の予測と5000X1の実サンプルを比べることができ、
を使えます!
今回はここまでです。また次回頑張ります!