逻辑回归
简介
什么是逻辑回归:逻辑回归虽然带有回归字样,但是逻辑回归常用于分类。逻辑回归可以进行多分类操作,但由逻辑回归算法本身性质决定其更常用于二分类。
回归和分类
回归(Regression):根据数据确定一条曲线。
分类(Classification):找出数据的决策边界
二分类
二分类就是对于给定数据集中的每组数据<xi,yi>,0<i<N,其中yi是数据xi的标签,且yi∈{0,1},其中0表示负类,1表示正类 。
sigmoid函数
函数模型为:g(z) = 1/(1 + e−z);
函数图像如下:
sigmoid函数在其定义域(−∞,+∞)上函数的取值在0-1之间,且在0.5处为中心对称(1−g(z) = g(−z))。
对于二分类问题,我们的取值只有0和1,因此我们可以利用sigmoid函数的性质,设置一个阈值k(0<k<1),当g(z)<k时,g(z)=0;当g(z)>k时,g(z)=1。
逻辑回归公式
- 首先逻辑回归模型为hθ(x)
hθ(x)为:hθ(x) = g(θTx) = 1/(1 + e−θT x)
给定一个输入特征向量x,我们有
(1) 对于给定的X=x,Y=1的概率有
P(Y = 1 | X = x;θ) = hθ(x) = 1/(1 + exp(−θT x))
(2) 对于给定的X=x,Y=0的概率有
P(Y = 1 | X = x;θ) = 1 - hθ(x) = 1/(1 + exp(θT x)) - 由 hθ(x)得出逻辑回归公式:
由 P(Y = 1 | X = x;θ) = hθ(x) 和 P(Y = 0 | X = x;θ) = 1−hθ(x)可得:
p(y | x;θ) = P(Y = y | X = x;θ) = (hθ(x))y(1−hθ(x))1−y , y ∈{0,1}。
逻辑回归内容
我们希望通过对训练数据进行一系列处理,得到一个逻辑回归公式,使其能对测试数据进行分类,在逻辑回归公式中未知参数为θ,即我们希望通过以下一系列处理得到θ。
-
在逻辑回归中,假设函数是
-
对于给定的训练数据{x(i)} i = 1,…,m,它们是独立的,因此定义似然函数J(θ):
-
为了便于计算,我们最大化了以下对数似然函数
-
注意,最大化(3)等同于最小化其负面。 然后,我们的问题变成了
-
对L(θ)进行求导,得到∇θL。
之后可通过梯度下降法优化或牛顿法来优化θ。 -
梯度下降优化θ
由梯度下降公式θj ← θj + α∇θL我们可以逐渐优化初始设置的θ。
直到连续迭代中的目标函数值之间的差异小于(或等于)某个阈值。
- 牛顿法优化θ
牛顿方法的更新规则是
其中H为
求解一下偏导得:
利用牛顿方法的更新规则逐步优化θ,直到和梯度下降法同样的停止条件。
逻辑回归实验
实验简介
数据集为一所高中的一个数据集,代表40名入读大学的学生和40名未被录取的学生。 每个(x(i),y(i))训练示例包含学生在两个标准化考试中的分数以及该学生是否被录取的标签。
实验任务是建立一个二元分类模型,根据学生在两门考试中的分数来估算大学入学机会。 在您的训练数据中,x阵列的第一列代表所有测试1分数,第二列代表所有测试2分数,y矢量使用“1”标记被录取的学生和“0”标记a 没被录取的学生。
实验一 梯度下降法解决逻辑回归问题
- 假设阈值 为10 -6。 需要多少次迭代才能实现收敛? 注意,梯度下降法具有非常慢的收敛速度并且可能需要很长时间才能达到最小值。
- 在达到收敛后,你得到了多少θ值?
- 在每次迭代中计算L(θ)并说明在梯度下降法中如何迭代地减小L(θ)。
- 收敛后,使用θ的值在分类问题中找到决策边界。 决策边界定义为
也就是
即绘制决策边界也就是绘制θTx = 0线. - 考试科目1得分为20分且考试科目2得分为80分的学生被录取的概率是多少?
实验代码
x = load('E:\machine_learning\experiment\exp2\data2\ex2x.dat');
y = load('E:\machine_learning\experiment\exp2\data2\ex2y.dat');
m = length(y);
x = [ones(m , 1), x];
%绘制数据
pos = find(y == 1);
neg = find(y == 0);
figure %open a new figure window
plot(x(pos, 2), x(pos, 3), '+');
hold on
plot(x(neg, 2), x(neg, 3), 'o');
xlabel('Exam 1 score'); ylabel('Exam 2 score');
%定义sigmoid函数
g = inline('1.0 ./ (1.0 + exp(-z))', 'z');
%初始化theta
theta = [0;0;0];
%似然函数
L = (1/m) .* sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
L
%梯度
G = (1/m) .* x' * (g(x*theta) - y);
%初始化alpha
alpha = 0.001;
%初始化L+
theta = theta - alpha.*G;
L_next = (1/m) * sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
%初始化迭代次数
num = 1;
while abs(L_next-L) > 0.0000001
L = L_next;
G = (1/m) .* x' * (g(x*theta) - y);
theta = theta - alpha.*G;
L_next = (1/m) .* sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
num = num+1;
end
%输出迭代次数和theta值
num
theta
%绘制决策边界
hold on;
x1 = 15:5:75;%考试1成绩主要范围内取值
x2 = -(theta(1)+theta(2)*x1)/theta(3);
plot(x1, x2, '-');
%预测x=[20, 80],并在控制台输出概率结果
pred = [1, 20, 80];
p_pred = g(pred*theta);
p_pred
实验结果
- 决策边界
- 预测概率
实验二 牛顿法解决逻辑回归问题
- 程序中实现牛顿方法,从θ = 0的初始值开始。记录迭代次数,计算每次迭代的L(θ)并绘制结果。牛顿方法通常在5-15次迭代中收敛。
- 通过牛顿方法迭代地显示L是如何减少的。
- 考试1分为20分且考试2分为80分的学生被录取的概率是多少?
实验代码
x = load('E:\machine_learning\experiment\exp2\data2\ex2x.dat');
y = load('E:\machine_learning\experiment\exp2\data2\ex2y.dat');
%处理数据x
m = length(y);
x = [ones(m , 1), x];
x
%定义sigmoid函数
g = inline('1.0 ./ (1.0 + exp(-z))', 'z');
%初始化theta
theta = [0;0;0];
%似然函数
L = (1/m) .* sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
%Hessian函数
H = (1/m) .* (x'*(g(x*theta).*(1-g(x*theta)).*x));
H
%求θL
G = (1/m) .* x' * (g(x*theta) - y);
%初始化L+
theta = theta - inv(H)*G;
L_next = (1/m) * sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
%初始化迭代次数
num = 1;
figure
xl = linspace(0, num, 10);
yl = linspace(L, L_next, 10);
plot(xl, yl, '-');
xlabel('Iterations');ylabel('L(theta)');
while abs(L_next-L) > 0.000001
L = L_next;
G = (1/m) .* x' * (g(x*theta) - y);
theta = theta - inv(H)*G;
L_next = (1/m) .* sum(-y.*log(g(x*theta)) - (1-y).*log(1-(g(x*theta))));
num = num+1;
hold on;
xl = linspace(num-1, num, 10);
yl = linspace(L, L_next, 10);
plot(xl, yl, '-');
end
%输出迭代次数和theta值
num
theta
pos = find(y == 1);
neg = find(y == 0);
figure%%open a new figure window
plot(x(pos, 2), x(pos, 3), '+');
hold on
plot(x(neg, 2), x(neg, 3), 'o');
xlabel('Exam 1 score'); ylabel('Exam 2 score');
hold on;
x1 = 15:5:75;%考试1成绩主要范围内取值
x2 = -(theta(1)+theta(2)*x1)/theta(3);
plot(x1, x2, '-');%绘制决策边界
%预测x=[20, 80]
pred = [1, 20, 80];
p_pred = g(pred*theta);
p_pred
实验结果
- 实验迭代次数以及θ值
- L(θ)的变化
- 决策边界
- 预测结果