自己简略的, 有参考黄海广前辈 !黄博士GitHub
第3周
六、逻辑回归(Logistic Regression)
6.1 分类问题
参考文档: 6 - 1 - Classification
分类问题中,目标变量 y y y 是离散值,逻辑回归 (Logistic Regression) 是目前最广泛的一种分类算法。
比如:判断电子邮件是否是垃圾邮件;判断金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性。
从二元分类问题开始讨论:
将因变量(dependent variable)可能属于的两个类称为负类(negative class)和正类(positive class),则因变量
y
∈
0
,
1
y\in { 0,1 \\}
y∈0,1 ,0 表示负类,1 表示正类。
如果用线性回归算法来解决分类问题, y y y 取值为 0 或者1,即使所有训练样本的标签 y y y 都等于 0 或 1,假设函数的输出值也可能远大于 1,或者远小于0。所以逻辑回归算法:输出值永远在0到 1 之间。
6.2 假说表示
参考视频: 6 - 2 - Hypothesis Representation
分类问题中,要用什么样的函数来表示我们的假设。分类器的输出值在0和1之间,对于分类问题,需要输出0或1,可以预测:
当 h θ ( x ) > = 0.5 {h_ \theta}\left( x \right)>=0.5 hθ(x)>=0.5时, y = 1 y=1 y=1;
当 h θ ( x ) < 0.5 {h_ \theta}\left( x \right)<0.5 hθ(x)<0.5时, y = 0 y=0 y=0 。
引入一个新模型:逻辑回归,该模型的输出变量范围始终在0和1之间。
逻辑回归模型的假设是:
h
θ
(
x
)
=
g
(
θ
T
X
)
h_\theta \left( x \right)=g\left(\theta^{T}X \right)
hθ(x)=g(θTX)
其中:
X
X
X 代表特征向量
g
g
g 代表逻辑函数(logistic function):一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
g
(
z
)
=
1
1
+
e
−
z
g\left( z \right)=\frac{1}{1+{{e}^{-z}}}
g(z)=1+e−z1。
python代码实现:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
函数图像为:
得到逻辑回归模型的假设:
对模型的理解: g ( z ) = 1 1 + e − z g\left( z \right)=\frac{1}{1+{{e}^{-z}}} g(z)=1+e−z1。
h θ ( x ) h_\theta \left( x \right) hθ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量= 1 的可能性(estimated probablity)即 h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_\theta \left( x \right)=P\left( y=1|x;\theta \right) hθ(x)=P(y=1∣x;θ)
例如,对于给定的 x x x,通过已经确定的参数计算得出 h θ ( x ) = 0.7 h_\theta \left( x \right)=0.7 hθ(x)=0.7,则表示有70%的几率 y y y为正类,相应地 y y y为负类的几率为1-0.7=0.3。
6.3 判定边界
参考视频: 6 - 3 - Decision Boundary
决策边界(decision boundary)的概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。
在逻辑回归中,我们预测:
当 h θ ( x ) > = 0.5 {h_\theta}\left( x \right)>=0.5 hθ(x)>=0.5时, y = 1 y=1 y=1。
当 h θ ( x ) < 0.5 {h_\theta}\left( x \right)<0.5 hθ(x)<0.5时, y = 0 y=0 y=0 。
根据上面绘制出的 S 形函数图像,我们知道当
z = 0 z=0 z=0 时 g ( z ) = 0.5 g(z)=0.5 g(z)=0.5
z > 0 z>0 z>0 时 g ( z ) > 0.5 g(z)>0.5 g(z)>0.5
z < 0 z<0 z<0 时 g ( z ) < 0.5 g(z)<0.5 g(z)<0.5
又 z = θ T x z={\theta^{T}}x z=θTx ,即:
θ T x > = 0 {\theta^{T}}x>=0 θTx>=0 时, y = 1 y=1 y=1
θ T x < 0 {\theta^{T}}x<0 θTx<0 时, y = 0 y=0 y=0
假设我们有一个模型:
参数
θ
\theta
θ 是向量[-3 1 1],当
−
3
+
x
1
+
x
2
≥
0
-3+{x_1}+{x_2} \geq 0
−3+x1+x2≥0,即
x
1
+
x
2
≥
3
{x_1}+{x_2} \geq 3
x1+x2≥3时,将预测
y
=
1
y=1
y=1。
我们可以绘制直线
x
1
+
x
2
=
3
{x_1}+{x_2} = 3
x1+x2=3,这条线便是模型的分界线,将预测为1的区域和预测为 0的区域分隔开。
如果数据呈现这样的分布,什么模型才适合呢?
需要用曲线才能分隔
y
=
0
y=0
y=0 的区域和
y
=
1
y=1
y=1 的区域,所以需要二次方特征:
h
θ
(
x
)
=
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
+
θ
4
x
2
2
)
{h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)
hθ(x)=g(θ0+θ1x1+θ2x2+θ3x12+θ4x22)是[-1 0 0 1 1],则得到的判定边界恰好是圆点在原点且半径为1的圆形。
可以用非常复杂的模型来适应非常复杂形状的判定边界。
6.4 代价函数
参考视频: 6 - 4 - Cost Function
如何拟合逻辑回归模型的参数
θ
\theta
θ?定义用来拟合参数的优化目标或者代价函数,这便逻辑回归模型的拟合问题。
对于线性回归模型,定义的代价函数是所有模型误差的平方和。理论上来说,也可以对逻辑回归模型沿用这个定义,但是问题
是,当我们将
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
{h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}x}}}
hθ(x)=1+e−θTx1带入这样的代价函数时,得到的代价函数是一个非凸函数(non-convexfunction)。
该代价函数有许多局部最小值,这会影响梯度下降算法寻找全局最小值。
线性回归的代价函数为: J ( θ ) = 1 m ∑ i = 1 m 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}} J(θ)=m1i=1∑m21(hθ(x(i))−y(i))2 。
我们重新定义逻辑回归的代价函数为:
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)}
J(θ)=m1i=1∑mCost(hθ(x(i)),y(i)),其中
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)与
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost\left( {h_\theta}\left( x \right),y \right)
Cost(hθ(x),y)之间的关系如下图所示:
代价函数
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost\left( {h_\theta}\left( x \right),y \right)
Cost(hθ(x),y)的特点是:当实际的
y
=
1
y=1
y=1 且预测
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)也为 1 时误差为 0,当
y
=
1
y=1
y=1 但预测
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)不为1时误差随着
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)变小而变大;当实际的
y
=
0
y=0
y=0 且预测
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)也为 0 时代价为 0,当
y
=
0
y=0
y=0 但预测
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)不为 0时误差随着
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)的变大而变大。
将 C o s t ( h θ ( x ) , y ) Cost\left( {h_\theta}\left( x \right),y \right) Cost(hθ(x),y)简化如下:
C o s t ( h θ ( x ) , y ) = − y × l o g ( h θ ( x ) ) − ( 1 − y ) × l o g ( 1 − h θ ( x ) ) Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right) Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
代入代价函数得到:
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) log ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} J(θ)=m1i=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]
即: J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
Python代码:
import numpy as np
def cost(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
return np.sum(first - second) / (len(X))
得到代价函数后,便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
Repeat {
θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta) θj:=θj−α∂θj∂J(θ)
(simultaneously update all )
}
求导后得到:
Repeat {
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
(simultaneously update all )
}
凸性分析:可以证明我们所选的代价函数会是一个凸优化问题。代价函数 J ( θ ) J(\theta) J(θ)会是一个凸函数,并且没有局部最优值。
推导过程:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
考虑:
h θ ( x ( i ) ) = 1 1 + e − θ T x ( i ) {h_\theta}\left( {{x}^{(i)}} \right)=\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} hθ(x(i))=1+e−θTx(i)1
则:
y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) {{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right) y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
= y ( i ) log ( 1 1 + e − θ T x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − 1 1 + e − θ T x ( i ) ) ={{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right) =y(i)log(1+e−θTx(i)1)+(1−y(i))log(1−1+e−θTx(i)1)
= − y ( i ) log ( 1 + e − θ T x ( i ) ) − ( 1 − y ( i ) ) log ( 1 + e θ T x ( i ) ) =-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^T}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^T}{{x}^{(i)}}}} \right) =−y(i)log(1+e−θTx(i))−(1−y(i))log(1+eθTx(i))
所以:
∂ ∂ θ j J ( θ ) = ∂ ∂ θ j [ − 1 m ∑ i = 1 m [ − y ( i ) log ( 1 + e − θ T x ( i ) ) − ( 1 − y ( i ) ) log ( 1 + e θ T x ( i ) ) ] ] \frac{\partial }{\partial {\theta_{j}}}J\left( \theta \right)=\frac{\partial }{\partial {\theta_{j}}}[-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^{T}}{{x}^{(i)}}}} \right)]}] ∂θj∂J(θ)=∂θj∂[−m1i=1∑m[−y(i)log(1+e−θTx(i))−(1−y(i))log(1+eθTx(i))]]
= − 1 m ∑ i = 1 m [ − y ( i ) − x j ( i ) e − θ T x ( i ) 1 + e − θ T x ( i ) − ( 1 − y ( i ) ) x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) ] =-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\frac{-x_{j}^{(i)}{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}{1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}}] =−m1i=1∑m[−y(i)1+e−θTx(i)−xj(i)e−θTx(i)−(1−y(i))1+eθTx(i)xj(i)eθTx(i)]
= − 1 m ∑ i = 1 m y ( i ) x j ( i ) 1 + e θ T x ( i ) − ( 1 − y ( i ) ) x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) ] =-\frac{1}{m}\sum\limits_{i=1}^{m}{{y}^{(i)}}\frac{x_j^{(i)}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}] =−m1i=1∑my(i)1+eθTx(i)xj(i)−(1−y(i))1+eθTx(i)xj(i)eθTx(i)]
= − 1 m ∑ i = 1 m y ( i ) x j ( i ) − x j ( i ) e θ T x ( i ) + y ( i ) x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}x_j^{(i)}-x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}+{{y}^{(i)}}x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}} =−m1i=1∑m1+eθTx(i)y(i)xj(i)−xj(i)eθTx(i)+y(i)xj(i)eθTx(i)
= − 1 m ∑ i = 1 m y ( i ) ( 1 + e θ T x ( i ) ) − e θ T x ( i ) 1 + e θ T x ( i ) x j ( i ) =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}\left( 1\text{+}{{e}^{{\theta^T}{{x}^{(i)}}}} \right)-{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}x_j^{(i)}} =−m1i=1∑m1+eθTx(i)y(i)(1+eθTx(i))−eθTx(i)xj(i)
= − 1 m ∑ i = 1 m ( y ( i ) − e θ T x ( i ) 1 + e θ T x ( i ) ) x j ( i ) =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =−m1i=1∑m(y(i)−1+eθTx(i)eθTx(i))xj(i)
= − 1 m ∑ i = 1 m ( y ( i ) − 1 1 + e − θ T x ( i ) ) x j ( i ) =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =−m1i=1∑m(y(i)−1+e−θTx(i)1)xj(i)
= − 1 m ∑ i = 1 m [ y ( i ) − h θ ( x ( i ) ) ] x j ( i ) =-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)]x_j^{(i)}} =−m1i=1∑m[y(i)−hθ(x(i))]xj(i)
= 1 m ∑ i = 1 m [ h θ ( x ( i ) ) − y ( i ) ] x j ( i ) =\frac{1}{m}\sum\limits_{i=1}^{m}{[{h_\theta}\left( {{x}^{(i)}} \right)-{{y}^{(i)}}]x_j^{(i)}} =m1i=1∑m[hθ(x(i))−y(i)]xj(i)
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 h θ ( x ) = g ( θ T X ) {h_\theta}\left( x \right)=g\left( {\theta^T}X \right) hθ(x)=g(θTX)与线性回归不同。另外,在运行梯度下降算法之前,特征缩放依旧是非常必要的。
一些梯度下降算法之外的选择:
除了梯度下降算法,还有一些常用来令代价函数最小的算法,这些算法更加复杂和优越,通常不需要人工选择学习率,而且比梯度下降算法要更加快速。有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) ,fminunc是 matlab和octave 中都带的一个最小值优化函数,使用时需要提供代价函数和每个参数的求导,下面是 octave 中使用 fminunc 函数的代码示例:
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);
6.5 简化的成本函数和梯度下降
参考视频: 6 - 5 - Simplified Cost Function and Gradient Descent
这就是逻辑回归的代价函数:
C o s t ( h θ ( x ) , y ) = − y × l o g ( h θ ( x ) ) − ( 1 − y ) × l o g ( 1 − h θ ( x ) ) Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right) Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
= − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] =-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} =−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
要试图找尽量让 J ( θ ) J\left( \theta \right) J(θ) 取得最小值的参数 θ \theta θ, min θ J ( θ ) \underset{\theta}{\min }J\left( \theta \right) θminJ(θ)
如果我们给出一个新的样本,假如某个特征 x x x,可以用拟合训练样本的参数 θ \theta θ,来输出对假设的预测。而假设的输出,实际上就是这个概率值: p ( y = 1 ∣ x ; θ ) p(y=1|x;\theta) p(y=1∣x;θ),就是关于 x x x以 θ \theta θ为参数, y = 1 y=1 y=1 的概率。
最小化代价函数的方法,是梯度下降法(gradient descent)。这是我们的代价函数:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]} J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
要最小化这个关于
θ
\theta
θ 的函数值,通常用的梯度下降法的模板:
反复更新每个参数,计算一下会得到这个等式:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}}){x_{j}}^{(i)}} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
将这个式子,在 i = 1 i=1 i=1 到 m m m 上求和,其实就是预测误差乘以 x j ( i ) x_j^{(i)} xj(i) ,所以把偏导数项 ∂ ∂ θ j J ( θ ) \frac{\partial }{\partial {\theta_j}}J\left( \theta \right) ∂θj∂J(θ)放回到原来式子里,就可以将梯度下降算法写作如下形式:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}}){x_{j}}^{(i)}} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
所以,如果你有
n
n
n 个特征,也就是说:
参数向量
θ
\theta
θ 包括
θ
0
{\theta_{0}}
θ0
θ
1
{\theta_{1}}
θ1
θ
2
{\theta_{2}}
θ2 一直到
θ
n
{\theta_{n}}
θn,需要用这个式子:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}}){{x}_{j}}^{(i)}} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
同时更新所有 θ \theta θ 的值。
如果把这个更新规则和线性回归上的比较的话,会发现这个式子正是我们用来做线性回归梯度下降的。那么,线性回归和逻辑回归是同一个算法吗?实际上,假设定义发生了变化。
对于线性回归假设函数:
h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n {h_\theta}\left( x \right)={\theta^T}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}} hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
而现在逻辑函数假设函数:
h θ ( x ) = 1 1 + e − θ T X {h_\theta}\left( x \right)=\frac{1}{1+{{e}^{-{\theta^T}X}}} hθ(x)=1+e−θTX1
因此,即使更新参数的规则看起来相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是不同的。
当使用梯度下降法实现逻辑回归时,这些不同的参数
θ
\theta
θ,需要用这个表达式来更新这些参数。可以使用 for循环来更新这些参数值,用 for i=1 to n
,或者 for i=1 to n+1
。当然,更提倡使用向量化的实现,可以把所有这些
n
n
n个参数同时更新。
6.6 高级优化
参考视频: 6 - 6 - Advanced Optimization
换个角度来看什么是梯度下降,有代价函数
J
(
θ
)
J\left( \theta \right)
J(θ),想要使其最小化,编写代码当输入参数
θ
\theta
θ 时,会计算出两样东西:
J
(
θ
)
J\left( \theta \right)
J(θ) 以及
J
J
J 等于 0、1直到
n
n
n 时的偏导数项。
假设已经完成了实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新。
另一种思路是:需要写代码计算 J ( θ ) J\left( \theta \right) J(θ) 和这些偏导数,然后插入到梯度下降中,它就可以为我们最小化这个函数。
对于梯度下降,技术上讲,实际并不需要编写代码来计算代价函数 J ( θ ) J\left( \theta \right) J(θ)。只需要写代码来计算导数项,但是如果你希望代码还要能够监控这些 J ( θ ) J\left( \theta \right) J(θ) 的收敛性,那么就需要自己编写代码来计算代价函数 J ( θ ) J(\theta) J(θ)和偏导数项 ∂ ∂ θ j J ( θ ) \frac{\partial }{\partial {\theta_j}}J\left( \theta \right) ∂θj∂J(θ)。
梯度下降并不是唯一能用的算法,还有其他更高级、更复杂的算法。如果能用这些方法来计算代价函数 J ( θ ) J\left( \theta \right) J(θ)和偏导数项 ∂ ∂ θ j J ( θ ) \frac{\partial }{\partial {\theta_j}}J\left( \theta \right) ∂θj∂J(θ)的话,这些算法就为我们优化代价函数提供不同方法,共轭梯度法 BFGS (变尺度法) 和L-BFGS (限制变尺度法) 就是更高级的算法,它们需要有一种方法来计算 J ( θ ) J\left( \theta \right) J(θ),以及需要一种方法计算导数项作为方法的输入,再使用比梯度下降更复杂的算法来最小化代价函数。
这几种算法有许多优点:
一个是不需要手动选择学习率 α \alpha α,所以给出计算导数项和代价函数的方法之后,可以认为算法有一个智能的内部循环,称为线性搜索(line search)算法,可以自动尝试不同的学习速率 α \alpha α,并自动选择一个好的学习速率 a a a,甚至可以为每次迭代选择不同的学习速率,所以它们往往比梯度下降收敛得快多了。
现在让我们来说明:如何使用这些算法:
比方有一个含两个参数的问题,这两个参数是
θ
0
{\theta_{0}}
θ0和
θ
1
{\theta_{1}}
θ1,通过代价函数,可以得到
θ
1
{\theta_{1}}
θ1和
θ
2
{\theta_{2}}
θ2的值,将
J
(
θ
)
J\left( \theta \right)
J(θ) 最小化的话,最小值将是
θ
1
=
5
{\theta_{1}}=5
θ1=5 ,
θ
2
=
5
{\theta_{2}}=5
θ2=5。代价函数
J
(
θ
)
J\left( \theta \right)
J(θ)的导数推出来就是这两个表达式:
∂ ∂ θ 1 J ( θ ) = 2 ( θ 1 − 5 ) \frac{\partial }{\partial {{\theta }_{1}}}J(\theta)=2({{\theta }_{1}}-5) ∂θ1∂J(θ)=2(θ1−5)
∂ ∂ θ 2 J ( θ ) = 2 ( θ 2 − 5 ) \frac{\partial }{\partial {{\theta }_{2}}}J(\theta)=2({{\theta }_{2}}-5) ∂θ2∂J(θ)=2(θ2−5)
如果不知道最小值,但想要代价函数找到这个最小值,可以使用梯度下降算法,但最好用比它更高级的算法,要做的就是运行这样的函数:
function [jVal, gradient]=costFunction(theta)
jVal=(theta(1)-5)^2+(theta(2)-5)^2;
gradient=zeros(2,1);
gradient(1)=2*(theta(1)-5);
gradient(2)=2*(theta(2)-5);
end
这样就计算出这个代价函数,函数返回的第二个值是梯度值,梯度值应该是一个2×1的向量,梯度向量的两个元素对应这里的两个偏导数项,运行这个costFunction 后,就可以调用高级的优化函数,这个函数叫
fminunc,无约束最小化函数。调用方式如下:
options=optimset('GradObj','on','MaxIter',100);
initialTheta=zeros(2,1);
[optTheta, functionVal, exitFlag]=fminunc(@costFunction, initialTheta, options);
要设置几个options,这个 options 变量作为一个数据结构可以存储你想要的options,所以 GradObj 和On,这里设置梯度目标参数为打开(on),意味着要给这个算法提供一个梯度,然后设置最大迭代次数,比如100,我们给出一个 θ \theta θ 的初始值,它是一个2×1的向量,这个命令就调用fminunc,这个@符号表示指向刚刚定义的costFunction 函数的指针。调用它,它会为你找到最佳的 θ {\theta} θ 值。
6.7 多类别分类:一对多
参考视频: 6 - 7 - Multiclass Classification\_ One-vs-all
相对于二元分类问题,多类别分类的数据看起来可能像这样:
3种不同的符号来代表3个类别。
下面介绍如何进行一对多分类
有一个训练集,上图表示有3个类别,我们用三角形表示
y
=
1
y=1
y=1,方框表示
y
=
2
y=2
y=2,叉表示
y
=
3
y=3
y=3。要做的是使用一个训练集,将其分成3个二元分类问题。
先从类别1开始,可以创建一个新的"伪"训练集,将类型2和类型3定为负类,类型1设定为正类,如下图所示,要为这个新的训练集拟合出一个合适的分类器。
三角形是正样本,圆形为负样本。下面可以训练一个标准的逻辑回归分类器,这样就得到一个正边界。
为了实现这样的转变,将多个类中的一个类标记为正类( y = 1 y=1 y=1),然后将其他所有类都标记为负类,这个模型记作 h θ ( 1 ) ( x ) h_\theta^{\left( 1 \right)}\left( x \right) hθ(1)(x)。接着,类似地我们选择另一个类标记为正类( y = 2 y=2 y=2),再将其它类都标记为负类,将这个模型记作 h θ ( 2 ) ( x ) h_\theta^{\left( 2 \right)}\left( x \right) hθ(2)(x),以此类推。
最后我们得到一系列的模型简记为: h θ ( i ) ( x ) = p ( y = i ∣ x ; θ ) h_\theta^{\left( i \right)}\left( x \right)=p\left( y=i|x;\theta \right) hθ(i)(x)=p(y=i∣x;θ) 其中: i = ( 1 , 2 , 3.... k ) i=\left( 1,2,3....k \right) i=(1,2,3....k)
最后,在需要做预测时,将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。
最后要做的就是训练这个逻辑回归分类器: h θ ( i ) ( x ) h_\theta^{\left( i \right)}\left( x \right) hθ(i)(x), 其中 i i i 对应每一个可能的 y = i y=i y=i,最后,给出输入一个新的 x x x 值,在三个分类器里面输入 x x x,选择一个让 h θ ( i ) ( x ) h_\theta^{\left( i \right)}\left( x \right) hθ(i)(x) 最大的 i i i,即 max i   h θ ( i ) ( x ) \mathop{\max}\limits_i\,h_\theta^{\left( i \right)}\left( x \right) imaxhθ(i)(x)。
七、正则化(Regularization)
7.1 过拟合的问题
参考视频: 7 - 1 - The Problem of Overfitting
如果有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为0),但是可能会不能推广到新的数据。
下图是一个回归问题的例子:
第一个模型是线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。若给出一个新值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
分类问题中也存在这样的问题:
以多项式理解,
x
x
x 的次数越高,拟合的越好,但预测的能力就可能变差。
如果发现过拟合问题,应该如何处理?
-
丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)
-
正则化。 保留所有的特征,但是减少参数的大小(magnitude)。
7.2 代价函数
参考视频: 7 - 2 - Cost Function
上面的回归问题中如果模型是:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
2
+
θ
3
x
3
3
+
θ
4
x
4
4
{h_\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}+{\theta_{4}}{x_{4}^4}
hθ(x)=θ0+θ1x1+θ2x22+θ3x33+θ4x44
可以看出,是那些高次项导致了过拟合,如果如果能让这些高次项的系数接近于0的话,就可以避免过拟合。
所以要做的就是在一定程度上减小这些高次项的 θ \theta θ 值,这就是正则化方法。如果要减少 θ 3 {\theta_{3}} θ3和 θ 4 {\theta_{4}} θ4的大小,要做的便是修改代价函数,在 θ 3 {\theta_{3}} θ3 和 θ 4 {\theta_{4}} θ4 设置一点惩罚。在尝试最小化代价函数时也将这个惩罚纳入考虑,并最终导致选择出一些较小的 θ 3 {\theta_{3}} θ3 和 θ 4 {\theta_{4}} θ4。
修改后的代价函数如下:
min
θ
 
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
1000
θ
3
2
+
10000
θ
4
2
]
\underset{\theta }{\mathop{\min }}\,\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}+1000\theta _{3}^{2}+10000\theta _{4}^{2}]}
θmin2m1[i=1∑m(hθ(x(i))−y(i))2+1000θ32+10000θ42]
通过这样的代价函数选择出的
θ
3
{\theta_{3}}
θ3和
θ
4
{\theta_{4}}
θ4 对预测结果的影响比之前要小很多。假如有非常多的特征,不知道哪些特征要惩罚,可以将对所有的特征进行惩罚,并让代价函数最优化的软件来选择这些惩罚的程度。这样得到一个较为简单的能防止过拟合问题的假设:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
]
J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]}
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
其中
λ
\lambda
λ 称为正则化参数(Regularization Parameter)。 根据惯例,我们不对
θ
0
{\theta_{0}}
θ0 进行惩罚。正则化处理的模型与原模型的对比如下图所示:
如果正则化参数
λ
\lambda
λ 过大,则会把所有的参数都最小化,导致模型变成
h
θ
(
x
)
=
θ
0
{h_\theta}\left( x \right)={\theta_{0}}
hθ(x)=θ0,也就是上图中红色直线所示,造成欠拟合。
为什么增加的一项
λ
=
∑
j
=
1
n
θ
j
2
\lambda =\sum\limits_{j=1}^{n}{\theta_j^{2}}
λ=j=1∑nθj2 可以使
θ
\theta
θ 的值减小呢?
如果我们令
λ
\lambda
λ 的值很大的话,为了使Cost Function 尽可能的小,所有的
θ
\theta
θ 的值(不包括
θ
0
{\theta_{0}}
θ0)都会一定程度减小。
但若 λ \lambda λ 的值太大,那么 θ \theta θ(不包括 θ 0 {\theta_{0}} θ0)都会趋近于0,这样得到的只能是一条平行于 x x x 轴的直线。
所以正则化要取一个合理的 λ \lambda λ 的值。
7.3 正则化线性回归
参考视频: 7 - 3 - Regularized Linear Regression
线性回归的求解,推导了两种算法:一种基于梯度下降,一种基于正规方程。
正则化线性回归的代价函数为:
J ( θ ) = 1 2 m ∑ i = 1 m [ ( ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ) ] J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{[({{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta _{j}^{2}})]} J(θ)=2m1i=1∑m[((hθ(x(i))−y(i))2+λj=1∑nθj2)]
如果使用梯度下降法令这个代价函数最小化,因为未对 θ 0 \theta_0 θ0 进行正则化,所以梯度下降算法将分两种情形:
R e p e a t Repeat Repeat u n t i l until until c o n v e r g e n c e convergence convergence{
θ 0 : = θ 0 − a 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) ) {\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}}) θ0:=θ0−am1i=1∑m((hθ(x(i))−y(i))x0(i))
θ j : = θ j − a [ 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] {\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}] θj:=θj−a[m1i=1∑m((hθ(x(i))−y(i))xj(i)+mλθj]
f o r for for j = 1 , 2 , . . . n j=1,2,...n j=1,2,...n
}
对上面的算法中 j = 1 , 2 , . . . , n j=1,2,...,n j=1,2,...,n 时的更新式子进行调整可得:
θ j : = θ j ( 1 − a λ m ) − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}(1-a\frac{\lambda }{m})-a\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}} θj:=θj(1−amλ)−am1i=1∑m(hθ(x(i))−y(i))xj(i)
可以看出,正则化线性回归的梯度下降算法的变化在于,**每次都在原有算法更新规则的基础上令 θ \theta θ 值减少了一个额外的值。
也可以利用正规方程来求解正则化线性回归模型,方法如下:
图中的矩阵尺寸为
(
n
+
1
)
∗
(
n
+
1
)
(n+1)*(n+1)
(n+1)∗(n+1)。
7.4 正则化的逻辑回归模型
参考视频: 7 - 4 - Regularized Logistic Regression
逻辑回归问题学习过两种优化算法:梯度下降法来优化代价函数 J ( θ ) J\left( \theta \right) J(θ),高级优化算法(需要你自己设计代价函数 J ( θ ) J\left( \theta \right) J(θ) )。
也给代价函数增加一个正则化的表达式,得到代价函数:
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) log ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}+\frac{\lambda }{2m}\sum\limits_{j=1}^{n}{\theta _{j}^{2}} J(θ)=m1i=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2
Python代码:
import numpy as np
def costReg(theta, X, y, learningRate):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:theta.shape[1]],2))
return np.sum(first - second) / (len(X)) + reg
要最小化该代价函数,通过求导,得出梯度下降算法为:
R e p e a t Repeat Repeat u n t i l until until c o n v e r g e n c e convergence convergence{
θ 0 : = θ 0 − a 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) ) {\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}}) θ0:=θ0−am1i=1∑m((hθ(x(i))−y(i))x0(i))
θ j : = θ j − a [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] {\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}] θj:=θj−a[m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj]
f o r for for j = 1 , 2 , . . . n j=1,2,...n j=1,2,...n
}
注:看上去同线性回归一样,但是 h θ ( x ) = g ( θ T X ) {h_\theta}\left( x \right)=g\left( {\theta^T}X \right) hθ(x)=g(θTX),所以与线性回归不同。
依旧可以用 fminuc
函数来求解使代价函数最小化的参数,但是参数
θ
0
{\theta_{0}}
θ0的更新规则与其他情况不同:
注意:
-
虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的 h θ ( x ) {h_\theta}\left( x \right) hθ(x)不同,所以还是有很大差别。
-
θ 0 {\theta_{0}} θ0 不参与其中的任何一个正则化。