一. 邏輯回歸
1.背景:使用邏輯回歸預測學生是否會被大學錄取。
2.首先對數據進行可視化,代碼如下:
pos = find(y==1); %找到通過學生的序號向量 neg = find(y==0); %找到未通過學生的序號向量 plot(X(pos,1),X(pos,2),'k+','LineWidth',2,'MarkerSize',7); %使用+繪制通過學生 hold on; plot(X(neg,1),X(neg,2),'ko','MarkerFaceColor','y','MarkerSize',7); %使用o繪制未通過學生 % Put some labels hold on; % Labels and Legend xlabel('Exam 1 score') ylabel('Exam 2 score') % Specified in plot order legend('Admitted', 'Not admitted') hold off;
3.sigmoid函數的實現,代碼如下:
function g = sigmoid(z) %函數文件名為sigmoid.m %SIGMOID Compute sigmoid function % g = SIGMOID(z) computes the sigmoid of z. % You need to return the following variables correctly g = zeros(size(z)); temp=-z; temp=e.^temp; temp=temp+1; temp=1./temp; g=temp; end
4.代價函數的實現代碼如下:
function [J, grad] = costFunction(theta, X, y) %函數名文件名為costFunction.m m = length(y); % number of training examples % You need to return the following variables correctly J = 1/m*(-(y')*log(sigmoid(X*theta))-(1-y)'*log(1-sigmoid(X*theta))); %計算代價函數 grad = zeros(size(theta)); grad = 1/m*X'*(sigmoid(X*theta)-y); %求梯度
end
5.代替梯度下降的優化方法fminunc(),代碼如下:
% 參數GradObj設置為on表示,通知函數fminunc()我們的代價函數costFunction()可以返回代價值和梯度值,函數fminunc()可以直接使用梯度值進行計算 options = optimset('GradObj', 'on', 'MaxIter', 400); % Run fminunc to obtain the optimal theta % This function will return theta and the cost [theta, cost] = ... fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
6.使用計算出的θi值做預測,預測函數如下:
function p = predict(theta, X) m = size(X, 1); % Number of training examples p = zeros(m, 1); p=floor(sigmoid(X*theta).*2); %因為使用了floor()函數,所以函數值要擴大二倍
二. 正規化邏輯回歸
1.特征映射(Feature Mapping):使用兩個特征(x1,x2)組合出更多的特征如x1x2,x12,x22等。代碼如下:
function out = mapFeature(X1, X2) degree = 6; out = ones(size(X1(:,1))); for i = 1:degree for j = 0:i out(:, end+1) = (X1.^(i-j)).*(X2.^j); %一共生成27項 end
end end
2.計算在邏輯回歸中經過正規化的代價函數和梯度:
function [J, grad] = costFunctionReg(theta, X, y, lambda) m = length(y); % number of training examples
J = 1/m*(-(y')*log(sigmoid(X*theta))-(1-y)'*log(1-sigmoid(X*theta)))+(1/(2*m))*lambda*(sum(theta .^2) - theta(1)^2); %正規化時不用對θ1正規化 grad = zeros(size(theta) grad = 1/m*X'*(sigmoid(X*theta)-y)+lambda*theta/m; grad(1) = grad(1)-lambda*theta(1)/m; end