序
記錄機(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打開后顯示如下圖:

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

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

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

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

隨機(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
這道題在注釋里面有一段提示可以參考

實(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,我們可以計(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。

因此,p的計(jì)算過程為:找出每一行的最大值的index,即為預(yù)測(cè)值輸出值。
for i=1:m,
[x, ix] = max(temp(i,:));
p(i) = ix;
end
通過上面的代碼計(jì)算得到的p的值,是一個(gè)5000 * 1的向量

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

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



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)代碼

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