2020/03/21
总结:
- 两变量的逻辑回归(线性回归):,直线拟合数据
- 多项式拟合的逻辑回归:Mapfeature,将两个特征的数据映射到多项式
- 可以得到更复杂的决策边界,多项式引入了非线性
- 引入了更多非线性特征后容易过拟合,因此需要正则化
- 正则化的参数会影响过拟合还是欠拟合
- λ过小,正则化强度弱,过拟合
- λ过大,正则化强度过去,欠拟合
1、两变量的逻辑回归
通过两门成绩判断该同学是否会被录取
在这部分练习中,你将建立一个Logistic回归模型来预测一个学生是否被大学录取。 假设你是大学毕业生的管理者 你想根据每个申请人的两次考试的结果来决定每个人的入学机会。 您有来自以前申请者的历史数据,可以用作逻辑回归的训练集。 对于每个培训示例,您都有申请人在两个exam上的分数和录取决定。 你的任务是建立一个分类模型,根据这两次考试的分数来估计申请人的入学概率。
采用的函数为:
代价函数为:J(θ)是θ的凸函数,所以可以求导,可以用优化算法求解。
导数为:
最后,虽然是分类问题,但是用到模型其实是:,还是线性模型。分类结果如下:
这个最优线性模型在训练集上的训练准确率为89%
data = load('ex2data1.txt');
X = data(:, [1, 2]); y = data(:, 3); % 成绩和录取结果
figure;hold on;
pos = find(y == 1); neg = find(y == 0);
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;
%% 2:计算代价函数和梯度
[m, n] = size(X);
% Add intercept term to x and X_test
X = [ones(m, 1) X];
% Initialize fitting parameters
initial_theta = zeros(n + 1, 1);
sigmoid = @(z)(1 ./ (1 + exp(-z)));
m = length(y); % number of training examples
J = -1 * sum( y.* log(sigmoid(X * theta)) + (1 - y) .* log(1 - sigmoid(X*theta)) ) / m ;
grad = 1/m * X' * (sigmoid( X * theta - y));
%% 3:求解部分使用最优化函数求解fminunc,给出代价函数和导数,就可以求出最优解
% 如:梯度下降法、共轭梯度法
% Set options for 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);
% plot Decision Boundary 利用求出的最优参数画出决策边界
% 先画出原始的数据
figure;hold on;
pos = find(y == 1); neg = find(y == 0);
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y','MarkerSize', 7);
% Only need 2 points to define a line, so choose two endpoints
plot_x = [min(X(:,2))-2, max(X(:,2))+2];
% Calculate the decision boundary line
plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
% Plot, and adjust axes for better viewing
plot(plot_x, plot_y)
% Legend, specific for the exercise
legend('Admitted', 'Not admitted', 'Decision Boundary')
axis([30, 100, 30, 100])
hold off
% 给出一个学生的成绩,被Accept的概率进行预测
prob = sigmoid([1 45 85] * theta);
% 统计这个最优线性模型在训练集上的准确率
% Compute accuracy on our training set
k = find(sigmoid( X * theta) >= 0.5 );
p(k) = 1;
accuracy = mean(double( p == y )) * 100;
2、正则化的逻辑回归
在这部分练习中,您将实现正则化的Logistic回归,以预测来自制造工厂的微芯片是否通过质量保证(Q A)。 在QA期间,每个微芯片 通过各种测试,以确保它正确运作。 假设你是工厂的产品经理,你有两个不同测试的一些微芯片的测试结果。 从这两个测试,您想确定微芯片是否应该被接受或拒绝。 为了帮助你做出决定,你在过去的微芯片上有一个测试结果的数据集,你可以构建 Logistic回归模型。 您将使用另一个脚本ex2reg.m来完成练习的这一部分。
2.1 可视化数据
data = load('ex2data2.txt');
X = data(:, [1, 2]); y = data(:, 3);
% Find Indices of Positive and Negative Examples
pos = find(y == 1); neg = find(y == 0);
% Plot Examples
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y','MarkerSize', 7);
上图可知我们的数据集无法通过直线来分割出正负样本。 因此,Logistic回归的简单应用将不能很好地应用于该数据集,因为Logistic回归只能是求一个线性决策边界。
2.2 Featuring mapping
更好地拟合数据的一种方法是从每个数据点创建更多的特性。 在提供的函数映射Feature.m中,我们将把这些特征映射到x1和x2的所有多项式项中,直到第6次方。
线性模型无法分割出正负样本,映射到多项式进行逻辑回归,引入非线性。类似于多项式回归。
由于这种映射,我们的两个特征向量(两个QA测试的分数)已经转化为一个28维向量。
一个逻辑回归分类器训练在这个较高的特征向量上将有一个更复杂的决策边界,并将出现非线性,绘制在我们的二维图。 虽然特征映射允许我们构建一个更具表现力的分类器, 它也更容易受到过度拟合。 在练习的下一部分中,您将实现正则化Logistic回归来拟合数据,并为自己了解正则化如何帮助 解决过度拟合问题。
2.3 代价函数和导数
逻辑回归中的正则化代价函数如下;
请注意,不应将参数θ0正则化。 在matlab中索引从1开始,因此不应该正则代码中的θ1参数(对应于θ0)正则化。 代价函数的梯度是一个向量,其中第j个元素定义如下:
% 映射特征
degree = 6;
out = ones(size(X(:,1)));
for i = 1:degree
for j = 0:i
out(:, end+1) = (X1.^(i-j)).*(X2.^j);
end
end
X = out; % 映射为多项式之后的X(样本)
% 正则化参数
lambda = 1;
m = length(y);
theta = zeros(size(X, 2), 1); % 与x的多项式个数相同的theta
theta_1=[0;theta(2:end)]; % 先把theta(1)拿掉,不参与正则化
% 计算代价函数和导数
J= -1 * sum( y .* log( sigmoid(X*theta) ) + (1 - y ) .* log( (1 - sigmoid(X*theta)) ) ) / m + lambda/(2*m) * theta_1' * theta_1 ;
grad = ( X' * (sigmoid(X*theta) - y ) )/ m + lambda/m * theta_1 ;
% 最优化求解
% Initialize fitting parameters
initial_theta = zeros(size(X, 2), 1);
% Set regularization parameter lambda to 1 (you should vary this)
lambda = 1;
% Set Options
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Optimize
[theta, J, exit_flag] = ...
fminunc(@(theta)(costFunctionReg(theta, X, y, lambda)), initial_theta, options);
映射特征->计算代价函数和导数->fminunc优化求解(多项式拟合)->画出决策边界:矢量化表示为:就是决策边界,公式应该是。
% Here is the grid range
u = linspace(-1, 1.5, 50);
v = linspace(-1, 1.5, 50);
z = zeros(length(u), length(v));
% Evaluate z = theta*x over the grid
for i = 1:length(u)
for j = 1:length(v)
z(i,j) = mapFeature(u(i), v(j))*theta;
end
end
z = z'; % important to transpose z before calling contour
% Plot z = 0
% Notice you need to specify the range [0, 0]
contour(u, v, z, [0, 0], 'LineWidth', 2)
% 使用最优的多项式模型对训练集进行预测
k = find(sigmoid( X * theta) >= 0.5 );
p(k)= 1;
mean(double(p == y)) * 100
预测结果为:Train Accuracy: 83.050847
3、过拟合
尝试不同的正则化参数,了解正则化如何防止过度拟合。 注意随着λ的变化决策边界的变化。
使用小的λ,您应该确定分类器可以使几乎每个训练样本正确无误,但会画出非常复杂的边界,从而过度拟合数据(图5)。 这不是一个好的决策边界:例如,它预测x =(-0.25,1.5)处的点被接受(y = 1),这对于训练集来说似乎是不正确的决策。
用一个大的λ,您应该看到一个曲线图,该图显示了一个更简单的决策边界,该边界仍将正负之间很好地分开。但是,如果将λ设置为一个太大的值,您将无法获得好的拟合,并且决策边界也不会很好的follow 数据,因此数据欠拟合(图6)。
过拟合 欠拟合
4、最优化算法
除了梯度下降可以使得代价函数最小之外,还有更快速和优秀的算法,不需要选择学习率 α。如
- 共轭梯度 Conjugate Gradient
- 局部优化法 Broyden Fletcher Goldfarb Shann, BFGS
- 优先内存局部优化法 LBFGS
这些都在matlab自带的函数中,使用时需要提供代价函数和每个参数求导。使用方式如下:
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);