Coursera-AndrewNg(吳恩達)機器學習筆記——第三周編程作業(邏輯回歸)


一. 邏輯回歸

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM