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中操作:
- 让每个数据点创建更多的特征,初始化θ矩阵,调用代价函数计算代价和梯度。
- 初始化λ值,调用fminunc 函数,算出θ矩阵和相应的代价函数值。
- 根据θ矩阵绘制相应的决策边界。
- 然后将X进行预测,将预测的y与之前的y进行比较,看预测正确的概率
可以看到预测成功的概率为83.051%,相应的决策边界图为:
当然你也可以将λ值设置为0或者100,查看过拟合和欠拟合情况下的图形以及预测成功的概率。