使用Logistic Regression Algorithm進行多分類數字識別的Octave仿真
阿新 • • 發佈:2017-05-18
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仿真