机器学习吴恩达编程作业题2——逻辑回归

1、逻辑回归

1.1数据的图形呈现

首先在D:\Machine Learning\ex2目录下,建立plotData.m文件,以此完成数据集的图形化呈现。

function plotData(X, y)
%该函数没有返回值,两个参数。第一个参数是数据集的第一列和第二列数据,为自
%变量,代表学生两次考试成绩;第二个参数是数据集第三列数据,代表学生录取决定
figure; %新建一个图
hold on;%在原图上面继续绘制
pos = find(y==1); %找到录取情况下对应的行号,从1开始。
neg = find(y == 0);%找到未录取情况下对应的行号,从1开始。
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2,  'MarkerSize', 7); 
%将录取的坐标绘制成黑色的十字,设置了线宽和标记大小
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y',  'MarkerSize', 7);
%继续绘制,将未录取坐标绘制成黑色的圆圈,标记颜色为黄色,设置标记大小。
hold off;%关闭继续绘制
end

Octave中操作:
将路径转换到D:\Machine Learning\ex2,并加载数据集,初始化X,y。调用plotData函数完成绘制,并添加标题和图形示例。在这里插入图片描述

1.2sigmoid函数的实现

在这里插入图片描述在这里插入图片描述
在当前目录下建立sigmoid.m文件,实现上述两个数学表达式:

function g = sigmoid(z)
%函数返回值为g矩阵,参数是θTx
g = zeros(size(z));
%初始化g矩阵
a = ones(size(z));
%初始化a矩阵为单位矩阵
g = a./(exp(-z)+1);
%注意矩阵的点除
end

1.3代价函数和梯度

在这里插入图片描述
在这里插入图片描述
在当前目录下建立costFunction.m文件,并在该文件中实现代价函数表达式,并且计算返回相应的梯度:

function [J, grad] = costFunction(theta, X, y)
%函数有两个返回值,第一个是代价函数的值,第二个就是相应的梯度。第一个参数是θ矩阵
m = length(y); 
%记载个数目
J = 0;
grad = zeros(size(theta));
%初始化梯度,梯度与θ矩阵有相同的维数
J = sum(log(sigmoid(X * theta)) .* (-y) - log(1 - sigmoid(X * theta)) .* (1 - y)) / m;
%调用sigmoid函数
grad = ((sigmoid(X * theta) - y)' * X / m)' ;
%注意矩阵的转置
end

Octave中操作:根据响应θ计算代价函数的值,以及相应的梯度。
这里记得给X矩阵和θ矩阵增加常数列,
在这里插入图片描述

1.4使用fminunc学习参数

如果正确地完成了costFunction,fminunc将收敛于正确的优化参数,并返回cost和θ的最终值。注意,通过使用fminunc,您不必自己编写任何循环,也不必像梯度下降那样设置学习速率。这一切都是由fminunc完成的:您只需要提供一个计算成本和梯度的函数。

首先在该目录下建立一个plotDecisionBoundary.m文件,在这之中画出决策边界:

function plotDecisionBoundary(theta, X, y)
%无返回值
plotData(X(:,2:3), y);
%绘制数据集的数据
hold on
if size(X, 2) <= 3
    % 只用定义两个点来画一条直线
    plot_x = [min(X(:,2))-2,  max(X(:,2))+2];
    %设置两个点的x坐标
    plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
    %设置两个y坐标,这里等式成立时为不录取状态(0),第一列为常数,第二列为θ1,第三列为θ2
    plot(plot_x, plot_y)
    legend('Admitted', 'Not admitted', 'Decision Boundary')
    axis([30, 100, 30, 100])
    %设置x,y坐标范围
else
    u = linspace(-1, 1.5, 50);
    v = linspace(-1, 1.5, 50);
    z = zeros(length(u), length(v));
    % 设置边界坐标z的矩阵的值,也就是预测结果的值。
    for i = 1:length(u)
        for j = 1:length(v)
            z(i,j) = mapFeature(u(i), v(j))*theta;
        end
    end
    z = z'; 
    % 画等高线图划分边界之前要转置,contour第四个参数指画z为0等高线
    contour(u, v, z, [0, 0], 'LineWidth', 2)
end
hold off
end

这里用到了mapFeature函数,更好地拟合数据的一种方法是从每个数据点创建更多的特征。在提供的函数mapFeature.m中,我们将把特征映射到x1和x2的所有多项式项中,直到六次方。
在这里插入图片描述
在当前路径下创建mapFeature.m文件,实现曲线的等高线图来划分决策边界:

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);
    end
end
end

Octave中调用optimset和fminunc中直接算出相应的θ参数矩阵以及代价函数相对应最小的值。
optimset(‘GradObj’, ‘on’, ‘MaxIter’, 400);第一个参数指用户自定义的目标函数梯度;第三、四个参数是最大迭代次数;
最后就是绘制出决策边界:
在这里插入图片描述
画出的决策边界为:
在这里插入图片描述

1.5预测录取情况

在学习了参数之后,你可以用这个模型来预测某个学生是否会被录取。对于一个第一次考试成绩为45分,第二次考试成绩为85分的学生,你应该会看到入学概率为0.776。predict函数将在给定数据集和学习参数向量θ的情况下生成“1”或“0”预测。
在当前目录下建立predict.m文件:

function p = predict(theta, X)
m = size(X, 1);
p = zeros(m, 1);
p = sigmoid(X * theta);
%就是处理过的hθ(x)
for i=1:m,
  %m个个例
if p(i,1) >= 0.5,
 p(i,1) = 1;
else
 p(i,1) = 0;
end;
end;
end

在这里插入图片描述
给出了数据集中预测的结果。

2、正则逻辑回归

2.1可视化数据

将数据集ex2data2.txt复制到当前目录下,加载该数据集,同时绘制数据集的图形。
在这里插入图片描述
在这里插入图片描述

2.2成本函数和梯度

在这里插入图片描述
在这里插入图片描述
首先在当前目录下建立costFunctionReg.m文件,来求出代价函数值和返回梯度 。

function [J, grad] = costFunctionReg(theta, X, y, lambda)
%返回值有两个,一个是代价函数值,一个是梯度
%第四个参数是λ
m = length(y); 
J = 0;
grad = zeros(size(theta));
%梯度矩阵的维度与θ矩阵维度一致
J = sum(log(sigmoid(X * theta)) .* (-y) - log(1 - sigmoid(X * theta)) .* (1 - y)) / m;
J = J + (sum(theta.^2) - theta(1,1)*theta(1,1)) * lambda /2/m; 
grad = ((sigmoid(X * theta) - y)' * X / m)' ;
temp = grad(1,1);
%θ0不参与任何一个正则化,所以第一行的元素单独保存出来
grad = grad + lambda.*theta/m ;
grad(1,1) = temp ; 
end

Octave中操作:

  1. 让每个数据点创建更多的特征,初始化θ矩阵,调用代价函数计算代价和梯度。
  2. 初始化λ值,调用fminunc 函数,算出θ矩阵和相应的代价函数值。
  3. 根据θ矩阵绘制相应的决策边界。
  4. 然后将X进行预测,将预测的y与之前的y进行比较,看预测正确的概率
    在这里插入图片描述
    可以看到预测成功的概率为83.051%,相应的决策边界图为:
    在这里插入图片描述
    当然你也可以将λ值设置为0或者100,查看过拟合和欠拟合情况下的图形以及预测成功的概率。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值