1. 程式人生 > >使用Logistic Regression Algorithm進行多分類數字識別的Octave仿真

使用Logistic Regression Algorithm進行多分類數字識別的Octave仿真

example 進行 構建 examples label put sig http mat

所需解決的問題是,訓練一個Logistic Regression系統,使之能夠識別手寫體數字1-10,每張圖片為20px*20px的灰度圖。訓練樣例的輸入X是5000行400列的一個矩陣,每一行存儲一張圖片(20^2=400),共5000個訓練樣例,而y則為手寫體所表示的數字1-10。

技術分享

技術分享

利用Logistic Regression進行多分類應用,其基礎是將問題本身化解為z個二分類問題,其中z為類別的個數。第一步,將向量m*1維y擴展為矩陣m*z維矩陣Y,向量n+1維向量theta擴展為矩陣z*(n+1)維矩陣Theta。其意義是將一維數據轉換至二維,以0,1表示,從而使我們能夠利用二分類來解決問題。如下圖:

技術分享

第二步,利用內置函數fmincg來求解10組問題的最佳theta值,構建10*401維theta_all矩陣:

function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);
n = size(X, 2);

all_theta = zeros(num_labels, n + 1);

% Add ones to the X data matrix
X = [ones(m, 1) X];

% loop for every number, we train the theta of every number respectively.
initial_theta = zeros(n+1,1);
options = optimset(‘GradObj‘, ‘on‘, ‘MaxIter‘, 50);

for(i=1:num_labels)

  y_b=(y==i);

  all_theta(i,:) = fmincg (@(t)(lrCostFunction(t, X,y_b, lambda)), ...
                   initial_theta, options);


endfor

其中用到的lrCostFunction函數如下:

function [J, grad] = lrCostFunction(theta, X, y, lambda)
%LRCOSTFUNCTION Compute cost and gradient for logistic regression with 
%regularization
%   J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using
%   theta as the parameter for regularized logistic regression and the
%   gradient of the cost w.r.t. to the parameters. 

% Initialize some useful values
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));

tmp=ones(m,1);
h = sigmoid(X*theta);
h1=log(h);
h2=log(tmp-h);

y2=tmp-y;

J=(y‘*h1+y2‘*h2)/(-m);

theta(1)=0;

J+=theta‘*theta*lambda/(2*m);
grad=((X‘*(h-y))+lambda*theta)/m;

grad = grad(:);

end

第三步,合並該問題,構建“可能性矩陣”,然後選擇可能性最大的項作為系統的輸出:

function p = predictOneVsAll(all_theta, X)

m = size(X, 1);
num_labels = size(all_theta, 1);

p = zeros(size(X, 1), 1);

X = [ones(m, 1) X];

probMatrix = X*all_theta‘;
[pVector,p] = max(probMatrix,[],2);

end

技術分享

使用Logistic Regression Algorithm進行多分類數字識別的Octave仿真