线性回归
给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_m},{y_m})\} D={(x1,y1),(x2,y2),⋯,(xm,ym)},其中 x i = ( x i 1 ; x i 2 ; ⋯ ; x i d ) x_i=(x_{i1};x_{i2};\cdots;x_{id}) xi=(xi1;xi2;⋯;xid), y i ∈ R . y_i\in R. yi∈R.线性回归试(linear regression)图学得一个线性模型以尽可能的准确的预测实值输出标记。
这里 x i x_i xi表示数据集中第 i i i个样本,该样本总共有 d d d个特征。
1.单变量线性回归
由于是单变量,输入的样本特征只有一个,此时我们忽略关于样本特征的下标,即
D
=
{
(
x
i
,
y
i
)
}
i
=
1
m
D = \{ ({x_i},{y_i})\} _{i = 1}^m
D={(xi,yi)}i=1m,其中
x
i
∈
R
{x_i} \in R
xi∈R。对于离散属性,若特征值间存在“序”(order)关系,可通过连续化将其转化为连续值。
线性回归试图学得
f
(
x
i
)
=
w
x
i
+
b
,
使
得
f
(
x
i
)
≃
y
i
f({x_i}) = w{x_i} + b,使得f({x_i}) \simeq {y_i}
f(xi)=wxi+b,使得f(xi)≃yi
确定
w
w
w与
b
b
b的值,关键在于如何衡量
f
(
x
)
f(x)
f(x)与
y
y
y之间的差异,而均方误差则是回归任务中最常用的性能度量,因此需要让均方误差最小化,即
w
w
w与
b
b
b的解
w
∗
与
b
∗
{w^*}与{b^*}
w∗与b∗为
(
w
∗
,
b
∗
)
=
arg
min
(
w
,
b
)
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
arg
min
(
w
,
b
)
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
\begin{aligned} ({w^*},{b^*}) &= \mathop {\arg \min }\limits_{(w,b)} \sum\limits_{i = 1}^m {{{(f({x_i}) - {y_i})}^2}} \\ & = \mathop {\arg \min }\limits_{(w,b)} \sum\limits_{i = 1}^m {{{({y_i} - w{x_i} - b)}^2}} \end{aligned}
(w∗,b∗)=(w,b)argmini=1∑m(f(xi)−yi)2=(w,b)argmini=1∑m(yi−wxi−b)2
均方误差的几何意义对应于欧几里得距离即“欧氏距离”,而基于均方误差最小化来进行模型求解的方法则是“最小二乘法”,“最小二乘法”实质上就是找到一条直线,使所有样本数据到该直线的欧式距离之和最小,即误差最小。
求解
w
w
w与
b
b
b是使代价函数
J
(
w
,
b
)
=
1
2
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
{J{(w,b)}} =\frac{1}{2} \sum\limits_{i = 1}^m {{{({y_i} - w{x_i} - b)}^2}}
J(w,b)=21i=1∑m(yi−wxi−b)2最小化的过程,
J
(
w
,
b
)
{J{(w,b)}}
J(w,b)是关于
w
w
w和
b
b
b的凸函数,当它关于
w
w
w和
b
b
b的导数均为0时,得到
w
w
w和
b
b
b的最优解。得到
∂
J
(
w
,
b
)
∂
w
=
w
∑
i
=
1
m
x
i
2
−
∑
i
=
1
m
(
y
i
−
b
)
x
i
∂
J
(
w
,
b
)
∂
b
=
∑
i
=
1
m
b
−
∑
i
=
1
m
y
i
+
∑
i
=
1
m
w
x
i
=
m
b
−
∑
i
=
1
m
(
y
i
−
w
x
i
)
\begin{aligned} \frac{{\partial {J{(w,b)}}}}{{\partial w}} &= w\sum\limits_{i = 1}^m {{x_i}^2 - } \sum\limits_{i = 1}^m {({y_i} - b){x_i}} \\ \frac{{\partial {J{(w,b)}}}}{{\partial b}} &= \sum\limits_{i = 1}^m b - \sum\limits_{i = 1}^m {{y_i} + \sum\limits_{i = 1}^m {w{x_i}} }= mb - \sum\limits_{i = 1}^m {({y_i} - w{x_i}} ) \end{aligned}
∂w∂J(w,b)∂b∂J(w,b)=wi=1∑mxi2−i=1∑m(yi−b)xi=i=1∑mb−i=1∑myi+i=1∑mwxi=mb−i=1∑m(yi−wxi)
然后令
∂
J
(
w
,
b
)
∂
w
\frac{{\partial {J{(w,b)}}}}{{\partial w}}
∂w∂J(w,b)和
∂
J
(
w
,
b
)
∂
b
\frac{{\partial {J{(w,b)}}}}{{\partial b}}
∂b∂J(w,b)等于0可以得到
w
w
w和
b
b
b最优解
w
=
∑
i
=
1
m
y
i
(
x
i
−
x
‾
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
(
注
:
x
‾
=
1
m
∑
i
=
1
m
x
i
)
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
\begin{aligned} w &= \frac{{\sum\limits_{i = 1}^m {{y_i}({x_i} - \overline x )} }}{{\sum\limits_{i = 1}^m {x_i^2} - \frac{1}{m}{{(\sum\limits_{i = 1}^m {{x_i}} )}^2}}}(注:\overline x = \frac{1}{m}\sum\limits_{i = 1}^m {{x_i}} ) \\ b &= \frac{1}{m}\sum\limits_{i = 1}^m {({y_i} - w{x_i})} \end{aligned}
wb=i=1∑mxi2−m1(i=1∑mxi)2i=1∑myi(xi−x)(注:x=m1i=1∑mxi)=m1i=1∑m(yi−wxi)
2.推广到一般情形——多元线性回归
例如文章开头的线性回归描述,数据集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
m
,
y
m
)
}
D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_m},{y_m})\}
D={(x1,y1),(x2,y2),⋯,(xm,ym)},其中
x
i
=
(
x
i
1
;
x
i
2
;
⋯
;
x
i
d
)
x_i=(x_{i1};x_{i2};\cdots;x_{id})
xi=(xi1;xi2;⋯;xid),
y
i
∈
R
.
y_i\in R.
yi∈R.,样本由
d
d
d个特征,此时我们试图学得
f
(
x
i
)
=
w
x
i
+
b
,
使
得
f
(
x
i
)
≃
y
i
f({x_i}) = w{x_i} + b,使得f({x_i}) \simeq {y_i}
f(xi)=wxi+b,使得f(xi)≃yi
这称为“多元线性回归”。
同样可以利用最小二乘法来对
w
w
w和
b
b
b进行估计,为方便运算,令
w
^
=
(
w
;
b
)
\hat w = (w;b)
w^=(w;b),
w
^
\hat w
w^是
(
d
+
1
)
×
1
(d+1)\times1
(d+1)×1的矩阵,则数据集
D
D
D可以表示为一个
m
×
(
d
+
1
)
m \times (d + 1)
m×(d+1)的矩阵
X
X
X,每一行代表每一个样本,每列的
d
d
d个元素代表
d
d
d个特征,最后一列全为1,即
X
=
(
x
11
x
12
⋯
x
1
d
1
x
21
x
22
⋯
x
2
d
1
⋮
⋮
⋱
⋮
⋮
x
m
1
x
m
2
⋯
x
m
d
1
)
=
(
x
1
T
1
x
2
T
1
⋮
⋮
x
m
T
1
)
X = \begin{pmatrix} {{x_{11}}} & {{x_{12}}} & \cdots & {{x_{1d}}} & 1 \\ {{x_{21}}} & {{x_{22}}} & \cdots & {{x_{2d}}} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ {{x_{m1}}} & {{x_{m2}}} & \cdots & {{x_{md}}} & 1 \\ \end{pmatrix} = \begin{pmatrix} {x_1^T} & 1 \\ {x_2^T} & 1 \\ \vdots & \vdots \\ {x_m^T} & 1 \\ \end{pmatrix}
X=⎝⎜⎜⎜⎛x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1dx2d⋮xmd11⋮1⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛x1Tx2T⋮xmT11⋮1⎠⎟⎟⎟⎞
则
y
=
(
y
1
;
y
2
;
⋯
;
y
m
)
y = ({y_1};{y_2}; \cdots ;{y_m})
y=(y1;y2;⋯;ym)
同样求
w
^
\hat w
w^的解
w
^
∗
{\hat w^*}
w^∗可表示为
w
^
∗
=
arg
min
w
^
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
{\hat w^*} = \mathop {\arg \min }\limits_{\hat w} {(y - X\hat w)^T}(y - X\hat w)
w^∗=w^argmin(y−Xw^)T(y−Xw^)
令
J
(
w
^
)
=
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
J(\hat w) = {(y - X\hat w)^T}(y - X\hat w)
J(w^)=(y−Xw^)T(y−Xw^),然后对
w
^
\hat w
w^求导得:
∂
J
(
w
^
)
∂
w
^
=
2
X
T
(
X
w
^
−
y
)
\frac{{\partial J(\hat w)}}{{\partial \hat w}} = 2{X^T}(X\hat w - y)
∂w^∂J(w^)=2XT(Xw^−y)
注:常用的矩阵求导公式
∂ A B ∂ B = A T \frac{{\partial AB}}{{\partial B}} = {A^T} ∂B∂AB=AT ∂ A T B ∂ A = B \frac{{\partial {A^T}B}}{{\partial A}} = B ∂A∂ATB=B ∂ X T A X ∂ X = 2 A X \frac{{\partial {X^T}AX}}{{\partial X}} = 2AX ∂X∂XTAX=2AX
当
∂
J
(
w
^
)
∂
w
^
\frac{{\partial J(\hat w)}}{{\partial \hat w}}
∂w^∂J(w^)为0可得
w
^
\hat w
w^的最优解,且当
X
T
X
{X^T}X
XTX为满秩矩阵或正定矩阵时,可得
w
^
∗
=
(
X
T
X
)
−
1
X
T
y
{\hat w^*} = {({X^T}X)^{ - 1}}{X^T}y
w^∗=(XTX)−1XTy
令
x
^
=
(
x
i
;
1
)
\hat x = ({x_i};1)
x^=(xi;1)最终学得的多元线性回归模型为
f
(
x
i
)
=
x
i
T
(
X
T
X
)
−
1
X
T
y
f({x_i}) = x_i^T{({X^T}X)^{ - 1}}{X^T}y
f(xi)=xiT(XTX)−1XTy
梯度下降算法
1.选择梯度下降算法而不是直接求导等于0的理由
为什么计算损失函数最优值采用梯度下降算法而不是直接求导等于0?
1、
X
T
X
{X^T}X
XTX必须要可逆,也就是
X
X
X必须可逆,但是现实任务中
X
T
X
{X^T}X
XTX往往不是满秩矩阵。例如在许多任务中我们会遇到样本包含大量的特征,其数目甚至超过样本数目,导致
X
X
X的列数多于行数,
X
T
X
{X^T}X
XTX显然不是满秩,因此直接求导不可行;
2、假设满足了条件一,那么就需要去求
X
X
X的转置乘以
X
X
X这个整体的逆,线性代数中给出了求逆矩阵的方法,是非常复杂的(对计算机来说就是十分消耗性能的),数据量小时,还可行,一旦数据量大,计算机求矩阵的逆将会是一项非常艰巨的任务,消耗的性能以及时间巨大,而在机器学习中,数据量少者上千,多者上亿;因此直接求导不可行。
相较而言,梯度下降算法同样能够实现最优化求解,通过多次迭代使得代价函数收敛,并且使用梯度下降的计算成本很低,所以基于以上两个原因,回归中多数采用梯度下降而不是求导等于零。
2.梯度的概念
梯度是微积分中一个很重要的概念
1)在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
2)在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
3.场景假设
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
4.学习率
学习率即为每次更新迭代参数的步长,通常我们学习率使用
α
\alpha
α来表示。
如果
α
\alpha
α太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
如果
α
\alpha
α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果太大,它会导致无法收敛,甚至发散。
5.单变量梯度下降
为方便描述,这里令预测的函数模型为
f
(
x
i
)
=
θ
0
+
θ
1
x
f({x_i}) = {\theta _0} + {\theta _1}x
f(xi)=θ0+θ1x
代价函数为
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
f
(
x
(
i
)
)
−
y
(
i
)
)
2
J({\theta _0},{\theta _1}) = \frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x^{_(i)}}) - {y^{_(i)}})}^2}}
J(θ0,θ1)=2m1i=1∑m(f(x(i))−y(i))2
注:跟之前的式子比,这里 θ 0 {\theta _0} θ0= b b b, θ 1 {\theta _1} θ1= w w w.这里的系数 1 2 m \frac{1}{{2m}} 2m1对结果没有影响。
(1)单变量梯度下降公式
Repeat until convergence
{
θ
j
=
θ
j
−
α
∂
J
(
θ
0
,
θ
1
)
∂
θ
j
(
f
o
r
j
=
0
a
n
d
j
=
1
)
}
\{ \\ {\theta _j} = {\theta _j} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _j}}} \space\space(for\space j=0 \space and \space j=1) \\ \}
{θj=θj−α∂θj∂J(θ0,θ1) (for j=0 and j=1)}
注:需要同步跟新两个变量
t
e
m
p
0
=
θ
0
−
α
∂
J
(
θ
0
,
θ
1
)
∂
θ
0
temp0 = {\theta _0} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _0}}}
temp0=θ0−α∂θ0∂J(θ0,θ1)
t
e
m
p
1
=
θ
1
−
α
∂
J
(
θ
0
,
θ
1
)
∂
θ
1
temp1 = {\theta _1} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _1}}}
temp1=θ1−α∂θ1∂J(θ0,θ1)
θ
0
:
=
t
e
m
p
0
{\theta _0}: = temp0
θ0:=temp0
θ
1
:
=
t
e
m
p
1
{\theta _1}: = temp1
θ1:=temp1
(2)单变量梯度下降实例
我们假设有一个单变量的函数:
J
(
θ
)
=
θ
2
J(\theta ) = {\theta ^2}
J(θ)=θ2
函数的微分:
J
′
(
θ
)
=
2
θ
J'(\theta ) = 2\theta
J′(θ)=2θ
初始化,起点可以随意设置,这里设置为为:
θ
0
=
1
{\theta ^0}{\text{ = }}1
θ0 = 1
学习率:
α
=
0.4
\alpha {\text{ = }}0.4
α = 0.4
我们开始进行梯度下降的迭代计算过程:
θ
0
=
1
{\theta ^0}{\text{ = }}1
θ0 = 1
θ
1
=
θ
0
−
α
J
′
(
θ
0
)
=
1
−
0.4
∗
2
=
0.2
\begin{aligned} {\theta ^1}&= {\theta ^0} - \alpha J'({\theta ^0}) \\ &= 1 - 0.4*2 \\ &= 0.2 \\ \end{aligned}
θ1=θ0−αJ′(θ0)=1−0.4∗2=0.2
θ
2
=
θ
1
−
α
J
′
(
θ
1
)
=
0.2
−
0.4
∗
0.4
=
0.04
\begin{aligned} {\theta ^2}& ={\theta ^1} - \alpha J'({\theta ^1}) \\ & = 0.2 - 0.4*0.4 \\ & = 0.04 \\ \end{aligned}
θ2=θ1−αJ′(θ1)=0.2−0.4∗0.4=0.04
θ
3
=
0.008
{\theta ^3} = 0.008
θ3=0.008
θ
4
=
0.0016
{\theta ^4} = 0.0016
θ4=0.0016
这个实例显然最优解为0,经过4次迭代,已经非常接近最优解了。
6.多变量梯度下降
支持多变量的假设
f
f
f表示为
f
(
x
i
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
f({x_i}) = {\theta _0} + {\theta _1}{x_1} + {\theta _2}{x_2} + \cdots + {\theta _n}{x_n}
f(xi)=θ0+θ1x1+θ2x2+⋯+θnxn
这个公式中有个
n
+
1
n+1
n+1参数和
n
n
n个变量,为了使得公式能够简化一些,引入
x
0
x_0
x0,则公式转化为:
f
(
x
i
)
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
f({x_i}) = {\theta _0}{x_0} + {\theta _1}{x_1} + {\theta _2}{x_2} + \cdots + {\theta _n}{x_n}
f(xi)=θ0x0+θ1x1+θ2x2+⋯+θnxn
此时模型中的
θ
\theta
θ参数是一个
n
+
1
n+1
n+1维的向量,任何一个训练实例也都是
n
+
1
n+1
n+1维的向量,特征矩阵
X
X
X的维度是
m
×
(
n
+
1
)
m\times(n+1)
m×(n+1) 。 因此公式可以简化为:
f
(
x
i
)
=
θ
T
X
f({x_i}) = {\theta ^T}X
f(xi)=θTX.
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:
J
(
θ
0
,
θ
1
,
⋯
,
θ
n
)
=
1
2
m
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
J({\theta _0},{\theta _1}, \cdots ,{\theta _n}) = \frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x_i}) - {y_i})}^2}}
J(θ0,θ1,⋯,θn)=2m1i=1∑m(f(xi)−yi)2
(1)多变量梯度下降公式
Repeat{
θ
j
=
θ
j
−
α
∂
J
(
θ
0
,
θ
1
,
⋯
,
θ
n
)
∂
θ
j
=
θ
j
−
α
∂
∂
θ
j
1
2
m
∑
i
=
1
m
(
f
(
x
(
i
)
)
−
y
(
i
)
)
2
=
θ
j
−
α
1
m
∑
i
=
1
m
(
(
f
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
)
\begin{aligned} {\theta _j} &= {\theta _j} - \alpha \frac{{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{{\partial {\theta _j}}} \\ & = {\theta _j} - \alpha \frac{\partial }{{\partial {\theta _j}}}\frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x^{_(i)}}) - {y^{_(i)}})}^2}} \\ & = {\theta _j} - \alpha \frac{1}{m}\sum\limits_{i = 1}^m {((f({x^{_(i)}}) - {y^{_(i)}})} {x_{_j}^{(i)}}) \\ \end{aligned}
θj=θj−α∂θj∂J(θ0,θ1,⋯,θn)=θj−α∂θj∂2m1i=1∑m(f(x(i))−y(i))2=θj−αm1i=1∑m((f(x(i))−y(i))xj(i))
(simultaneity update
θ
j
{\theta _j}
θj for
j
=
0
,
1
,
2
,
.
.
.
,
n
j=0,1,2,...,n
j=0,1,2,...,n)
}
(2)多变量梯度下降实例
我们假设有一个目标函数:
j
(
θ
1
,
θ
2
)
=
θ
1
2
+
θ
2
2
j({\theta _1},{\theta _2}) = \theta _1^2{\text{ + }}\theta _2^2
j(θ1,θ2)=θ12 + θ22
显然这个简单的函数最优解取在(0,0)点,但是这次我们用梯度算法,一步步求出最优解。
我们假设初始的起点为:
θ
0
= (1,3)
{\theta ^0}{\text{ = (1,3)}}
θ0 = (1,3)
初始的学习率为:
α
=
0.1
\alpha = 0.1
α=0.1
函数的梯度为:
Δ
J
(
θ
1
,
θ
2
)
=
<
2
θ
1
,
2
θ
2
>
\Delta J({\theta _1},{\theta _2}) = < 2{\theta _1},2{\theta _2} >
ΔJ(θ1,θ2)=<2θ1,2θ2>
进行多次迭代:
θ
0
= (1,3)
θ
1
=
θ
0
−
α
Δ
J
(
θ
1
,
θ
2
)
=
(1,3)
−
0.1
∗
(
2
,
6
)
=
(
0.8
,
2.4
)
θ
2
=
(
0.8
,
2.4
)
−
0.1
∗
(
1.6
,
4.8
)
=
(
0.64
,
1.92
)
θ
3
=
(
0.5124
,
1.536
)
θ
4
=
(
0.4096
,
1.228800000000001
)
⋮
θ
10
=
(
0.1073741824000003
,
0.32212254720000005
)
⋮
θ
50
=
(
1.141798154164342
e
−
05
,
3.42539442494306
e
−
05
)
\begin{aligned} & {\theta ^0}{\text{ = (1,3)}} \\ & {\theta ^1} = {\theta ^0} - \alpha \Delta J({\theta _1},{\theta _2}) = {\text{(1,3)}} - 0.1*(2,6) = (0.8,2.4) \\ & {\theta ^2} = (0.8,2.4) - 0.1*(1.6,4.8) = (0.64,1.92) \\ & {\theta ^3} = (0.5124,1.536) \\ & {\theta ^4} = (0.4096,1.228800000000001) \\ & \vdots \\ & {\theta ^{10}} = (0.1073741824000003,0.32212254720000005) \\ & \vdots \\ & {\theta ^{50}} = (1.141798154164342{e^{ - 05}},3.42539442494306{e^{ - 05}}) \\ \end{aligned}
θ0 = (1,3)θ1=θ0−αΔJ(θ1,θ2)=(1,3)−0.1∗(2,6)=(0.8,2.4)θ2=(0.8,2.4)−0.1∗(1.6,4.8)=(0.64,1.92)θ3=(0.5124,1.536)θ4=(0.4096,1.228800000000001)⋮θ10=(0.1073741824000003,0.32212254720000005)⋮θ50=(1.141798154164342e−05,3.42539442494306e−05)
显然已经非常接近最优解点
代码示例
def gradientDescent(X, y, theta, alpha, iters):
temp = np.matrix(np.zeros(theta.shape))
parameters = int(theta.ravel().shape[1])#计算需求解的参数个数
cost = np.zeros(iters)
for i in range(iters):
error = (X * theta.T) - y
for j in range(parameters):
term = np.multiply(error, X[:,j])
temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
梯度下降算法与正规方程(直接计算导数等于0)的比较
梯度下降 | 正规方程 |
---|---|
需要选择学习率 α \alpha α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量 n n n大时也能较好适用 | 需要计算 X T X {X^T}X XTX如果特征数量 n n n较大则运算代价大,因为矩阵逆的计算时间复杂度为 O ( n 3 ) O({n^3}) O(n3),通常来说当 n n n小于10000 时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
常见的梯度下降算法还有:
全梯度下降算法(Full gradient descent)
随机梯度下降算法(Stochastic gradient descent)
小批量梯度下降算法(Mini-batch gradient descent)
这里仅作扩展,就不一一详述。
参考文献
周志华《机器学习》
吴恩达 机器学习
为什么计算损失函数最优值采用梯度下降算法而不是直接求导等于0的深度解释
梯度下降算法原理讲解——机器学习