逻辑回归的应用对象
首先,最重要的是明白一个算法的应用对象。逻辑回归主要应用于分类问题。现实中分类问题有很多,简单的二分类:邮件中的垃圾邮件和非垃圾邮件;人中的男人和女人。多分类:自动驾驶中人、车、障碍物的识别;各种阻值不同的电阻识别。
对于特征较少分类问题,逻辑回归是一种有效的算法。当特征成百上千时,请选择神经网络。
逻辑回归的假设函数、目标函数、求解
假设函数
逻辑回归的假设函数定义为:
h
θ
(
x
)
=
1
1
+
e
θ
T
x
h_\theta(\boldsymbol x)=\frac{1}{1+e^{\boldsymbol\theta^T\boldsymbol x}}
hθ(x)=1+eθTx1
上式中
θ
\boldsymbol\theta
θ和
x
\boldsymbol x
x均为列向量。假设函数不同是逻辑回归与线性回归的第一个不同点。
上式的概率解释:
h
θ
(
y
=
1
∣
x
;
θ
)
h_\theta(y=1|\boldsymbol x;\theta)
hθ(y=1∣x;θ)在参数
θ
\theta
θ确定的情况下,给出
x
x
x时,
y
=
1
y=1
y=1的概率。
上式的直观解释:假设已知一份邮件的特征为
x
=
[
1
,
垃
圾
字
符
数
量
]
x=[1,垃圾字符数量]
x=[1,垃圾字符数量],计算得到
h
θ
(
x
)
=
0.7
h_\theta(\boldsymbol x)=0.7
hθ(x)=0.7,则说明该邮件为垃圾邮件的概率为
70
%
70\%
70% 。
目标函数
针对单个样本的目标函数为:
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
{
−
l
o
g
(
h
θ
(
x
)
)
,
y
=
1
,
−
l
o
g
(
1
−
h
θ
(
x
)
,
y
=
0
Cost(h_\theta(\boldsymbol x),y)=\begin{cases}-log(h_\theta(\boldsymbol x)), & y=1,\\ -log(1-h_\theta(\boldsymbol x), & y=0 \end{cases}
Cost(hθ(x),y)={−log(hθ(x)),−log(1−hθ(x),y=1,y=0
由于
y
=
0
,
1
y=0,1
y=0,1故可将上式改写为
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
(
i
)
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
)
)
Cost(h_\theta(\boldsymbol x),y)=-y^{(i)}log(h_\theta(\boldsymbol x))-(1-y^{(i)})log(1-h_\theta(\boldsymbol x))
Cost(hθ(x),y)=−y(i)log(hθ(x))−(1−y(i))log(1−hθ(x))
所有样本的目标函数为
J
(
θ
)
=
∑
i
=
1
m
y
(
i
)
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
)
)
J(\theta)=\sum^{m}_{i=1}y^{(i)}log(h_\theta(\boldsymbol x))+(1-y^{(i)})log(1-h_\theta(\boldsymbol x))
J(θ)=i=1∑my(i)log(hθ(x))+(1−y(i))log(1−hθ(x))
目标函数不同式逻辑回归和线性回归的第二个不同点。
为什么不选择和线性回归相同的目标函数?这是因为,由于逻辑回归的假设函数为非线性,选择线性回归的目标函数会出现太多的局部最优值,即目标函数非凸。凸函数最重要的性质就是其局部最小值为全局最小值。
求解
利用梯度下降法可以得到:
θ
j
:
=
θ
j
−
α
(
∑
i
=
1
m
(
h
(
x
j
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
)
\theta_j := \theta_j-\alpha(\sum_{i=1}^m(h(x^{(i)}_j)-y^{(i)})x^{(i)}_j)
θj:=θj−α(i=1∑m(h(xj(i))−y(i))xj(i))
和线性回归的解相同,奇妙的数学。当然由于
h
θ
(
x
)
h_\theta(\boldsymbol x)
hθ(x)不同,和线性回归本质上还是不同。另外,需要强调,每个
θ
\theta
θ应同步更新。
例子
%% 逻辑回归二元分类问题
% 作者:sddfsAv
% 日期:20190409
% 软件:Octave5.1.0
% 简介:吴恩达机器学习课程逻辑回归应用举例,数据集采用x+randn()自动生成
clear
clc
%% 导入原始数据
load('data1.mat');
load('data2.mat');
scatter(class1(:,1),class1(:,2),70,'MarkerEdgeColor',[.8 .6 .1],...
'MarkerFaceColor',[.8 .6 .1],...
'LineWidth',1.5); % 绘制第一类的散点图
hold on;
scatter(class2(:,1),class2(:,2),70,'MarkerEdgeColor',[.1 .6 .8],...
'MarkerFaceColor',[.1 .6 .8],...
'LineWidth',1.5); % 绘制第二类的散点图
title("Two Different class"); % 图表标题
xlabel("x1"); % x轴标题
ylabel("x2"); % y轴标题
legend({'class1','class2'},'location', 'southeast');
hold on;
%% 逻辑回归分类参数求解
alpha=0.005; % 梯度下降法的步长
m=length(class1(:,1))+length(class2(:,1)); % 样本数量
Samples=[ones(m,1) [class1;class2]]';
theta=zeros(3,1); % 初始化参数
A=[repmat([1 0],1,m/2) repmat([0 1],1,m/2)];
B=[];
for i=1:m
B=[B;...
[log(SigmodFunction(Samples(:,i),theta));...
log(1-SigmodFunction(Samples(:,i),theta))]];
endfor
J(1)=-1/m*A*B;
for j=1:5000
theta=theta-[alpha*(SigmodFunction(Samples,theta)-[ones(1,m/2) zeros(1,m/2)])*Samples']';
B=[];
for i=1:m
B=[B;...
[log(SigmodFunction(Samples(:,i),theta));...
log(1-SigmodFunction(Samples(:,i),theta))]];
endfor
J(j+1)=-1/m*A*B;
endfor
x1=-1:0.1:6;
x2=-(theta(1)+theta(2)*x1)/theta(3);
plot(x1,x2);
figure
plot(1:5001,J);
title('J(θ)');
xlabel('iteration numbers');
ylabel('J(θ)');
function h=SigmodFunction(x,theta)
h=1./(1+exp(-theta'*x));
endfunction
分类结果
Octave直接在figure菜单点“保存”居然报错o(╯□╰)o。好吧,老老实实用print函数。
第一张图中的线为决策边界。