一. 逻辑回归

  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
posted on 2018-05-09 15:16  LoganGo  阅读(5448)  评论(0编辑  收藏  举报