編程作業(yè) 3: Multi-class Classification and Neural Networks

記錄機(jī)器學(xué)習(xí)第3次編程作業(yè)的解題思路,通過這次的練習(xí),你可以使用logistic regression和neural networks來進(jìn)行手寫數(shù)字識(shí)別。

Part 1. Multi-class Classification

1. Training Set 說明

ex3data1.mat中存放的是Multi-class Classification使用的Training Set,包含了X和y兩個(gè)值,使用MATLAB打開后顯示如下圖:

ex3data1.mat

在ex3.m中,會(huì)調(diào)用load來加載ex3data1.mat中的數(shù)據(jù)

load('ex3data1.mat')

X中包含了5000個(gè)樣本,每個(gè)樣本代表1個(gè)數(shù)字,1個(gè)數(shù)字由20 * 20 的像素組成,代表一個(gè)灰度圖像,每一個(gè)像素用一個(gè)浮點(diǎn)數(shù)表示。一個(gè)樣本為400 * 1的行向量,因此,整個(gè)輸入樣本的維度是5000 * 400。

ex3.pdf中對(duì)X的描述

y中表示的是對(duì)應(yīng)樣本X表示的數(shù)字是多少,其中數(shù)字0被標(biāo)記為10,數(shù)字1到9被標(biāo)記為1到9,y的維度為5000 * 1

ex3.pdf中對(duì)y的描述

2. 可視化數(shù)據(jù)

在ex3.m中會(huì)調(diào)用displayData可以將由20 * 20 的像素點(diǎn)組成的數(shù)字繪制出來

ex3.m中調(diào)用displayData繪制數(shù)字

隨機(jī)選擇100個(gè)樣本進(jìn)行繪制,效果圖如下:

隨機(jī)選擇100個(gè)樣本進(jìn)行顯示

當(dāng)然,我們可以繪制所有的5000個(gè)數(shù)字,displayData傳入X作為參數(shù)即可,由于數(shù)據(jù)量太大了,每個(gè)數(shù)字會(huì)被縮小顯示,點(diǎn)擊Z+可以放大圖像。

>displayData(X);
顯示所有的樣本

放大后的效果為下圖所示,我們可以看到一個(gè)數(shù)字都有對(duì)應(yīng)有很多種形狀,即Multi-class Classification中的OneVsAll。

放大圖片

3. lrCostFunction

和編程作業(yè)2的costFunctionReg實(shí)現(xiàn)代碼一樣

temp = theta(2:length(theta));
J = sum((-y).*log(sigmoid(X*theta)) - (1-y).*log(1 - sigmoid(X*theta)))/m + (lambda/(2*m))*sum(temp.^2);

for i=1:size(X,2)
    grad(i) = ((sigmoid(X*theta) - y)'*X(:,i))/m;
end

grad = grad + [0;((lambda/m)*temp)];

4. oneVsAll

這道題在注釋里面有一段提示可以參考

Example Code for fmincg

實(shí)現(xiàn)代碼如下:

initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1:num_labels
[theta] = ...
         fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
                 initial_theta, options);
all_theta(c,:) = theta';
end;

5. predictOneVsAll

首先,傳入的all_theta是通過oneVsAll得到的,all_theta是一個(gè) 10 * 401的矩陣,一共10行,每一行代表一個(gè)數(shù)字,一共10個(gè)數(shù)字。

function p = predictOneVsAll(all_theta, X)

為了更容易理解算法的實(shí)現(xiàn),我會(huì)把計(jì)算過程中得到的關(guān)鍵值保存為.mat格式的文件,下圖為all_theta的值。

all_theta.mat

通過all_theta,我們可以計(jì)算出一個(gè)temp矩陣,維度為5000*10,每一行代表一個(gè)樣本,一共5000個(gè)樣本,每一列表示成為該num_labels的概率,num_labels值等于列值。

temp = zeros(size(X, 1), num_labels);
for i=1:num_labels,
    temp(:,i) = sigmoid(X*(all_theta(i,:)'));
end

例如:第一行第二列的值為0.0003518171008132601,表示第一個(gè)樣本是數(shù)字2的概率為0.0003518171008132601。第一行中數(shù)值最大的是第10列,即:0.999561625035584,說明第一個(gè)樣本最有可能對(duì)應(yīng)的num_labels為10代表的數(shù)字,預(yù)測(cè)輸出為10。

temp矩陣

因此,p的計(jì)算過程為:找出每一行的最大值的index,即為預(yù)測(cè)值輸出值。

for i=1:m,
[x, ix] = max(temp(i,:));
p(i) = ix;
end

通過上面的代碼計(jì)算得到的p的值,是一個(gè)5000 * 1的向量

p

完整實(shí)現(xiàn)代碼如下:

predictOneVsAll

Part 2. Neural Networks

predict

第二部分只需要實(shí)現(xiàn)predict函數(shù),predict傳入的參數(shù)Theta1和Theta2,是從ex3weights.mat中加載來的,X仍然來自ex3data1.mat。

ex3weights.mat
ex3weights.mat
Neural network model.
X = [ones(m, 1) X];

z2 = X*Theta1';
a2 = sigmoid(z2);
a2 = [ones(size(a2, 1), 1) a2];

z3 = a2*Theta2';
a3 = sigmoid(z3);

再使用和predictOneVsAll一樣的取最大值方法

for i=1:m,
[x, ix] = max(a3(i,:));
p(i) = ix;
end

完整實(shí)現(xiàn)代碼

predict

提交以后完成本次作業(yè)

submit
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容