机器学习(五):线性模型
更多内容关注公众号:数学的旋律

tb店铺搜:FUN STORE玩物社,专业买手挑选送礼好物
引言
线性模型(linear modal)试图学得一个通过属性的线性组合来进行预测的函数。本文介绍两种经典的线性模型,分别是回归任务中的线性回归(linear regression)与二分类任务中的逻辑回归(logistic regression)。
如图1,在二维空间中有一些样本点,我们用一条直线对这些点进行拟合,该直线称为最佳拟合直线。线性回归就是根据训练集,寻找对训练样本的最佳拟合直线;逻辑回归则是利用“单位跳跃函数”将线性模型产生的预测值转换为0/1值,从而实现二分类任务。

一、数学预备知识
1.方向导数
如果函数
f
(
x
,
y
)
f(x,y)
f(x,y)在点
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)可微分,那么函数在该点沿任一方向
l
l
l的方向导数存在,且有
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
f
x
(
x
0
,
y
0
)
cos
α
+
f
y
(
x
0
,
y
0
)
cos
β
\left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=f_x(x_0,y_0)\cosα+f_y(x_0,y_0)\cosβ
∂l∂f
(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ其中
cos
α
\cosα
cosα,
cos
β
\cosβ
cosβ是方向
l
l
l的方向余弦。
(α为
l
l
l与x轴正向夹角,β为
l
l
l与y轴正向夹角。方向导数反映的是函数沿任一指定方向的变化率问题)
例1
求函数
z
=
x
e
2
y
z=xe^{2y}
z=xe2y在点
P
(
1
,
0
)
P(1,0)
P(1,0)处沿从点
P
(
1
,
0
)
P(1,0)
P(1,0)到点
Q
(
2
,
−
1
)
Q(2,-1)
Q(2,−1)的方向的方向导数
解:
这里方向
l
l
l即向量
P
Q
⃗
=
(
1
,
−
1
)
\vec {PQ}=(1,-1)
PQ=(1,−1)的方向,与
l
l
l同向的单位向量为
e
l
=
(
1
2
,
−
1
2
)
e_l=({1\over\sqrt{2}},-{1\over\sqrt{2}})
el=(21,−21)。
因为函数可微分,且
Z
x
(
1
,
0
)
=
e
2
y
=
1
Z_x(1,0)=e^{2y}=1
Zx(1,0)=e2y=1
Z
y
(
1
,
0
)
=
2
x
e
2
y
=
2
Z_y(1,0)=2xe^{2y}=2
Zy(1,0)=2xe2y=2故所求方向导数为
∂
Z
∂
l
∣
(
1
,
0
)
=
1
×
1
2
+
2
×
(
−
1
2
)
=
−
2
2
\left.\frac{∂Z}{∂l} \right| _{(1,0)}=1\times{1\over\sqrt{2}}+2\times(-{1\over\sqrt{2}})=-{\sqrt{2}\over2}
∂l∂Z
(1,0)=1×21+2×(−21)=−22
2.梯度
与方向导数有关联的一个概念是函数的梯度。在二元函数的情形,设函数
f
(
x
,
y
)
f(x,y)
f(x,y)在平面区域D内具有一阶连续偏导数,则对于每一点
P
0
(
x
0
,
y
0
)
∈
D
P_0(x_0,y_0)∈D
P0(x0,y0)∈D,都可定出一个向量
f
x
(
x
0
,
y
0
)
i
+
f
y
(
x
0
,
y
0
)
j
f_x(x_0,y_0){\bf i}+f_y(x_0,y_0)\bf j
fx(x0,y0)i+fy(x0,y0)j这向量称为函数
f
(
x
,
y
)
f(x,y)
f(x,y)在点
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)的梯度,记作
g
r
a
d
f
(
x
0
,
y
0
)
{\bf grad}\ f(x_0,y_0)
grad f(x0,y0)或
∇
f
(
x
0
,
y
0
)
∇f(x_0,y_0)
∇f(x0,y0),即
g
r
a
d
f
(
x
0
,
y
0
)
=
∇
f
(
x
0
,
y
0
)
=
f
x
(
x
0
,
y
0
)
i
+
f
y
(
x
0
,
y
0
)
j
{\bf grad}\ f(x_0,y_0)=∇f(x_0,y_0)=f_x(x_0,y_0){\bf i}+f_y(x_0,y_0)\bf j
grad f(x0,y0)=∇f(x0,y0)=fx(x0,y0)i+fy(x0,y0)j其中
∇
=
∂
∂
x
i
+
∂
∂
y
j
∇={∂\over{∂x}}{\bf i}+{∂\over{∂y}}{\bf j}
∇=∂x∂i+∂y∂j称为(二维的)向量微分算子或Nabla算子,
∇
f
=
∂
f
∂
x
i
+
∂
f
∂
y
j
∇f={{∂f}\over{∂x}}{\bf i}+{{∂f}\over{∂y}}{\bf j}
∇f=∂x∂fi+∂y∂fj。
如果函数
f
(
x
,
y
)
f(x,y)
f(x,y)在点
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)可微分,
e
l
=
(
cos
α
,
cos
β
)
e_l=(\cosα,\cosβ)
el=(cosα,cosβ)是与方向
l
l
l同向的单位向量,则
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
f
x
(
x
0
,
y
0
)
cos
α
+
f
y
(
x
0
,
y
0
)
cos
β
=
g
r
a
d
f
(
x
0
,
y
0
)
⋅
e
l
=
∣
g
r
a
d
f
(
x
0
,
y
0
)
∣
cos
θ
\left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=f_x(x_0,y_0)\cosα+f_y(x_0,y_0)\cosβ={\bf grad}\ f(x_0,y_0)\cdot e_l=|{\bf grad}\ f(x_0,y_0)|\cosθ
∂l∂f
(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ=grad f(x0,y0)⋅el=∣grad f(x0,y0)∣cosθ其中
θ
=
<
g
r
a
d
f
(
x
0
,
y
0
)
,
e
l
>
θ=<{\bf grad}\ f(x_0,y_0),e_l>
θ=<grad f(x0,y0),el>。
这一关系式表明了函数在一点的梯度与函数在这点的方向导数间的关系。特别的:
①
θ
=
0
θ=0
θ=0,即方向
e
l
e_l
el与梯度
g
r
a
d
f
(
x
0
,
y
0
)
{\bf grad}\ f(x_0,y_0)
grad f(x0,y0)的方向相同时,函数
f
(
x
,
y
)
f(x,y)
f(x,y)增加最快。此时,函数在这个方向的方向导数达到最大值,这个最大值就是梯度
g
r
a
d
f
(
x
0
,
y
0
)
{\bf grad}\ f(x_0,y_0)
grad f(x0,y0)的模,即
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
∣
g
r
a
d
f
(
x
0
,
y
0
)
∣
\left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=|{\bf grad}\ f(x_0,y_0)|
∂l∂f
(x0,y0)=∣grad f(x0,y0)∣②
θ
=
π
θ=π
θ=π,即方向
e
l
e_l
el与梯度
g
r
a
d
f
(
x
0
,
y
0
)
{\bf grad}\ f(x_0,y_0)
grad f(x0,y0)的方向相反时,函数f
(
x
,
y
)
(x,y)
(x,y)减少最快,函数在这个方向的方向导数达到最小值,即
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
−
∣
g
r
a
d
f
(
x
0
,
y
0
)
∣
\left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=-|{\bf grad}\ f(x_0,y_0)|
∂l∂f
(x0,y0)=−∣grad f(x0,y0)∣③
θ
=
π
2
θ={π\over 2}
θ=2π,即方向
e
l
e_l
el与梯度
g
r
a
d
f
(
x
0
,
y
0
)
{\bf grad}\ f(x_0,y_0)
grad f(x0,y0)的方向正交时,函数的变化率为零,即
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
∣
g
r
a
d
f
(
x
0
,
y
0
)
∣
cos
θ
=
0
\left.\frac{∂f}{∂l} \right| _{(x_0,y_0)}=|{\bf grad}\ f(x_0,y_0)|\cosθ=0
∂l∂f
(x0,y0)=∣grad f(x0,y0)∣cosθ=0例2
设
f
(
x
,
y
)
=
1
2
(
x
2
+
y
2
)
f(x,y)={1\over 2}(x^2+y^2)
f(x,y)=21(x2+y2),
P
0
(
1
,
1
)
P_0(1,1)
P0(1,1),求
①
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处增加最快的方向以及
f
(
x
,
y
)
f(x,y)
f(x,y)沿这个方向的方向导数;
②
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处减少最快的方向以及
f
(
x
,
y
)
f(x,y)
f(x,y)沿这个方向的方向导数;
③
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处的变化率为零的方向;
解:
①
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处沿
∇
f
(
1
,
1
)
∇f(1,1)
∇f(1,1)的方向增加最快
∇
f
(
1
,
1
)
=
(
x
i
+
y
j
)
∣
(
1
,
1
)
=
i
+
j
∇f(1,1)=(x{\bf i}+y{\bf j})|_{(1,1)}={\bf i}+{\bf j}
∇f(1,1)=(xi+yj)∣(1,1)=i+j故所求方向可取为
n
=
∇
f
(
1
,
1
)
∣
∇
f
(
1
,
1
)
∣
=
1
2
i
+
1
2
j
n={{∇f(1,1)}\over{|∇f(1,1)|}}={1\over{\sqrt 2}}{\bf i}+{1\over{\sqrt 2}}{\bf j}
n=∣∇f(1,1)∣∇f(1,1)=21i+21j方向导数为
∂
f
∂
n
∣
(
1
,
1
)
=
∣
∇
f
(
1
,
1
)
∣
=
2
\left.\frac{∂f}{∂n} \right| _{(1,1)}=|∇f(1,1)|=\sqrt 2
∂n∂f
(1,1)=∣∇f(1,1)∣=2②
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处沿
−
∇
f
(
1
,
1
)
-∇f(1,1)
−∇f(1,1)的方向减少最快,这个方向可取为
n
1
=
−
n
=
−
1
2
i
−
1
2
j
n_1=-n=-{1\over{\sqrt 2}}{\bf i}-{1\over{\sqrt 2}}{\bf j}
n1=−n=−21i−21j方向导数为
∂
f
∂
n
1
∣
(
1
,
1
)
=
−
∣
∇
f
(
1
,
1
)
∣
=
−
2
\left.\frac{∂f}{∂n_1} \right| _{(1,1)}=-|∇f(1,1)|=-\sqrt 2
∂n1∂f
(1,1)=−∣∇f(1,1)∣=−2③
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
P_0
P0处沿垂直于
∇
f
(
1
,
1
)
∇f(1,1)
∇f(1,1)的方向变化率为零,这个方向是
n
2
=
−
1
2
i
+
1
2
j
n_2=-{1\over{\sqrt 2}}{\bf i}+{1\over{\sqrt 2}}{\bf j}
n2=−21i+21j或
n
3
=
1
2
i
−
1
2
j
n_3={1\over{\sqrt 2}}{\bf i}-{1\over{\sqrt 2}}{\bf j}
n3=21i−21j
3.带佩亚诺余项的泰勒公式
若 f ( x ) f(x) f(x)在 x = a x=a x=a有 n n n阶微商,即 f ( n ) ( a ) f^{(n)}(a) f(n)(a)存在,则当 x → a x\rightarrow a x→a时有 f ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + ⋯ + f ( n ) ( a ) n ! ( x − a ) n + o ( ( x − a ) n ) f(x)=f(a)+f'(a)(x-a)+{{f''(a)}\over{2!}}(x-a)^2+\cdots+{{f^{(n)}(a)}\over{n!}}(x-a)^n+\rm o((x-a)^n) f(x)=f(a)+f′(a)(x−a)+2!f′′(a)(x−a)2+⋯+n!f(n)(a)(x−a)n+o((x−a)n)其中多项式 f ( a ) + f ′ ( a ) ( x − a ) + ⋯ + f ( n ) ( a ) n ! ( x − a ) n f(a)+f'(a)(x-a)+\cdots+{{f^{(n)}(a)}\over{n!}}(x-a)^n f(a)+f′(a)(x−a)+⋯+n!f(n)(a)(x−a)n称为 f ( x ) f(x) f(x)在 a a a点的 n n n阶泰勒多项式。
4.二元函数的泰勒公式
设
f
(
x
,
y
)
f(x,y)
f(x,y)在
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)的某领域
O
(
P
0
)
\rm O(P_0)
O(P0)内有直到
n
+
1
n+1
n+1阶连续偏导数,则对
O
(
P
0
)
\rm O(P_0)
O(P0)内任一点
(
x
0
+
Δ
x
,
y
0
+
Δ
y
)
(x_0+Δx ,y_0+Δy)
(x0+Δx,y0+Δy),存在
θ
∈
(
0
,
1
)
θ∈(0,1)
θ∈(0,1),使得
f
(
x
0
+
Δ
x
,
y
0
+
Δ
y
)
=
∑
k
=
0
n
1
k
!
(
∂
∂
x
Δ
x
+
∂
∂
y
Δ
y
)
k
f
(
x
0
,
y
0
)
+
R
n
f(x_0+Δx ,y_0+Δy)=\sum_{k=0}^n{1\over{k!}}\left(\frac{∂}{∂x}Δx+\frac{∂}{∂y}Δy\right)^kf(x_0,y_0)+R_n
f(x0+Δx,y0+Δy)=k=0∑nk!1(∂x∂Δx+∂y∂Δy)kf(x0,y0)+Rn其中
R
n
=
1
(
n
+
1
)
!
(
∂
∂
x
Δ
x
+
∂
∂
y
Δ
y
)
n
+
1
f
(
x
0
+
θ
Δ
x
,
y
0
+
θ
Δ
y
)
R_n={1\over{(n+1)!}}\left(\frac{∂}{∂x}Δx+\frac{∂}{∂y}Δy\right)^{n+1}f(x_0+θΔx ,y_0+θΔy)
Rn=(n+1)!1(∂x∂Δx+∂y∂Δy)n+1f(x0+θΔx,y0+θΔy)当
n
=
1
n=1
n=1,忽略余项
R
n
R_n
Rn,即得函数的一阶泰勒展开式
f
(
x
0
+
Δ
x
,
y
0
+
Δ
y
)
≈
f
(
x
0
,
y
0
)
+
f
′
x
(
x
0
,
y
0
)
Δ
x
+
f
′
y
(
x
0
,
y
0
)
Δ
y
f(x_0+Δx ,y_0+Δy)≈f(x_0,y_0)+{f'}_x(x_0,y_0)Δx+{f'}_y(x_0,y_0)Δy
f(x0+Δx,y0+Δy)≈f(x0,y0)+f′x(x0,y0)Δx+f′y(x0,y0)Δy利用泰勒公式,可以用
n
n
n阶多项式逼近函数
f
(
x
,
y
)
f(x,y)
f(x,y),
n
n
n越大则误差越小,近似程度越好。
二、线性回归
1.最小二乘法
给定训练集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
D={(x1,y1),(x2,y2),⋯,(xN,yN)},其中
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
,
x
i
(
n
)
)
T
x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^T
xi=(xi(1),xi(2),⋯,xi(n))T,
x
i
(
j
)
x_i^{(j)}
xi(j)是第
i
i
i个实例的第
j
j
j个特征。线性回归试图学得
f
(
x
i
)
=
w
T
x
i
+
b
,使得
f
(
x
i
)
≈
y
i
f(x_i)=w^Tx_i+b,使得f(x_i)≈y_i
f(xi)=wTxi+b,使得f(xi)≈yi其中
w
=
(
w
1
,
w
2
,
.
.
.
,
w
n
)
T
w=(w_1,w_2,...,w_n)^T
w=(w1,w2,...,wn)T。
如何确定
w
w
w和
b
b
b呢?一个常用的方法是极小化其平方损失函数,即使均方误差最小化,得
(
w
∗
,
b
∗
)
=
a
r
g
min
(
w
,
b
)
∑
i
=
1
N
(
f
(
x
i
)
−
y
i
)
2
=
a
r
g
min
(
w
,
b
)
∑
i
=
1
N
(
y
i
−
w
T
x
i
−
b
)
2
(w^*,b^*)=arg\min_{(w,b)}\sum_{i=1}^N(f(x_i)-y_i)^2=arg\min_{(w,b)}\sum_{i=1}^N(y_i-w^Tx_i-b)^2
(w∗,b∗)=arg(w,b)mini=1∑N(f(xi)−yi)2=arg(w,b)mini=1∑N(yi−wTxi−b)2 基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。均方误差有非常好的几何意义,它对应了欧几里得距离,在线性回归中,最小二乘法就是试图找到一条直线,使得所有样本到直线上的欧几里得距离之和最小。
2.求解w和b
为了讨论方便,我们把
w
w
w和
b
b
b吸收入向量形式
w
^
=
(
w
T
;
b
)
T
\hat w=(w^T;b)^T
w^=(wT;b)T。把训练集
D
D
D表示为一个
N
×
(
n
+
1
)
N\times (n+1)
N×(n+1)大小的矩阵
X
X
X,其中每行对应于一个实例
x
i
x_i
xi,该行前
n
n
n个元素对应于
x
i
x_i
xi的
n
n
n个属性,最后一个元素恒置为1。即

再把类别也写成向量形式
y
=
(
y
1
,
y
2
,
⋯
,
y
N
)
T
y=(y_1,y_2,\cdots,y_N)^T
y=(y1,y2,⋯,yN)T,则有
w
^
∗
=
a
r
g
min
w
^
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
{\hat w}^*=arg\min_{\hat w}(y-X\hat w)^T(y-X\hat w)
w^∗=argw^min(y−Xw^)T(y−Xw^)令
E
=
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
E=(y-X\hat w)^T(y-X\hat w)
E=(y−Xw^)T(y−Xw^),对
w
^
\hat w
w^求导得到
E
w
^
=
2
X
T
(
X
w
^
−
y
)
E_{\hat w}=2X^T(X{\hat w}-y)
Ew^=2XT(Xw^−y)令上式为零可求得
w
^
\hat w
w^的最优解。当
X
T
X
X^TX
XTX为满秩矩阵时,可解得
w
^
=
(
X
T
X
)
−
1
X
T
y
(
1
)
\hat w=(X^TX)^{-1}X^Ty\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)
w^=(XTX)−1XTy (1)从而求解出
w
w
w和
b
b
b,得到线性回归模型:
y
=
w
T
x
+
b
y=w^Tx+b
y=wTx+b
3.岭回归(ridge regression)
然而,现实任务中 X T X X^TX XTX往往不是满秩矩阵,无法计算 ( X T X ) − 1 (X^TX)^{-1} (XTX)−1。为了解决这个问题,统计学家引入岭回归。简单说来,岭回归就是在矩阵 X T X X^TX XTX上加入一个 λ I λI λI,使得能对 X T X + λ I X^TX+λI XTX+λI求逆。其中 I I I是 N × N N\times N N×N的单位矩阵。则 w ^ = ( X T X + λ I ) − 1 X T y \hat w=(X^TX+λI)^{-1}X^Ty w^=(XTX+λI)−1XTy 这里通过引入 λ λ λ来限制所有 w w w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减(shrinkage)。可以通过交叉验证法,选取不同的 λ λ λ进行测试,最终得到一个使预测误差最小化的λ。
4.代码实现(python)
以下代码来自Peter Harrington《Machine Learing in Action》。
代码如下(保存为regression.py):
# -- coding: utf-8 --
from numpy import *
def loadDataSet(fileName):
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([float(lineArr[0]), 1.0]) # dataMat为吸收后的X,即将特征值最后一个元素恒置为1
labelMat.append(float(lineArr[1])) # labelMat为对应的标记类别
return dataMat,labelMat
def standRegres(xArr,yArr):
# xArr为特征值,yArr为对应的标记类别,该函数用于计算w和b
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat # 计算xTx
if linalg.det(xTx) == 0.0:
print "This matrix is singular, cannot do inverse"
return
ws = xTx.I * (xMat.T*yMat) # 若xTx不为零,则根据式(1)计算w^
return ws
数据集格式如下(保存为ex0.txt):
0.067732 3.176513
0.427810 3.816464
0.995731 4.550095
0.738336 4.256571
0.981083 4.560815
0.526171 3.929515
运行命令如下:

最后求出的
w
s
ws
ws即
w
^
\hat w
w^。
三、逻辑回归
逻辑回归是一种分类模型,本文主要介绍二分类的逻辑回归。
1.Sigmoid函数
给定训练集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
D={(x1,y1),(x2,y2),⋯,(xN,yN)},其中
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
,
x
i
(
n
)
)
T
x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^T
xi=(xi(1),xi(2),⋯,xi(n))T,
x
i
(
j
)
x_i^{(j)}
xi(j)是第
i
i
i个实例的第
j
j
j个特征,
y
i
∈
0
,
1
y_i∈{0,1}
yi∈0,1为实例的类别。若用线性回归模型
y
=
w
T
x
+
b
y=w^Tx+b
y=wTx+b对该训练集进行分类,分类图形如图2线A(此处设
x
i
=
(
x
i
(
1
)
)
T
x_i=(x_i^{(1)})^T
xi=(xi(1))T)所示:

从上图看出,线性回归模型产生的预测值
z
=
w
T
x
+
b
z=w^Tx+b
z=wTx+b是实值,于是,我们需要将实值
z
z
z转换为0/1值,这里我们引入Sigmoid函数,其数学形式是
g
(
z
)
=
1
1
+
e
−
z
g(z)={1\over{1+e^{-z}}}
g(z)=1+e−z1 图3给出了Sigmoid函数的坐标图。当
z
z
z为0时,Sigmoid函数值为0.5,随着
z
z
z的增大,对应的Sigmoid值将逼近于1;而随着
z
z
z的减少,Sigmoid值将逼近于0。

我们将z=wTx+b代入Sigmoid函数,从而将z值转化为一个接近0或1的数,得到
y
=
1
1
+
e
−
(
w
T
x
+
b
)
y={1\over{1+e^{-(w^Tx+b)}}}
y=1+e−(wTx+b)1
2.模型
逻辑回归模型所做的假设是,将(1)中 y y y视为类后验估计 P ( Y = 1 ∣ x ) P(Y=1|x) P(Y=1∣x),得到 P ( Y = 1 ∣ x ) = 1 1 + e − ( w T x + b ) = e w T x + b 1 + e w T x + b P(Y=1|x)={1\over{1+e^{-(w^Tx+b)}}}={e^{w^Tx+b}\over{1+e^{w^Tx+b}}} P(Y=1∣x)=1+e−(wTx+b)1=1+ewTx+bewTx+b 通过 P ( Y = 0 ∣ x ) = 1 − P ( Y = 1 ∣ x ) P(Y=0|x)=1-P(Y=1|x) P(Y=0∣x)=1−P(Y=1∣x)求得 P ( Y = 0 ∣ x ) = 1 1 + e w T x + b P(Y=0|x)={1\over{1+e^{w^Tx+b}}} P(Y=0∣x)=1+ewTx+b1 对于给定的实例 x x x,可以求得 P ( Y = 1 ∣ x ) P(Y=1|x) P(Y=1∣x)和 P ( Y = 0 ∣ x ) P(Y=0|x) P(Y=0∣x),比较两个条件概率值的大小,将实例 x x x分到概率大的那一类,若概率值相等则可任意判别。
3.损失函数
这里使用对数损失函数
L
(
Y
,
P
(
Y
∣
X
)
)
=
−
l
o
g
P
(
Y
∣
X
)
L(Y,P(Y|X)) = -log P(Y|X)
L(Y,P(Y∣X))=−logP(Y∣X)。
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)的取值范围为[0,1],
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)的值越接近1,则损失函数值越小。
为了讨论方便,我们把w和b吸收入向量形式
w
^
=
(
w
T
;
b
)
T
\hat w=(w^T;b)^T
w^=(wT;b)T,令
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
,
x
i
(
n
)
,
1
)
T
x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)},1)^T
xi=(xi(1),xi(2),⋯,xi(n),1)T,则
w
T
x
+
b
w^Tx+b
wTx+b可简写为
w
^
x
\hat wx
w^x。设
P
(
Y
=
1
∣
x
)
=
π
(
x
)
P(Y=1|x)=π(x)
P(Y=1∣x)=π(x),
P
(
Y
=
0
∣
x
)
=
1
−
π
(
x
)
P(Y=0|x)=1-π(x)
P(Y=0∣x)=1−π(x),则最终逻辑回归模型的损失函数为
L
(
w
^
)
=
∑
i
=
1
N
[
−
y
i
log
π
(
x
i
)
−
(
1
−
y
i
)
log
(
1
−
π
(
x
i
)
)
]
L(\hat w)=\sum_{i=1}^N[−y_i\logπ(x_i) −(1−y_i)\log(1−π(x_i))]
L(w^)=i=1∑N[−yilogπ(xi)−(1−yi)log(1−π(xi))]
=
−
∑
i
=
1
N
[
y
i
log
π
(
x
i
)
−
y
i
log
(
1
−
π
(
x
i
)
)
+
log
(
1
−
π
(
x
i
)
)
]
(
2
)
=-\sum_{i=1}^N[y_i\logπ(x_i)−y_i\log(1−π(x_i))+\log(1−π(x_i))] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2)
=−i=1∑N[yilogπ(xi)−yilog(1−π(xi))+log(1−π(xi))] (2)
=
−
∑
i
=
1
N
[
y
i
log
π
(
x
i
)
1
−
π
(
x
i
)
+
log
(
1
−
π
(
x
i
)
)
]
=
−
∑
i
=
1
N
[
y
i
(
w
^
T
x
i
)
−
l
o
g
(
1
+
e
w
^
T
x
i
)
]
=-\sum_{i=1}^N\left[y_i\log{π(x_i)\over{1-π(x_i)}}+\log(1−π(x_i))\right] =-\sum_{i=1}^N\left[y_i({\hat w}^Tx_i)-log(1+e^{{\hat w}^Tx_i})\right]
=−i=1∑N[yilog1−π(xi)π(xi)+log(1−π(xi))]=−i=1∑N[yi(w^Txi)−log(1+ew^Txi)] 对损失函数
L
(
w
^
)
L(\hat w)
L(w^)求极小值,从而可得
w
^
\hat w
w^。
最后求得的直线应该如图2线B,分类为0的样本点使得z<0,此时
P
(
Y
=
1
∣
x
)
<
P
(
Y
=
0
∣
x
)
P(Y=1|x)<P(Y=0|x)
P(Y=1∣x)<P(Y=0∣x);分类为1的样本点使得z>0,此时
P
(
Y
=
1
∣
x
)
>
P
(
Y
=
0
∣
x
)
P(Y=1|x)> P(Y=0|x)
P(Y=1∣x)>P(Y=0∣x)。
4.梯度下降法
假设
f
(
x
f(x
f(x)是
R
n
R_n
Rn上具有一阶连续偏导数的函数,要求解的无约束优化问题是
min
x
∈
R
n
f
(
x
)
\min_{x∈R_n}\ \ f(x)
x∈Rnmin f(x)
x
∗
x^*
x∗表示目标函数
f
(
x
)
f(x)
f(x)的极小点。
梯度下降算法是一种迭代算法,选取适当的初值
x
(
0
)
x^{(0)}
x(0),不断迭代,更新
x
x
x的值,进行目标函数的极小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新
x
x
x的值,从而达到减少函数值的目的。
由于
f
(
x
)
f(x)
f(x)具有一阶连续偏导数,若第
k
k
k次迭代值为
x
(
k
)
x^{(k)}
x(k),则可将
f
(
x
)
f(x)
f(x)在
x
(
k
)
x^{(k)}
x(k)附近进行一阶泰勒展开:
f
(
x
)
=
f
(
x
(
k
)
)
+
g
k
T
(
x
−
x
(
k
)
)
f(x)=f(x^{(k)})+{g_k}^T(x-x^{(k)})
f(x)=f(x(k))+gkT(x−x(k))这里,
g
k
=
g
(
x
(
k
)
)
=
∇
f
(
x
(
k
)
)
g_k=g(x^{(k)})= ∇f(x^{(k)})
gk=g(x(k))=∇f(x(k))为
f
(
x
)
f(x)
f(x)在
x
(
k
)
x^{(k)}
x(k)的梯度。
求出第k+1次迭代值x(k+1):
x
(
k
+
1
)
=
x
(
k
)
+
λ
k
p
k
x^{(k+1)}=x^{(k)}+λ_kp_k
x(k+1)=x(k)+λkpk其中,
p
k
p_k
pk是搜索方向,取负梯度方向
p
k
=
−
∇
f
(
x
(
k
)
)
p_k=-∇f(x^{(k)})
pk=−∇f(x(k)),
λ
k
λ_k
λk是步长,由一维搜索确定,即
λ
k
λ_k
λk使得
f
(
x
(
k
)
+
λ
k
p
k
)
=
min
λ
≥
0
f
(
x
(
k
)
+
λ
p
k
)
f(x^{(k)}+λ_kp_k)=\min_{λ≥0}\ f(x^{(k)}+λp_k)
f(x(k)+λkpk)=λ≥0min f(x(k)+λpk)算法1(梯度下降法)
输入:目标函数
f
(
x
)
f(x)
f(x),梯度函数
g
(
x
)
=
∇
f
(
x
)
g(x)= ∇f(x)
g(x)=∇f(x),计算精度
ε
ε
ε
输出:
f
(
x
)
f(x)
f(x)的极小点
x
∗
x^*
x∗
①取初始值
x
(
0
)
∈
R
n
x^{(0)}∈R^n
x(0)∈Rn,置
k
=
0
k=0
k=0
②计算
f
(
x
(
k
)
)
f(x^{(k)})
f(x(k))
③计算梯度
g
k
=
g
(
x
(
k
)
)
g_k=g(x^{(k)})
gk=g(x(k)),当
∣
∣
g
k
∣
∣
<
ε
||g_k||<ε
∣∣gk∣∣<ε,停止迭代,令
x
∗
=
x
(
k
)
x^*=x^{(k)}
x∗=x(k);否则,令
p
k
=
−
∇
f
(
x
(
k
)
)
p_k=-∇f(x^{(k)})
pk=−∇f(x(k)),求
λ
k
λk
λk,使
f
(
x
(
k
)
+
λ
k
p
k
)
=
min
λ
≥
0
f
(
x
(
k
)
+
λ
p
k
)
f(x^{(k)}+λ_kp_k)=\min_{λ≥0}\ f(x^{(k)}+λp_k)
f(x(k)+λkpk)=λ≥0min f(x(k)+λpk)④置
x
(
k
+
1
)
=
x
(
k
)
+
λ
k
p
k
x^{(k+1)}=x^{(k)}+λ_kp_k
x(k+1)=x(k)+λkpk,计算
f
(
x
(
k
+
1
)
)
f(x^{(k+1)})
f(x(k+1)),当
∣
∣
f
(
x
(
k
+
1
)
)
−
f
(
x
(
k
)
)
∣
∣
<
ε
||f(x(k+1))-f(x(k))||<ε
∣∣f(x(k+1))−f(x(k))∣∣<ε或
∣
∣
x
(
k
+
1
)
−
x
(
k
)
∣
∣
<
ε
||x(k+1)-x(k)||<ε
∣∣x(k+1)−x(k)∣∣<ε时,停止迭代,令
x
∗
=
x
(
k
+
1
)
x^*=x^{(k+1)}
x∗=x(k+1)
⑤否则,置
k
=
k
+
1
k=k+1
k=k+1,转③
5.代码实现(python)
以下代码来自Peter Harrington《Machine Learing in Action》。
我们需要求式(2)中
L
(
w
^
)
L(\hat w)
L(w^)的最小值。若令
f
(
w
^
)
=
−
L
(
w
^
)
f(\hat w)=-L(\hat w)
f(w^)=−L(w^),则问题可转换为求
f
(
w
^
)
f(\hat w)
f(w^)的最大值:
f
(
w
^
)
=
∑
i
=
1
N
[
y
i
(
w
^
T
x
i
)
−
l
o
g
(
1
+
e
w
^
T
x
i
)
]
f(\hat w)=\sum_{i=1}^N\left[y_i({\hat w}^Tx_i)-log(1+e^{{\hat w}^Tx_i})\right]
f(w^)=i=1∑N[yi(w^Txi)−log(1+ew^Txi)] 为了求上式的最大值,我们使用梯度上升算法。算法1(梯度下降法)中,由于与梯度相反方向下降最快,所以
p
k
=
−
∇
f
(
x
(
k
)
)
p_k=-∇f(x(k))
pk=−∇f(x(k));而在本例的梯度上升算法,令
p
k
=
∇
f
(
x
(
k
)
)
p_k=∇f(x(k))
pk=∇f(x(k)),即梯度方向上升最快。先求
∇
f
(
w
^
)
∇f(\hat w)
∇f(w^):
∇
f
(
w
^
)
=
∑
i
=
1
N
[
y
i
x
i
−
1
1
+
e
−
w
^
T
x
i
x
i
]
=
∑
i
=
1
N
x
i
[
y
i
−
1
1
+
e
−
w
^
T
x
i
]
(
3
)
∇f(\hat w)=\sum_{i=1}^N\left[y_ix_i-{1\over{1+e^{-{\hat w}^Tx_i}}}x_i\right]=\sum_{i=1}^Nx_i\left[y_i-{1\over{1+e^{-{\hat w}^Tx_i}}}\right]\ \ \ \ \ \ \ \ \ \ (3)
∇f(w^)=i=1∑N[yixi−1+e−w^Txi1xi]=i=1∑Nxi[yi−1+e−w^Txi1] (3) 在本代码中,预先设置好步长
λ
λ
λ的值和迭代次数,则
w
∗
=
λ
+
∇
f
(
w
^
)
w^*=λ+∇f(\hat w)
w∗=λ+∇f(w^),在循环迭代完成后输出训练好的回归系数。
代码如下(保存为logRegres.py):
# -- coding: utf-8 --
from numpy import *
def loadDataSet():
dataMat = []; labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([float(lineArr[0]), float(lineArr[1]), 1.0]) # dataMat为吸收后的X,即将特征值最后一个元素恒置为1
labelMat.append(int(lineArr[2])) # labelMat为对应的标记类别
return dataMat,labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
m,n = shape(dataMatrix)
alpha = 0.001 # 步长
maxCycles = 500 # 迭代次数
weights = ones((n,1)) # 将w的各个元素和b初始化为1
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights)
error = (labelMat - h)
# 根据式(3)可知dataMatrix.transpose()* error为梯度,则可得(新的weights)=(旧的weights)+步长*梯度
weights = weights + alpha * dataMatrix.transpose()* error
return weights
数据集如下(保存为testSet.txt):
-1.395634 4.662541 1
-1.322371 7.152853 0
0.423363 11.054677 0
0.406704 7.067335 1
0.667394 12.741452 0
-2.460150 6.866805 1

调用gradAscent函数求得的值即为
w
^
\hat w
w^。
以上全部内容参考书籍如下:
李航《统计学习方法》
周志华《机器学习》
Peter Harrington《Machine Learing in Action》
《高等数学第六版下册 同济大学》
《数学分析简明教程 第二版上册》
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)