机器学习——回归算法之线性回归
前言
机器学习算法按照“用途”可分为回归、分类、聚类、降维、模型选择和预处理,前面的几篇已经介绍完降维和预处理,从这篇开始更新回归、分类、聚类等算法。关于回归和分类的区别,请自行百度,这一篇介绍回归模型。
线性回归
一个数据集有m个样本: X = { X 1 , X 2 , . . . , X m } X=\{X^{1},X^{2},...,X^{m}\} X={X1,X2,...,Xm}
对应有m个真实标签
Y
=
{
Y
1
,
Y
2
,
.
.
.
,
Y
m
}
Y=\{Y^{1},Y^{2},...,Y^{m}\}
Y={Y1,Y2,...,Ym}
每个样本有n个属性:
X
k
=
{
x
1
,
x
2
,
.
.
.
,
x
n
}
表
示
第
k
个
样
本
X
k
具
有
的
n
个
属
性
值
X^{k}=\{x_{1},x_{2},...,x_{n}\}表示第k个样本X^{k}具有的n个属性值
Xk={x1,x2,...,xn}表示第k个样本Xk具有的n个属性值
θ
=
{
θ
1
,
θ
2
,
.
.
.
,
θ
n
}
表
示
每
个
属
性
值
对
应
的
系
数
\theta =\{\theta_{1},\theta_{2},...,\theta_{n}\}表示每个属性值对应的系数
θ={θ1,θ2,...,θn}表示每个属性值对应的系数
假设数据集中有m个样本,每个样本有n个属性值,那么对于每个样本(这里假设是第k个样本),定义其线性回归模型:
Y
θ
(
X
k
)
=
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
=
∑
i
=
1
n
θ
i
x
i
=
θ
T
X
k
Y_{\theta}(X^{k}) =\theta_{1}x_{1}+\theta_{2}x_{2}+...+\theta_{n}x_{n}= \sum_{i =1}^{n}\theta_{i}x_{i}=\theta^{T}X^{k}
Yθ(Xk)=θ1x1+θ2x2+...+θnxn=i=1∑nθixi=θTXk
这个预测值 Y θ ( X k ) Y_{\theta}(X_{k}) Yθ(Xk)很明显是基它的系数 θ \theta θ的,那么下面就开始推导 θ \theta θ
算法推导过程
记
第
k
个
样
本
的
真
实
标
签
为
y
k
记第k个样本的真实标签为y^{k}
记第k个样本的真实标签为yk
那么第k个样本的误差为:
ε
k
=
y
k
−
Y
θ
(
X
k
)
=
y
k
−
θ
T
X
k
(1)
\varepsilon ^{k}=y^{k} - Y_{\theta}(X^{k})=y^{k} - \theta^{T}X^{k}\tag{1}
εk=yk−Yθ(Xk)=yk−θTXk(1)
误差
ε
(
k
)
\varepsilon ^{(k)}
ε(k)独立同分布,并且服从均值为0,方差为
σ
\sigma
σ的高斯分布
所以有:
P
(
ε
k
)
=
1
(
2
π
)
σ
e
x
p
(
−
(
ε
k
)
2
2
σ
2
)
(2)
P(\varepsilon^{k}) = \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(\varepsilon^{k})^{2}}{2\sigma^{2}})\tag{2}
P(εk)=(2π)σ1exp(−2σ2(εk)2)(2)
将(1)式带入(2)式,可得:
P
(
y
k
∣
X
k
;
θ
)
=
P
(
y
k
−
θ
T
X
k
)
=
1
(
2
π
)
σ
e
x
p
(
−
(
y
k
−
θ
T
X
k
)
2
2
σ
2
)
(3)
P(y^{k}|X^{k};\theta) =P(y^{k} - \theta^{T}X^{k})= \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\tag{3}
P(yk∣Xk;θ)=P(yk−θTXk)=(2π)σ1exp(−2σ2(yk−θTXk)2)(3)
上式取似然函数:
L
(
θ
)
=
∏
k
=
1
m
P
(
y
k
∣
X
k
;
θ
)
=
∏
k
=
1
m
1
(
2
π
)
σ
e
x
p
(
−
(
y
k
−
θ
T
X
k
)
2
2
σ
2
)
(4)
L(\theta)=\prod_{k=1}^{m}P(y^{k}|X^{k};\theta)=\prod_{k=1}^{m} \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\tag{4}
L(θ)=k=1∏mP(yk∣Xk;θ)=k=1∏m(2π)σ1exp(−2σ2(yk−θTXk)2)(4)
(4)式取对数:
l
o
g
L
(
θ
)
=
l
o
g
∏
k
=
1
m
1
(
2
π
)
σ
e
x
p
(
−
(
y
(
k
−
θ
T
X
k
)
2
2
σ
2
)
=
∑
k
=
1
m
l
o
g
(
1
(
2
π
)
σ
e
x
p
(
−
(
y
k
−
θ
T
X
k
)
2
2
σ
2
)
)
=
m
l
o
g
1
2
π
σ
−
1
σ
2
⋅
1
2
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
(5)
logL(\theta)=log\prod_{k=1}^{m} \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{(k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}})\\=\sum_{k=1}^{m}log( \frac{1}{\sqrt{(2\pi)}\sigma}exp(- \frac{(y^{k} - \theta^{T}X^{k})^{2}}{2\sigma^{2}}))\\=mlog\frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{\sigma^{2}}\cdot\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})\tag{5}
logL(θ)=logk=1∏m(2π)σ1exp(−2σ2(y(k−θTXk)2)=k=1∑mlog((2π)σ1exp(−2σ2(yk−θTXk)2))=mlog2πσ1−σ21⋅21k=1∑m(yk−θTXk)(5)
记
l
o
g
L
(
θ
)
=
A
+
B
,
其
中
A
=
m
l
o
g
1
2
π
σ
,
B
=
1
σ
2
⋅
1
2
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
logL(\theta)=A+B,其中A=mlog\frac{1}{\sqrt{2\pi}\sigma},B=\frac{1}{\sigma^{2}}\cdot\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})
logL(θ)=A+B,其中A=mlog2πσ1,B=σ21⋅21∑k=1m(yk−θTXk)
为了使(5)式表示的对数似然最大,A是一个常数,所以让B越小越好,这样便得到优化目标:
J
(
θ
)
=
1
2
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
2
=
1
2
∥
[
y
1
−
θ
T
X
1
y
2
−
θ
T
X
2
.
.
.
y
k
−
θ
T
X
k
]
∥
2
=
1
2
∥
[
y
1
y
2
.
.
.
y
k
]
−
θ
T
[
X
1
X
2
.
.
.
X
k
]
∥
2
=
1
2
∥
Y
−
X
θ
∥
2
=
1
2
(
Y
−
X
θ
)
T
(
Y
−
X
θ
)
(6)
J(\theta)=\frac{1}{2}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})^{2}=\frac{1}{2}\left\|\begin{bmatrix}y^{1}-\theta^{T}X^{1}\\y^{2}-\theta^{T}X^{2}\\...\\y^{k}-\theta^{T}X^{k} \end{bmatrix} \right \|^{2} =\frac{1}{2}\left\| \begin{bmatrix}y^{1}\\y^{2}\\...\\y^{k}\end{bmatrix}-\theta^{T}\begin{bmatrix}X^{1}\\X^{2}\\...\\X^{k}\end{bmatrix} \right\| ^{2} =\frac{1}{2}\left\|Y-X\theta \right\|^{2}=\\\frac{1}{2}(Y - X\theta)^{T}(Y -X\theta)\tag{6}
J(θ)=21k=1∑m(yk−θTXk)2=21∥∥∥∥∥∥∥∥⎣⎢⎢⎡y1−θTX1y2−θTX2...yk−θTXk⎦⎥⎥⎤∥∥∥∥∥∥∥∥2=21∥∥∥∥∥∥∥∥⎣⎢⎢⎡y1y2...yk⎦⎥⎥⎤−θT⎣⎢⎢⎡X1X2...Xk⎦⎥⎥⎤∥∥∥∥∥∥∥∥2=21∥Y−Xθ∥2=21(Y−Xθ)T(Y−Xθ)(6)
(6)就是最小二乘,记住这个式子,因为后面的岭回归算法,只在这块不同
对(6)式求偏导:
▽
θ
J
(
θ
)
=
▽
θ
(
1
2
(
Y
−
X
θ
)
T
(
Y
−
X
θ
)
)
=
▽
θ
(
1
2
(
Y
T
−
θ
T
X
T
)
(
Y
−
X
θ
)
)
=
▽
θ
(
1
2
(
Y
T
Y
−
θ
T
X
T
Y
−
Y
T
X
θ
+
θ
T
X
T
X
θ
)
)
=
1
2
(
2
X
T
X
θ
−
X
T
Y
−
(
Y
T
X
)
T
)
=
X
T
X
θ
−
X
T
Y
(7)
\bigtriangledown _{\theta}J(\theta)=\bigtriangledown_{\theta}(\frac{1}{2}(Y-X\theta)^{T}(Y - X\theta))=\bigtriangledown_{\theta}(\frac{1}{2}(Y^{T}-\theta^{T}X^{T})(Y-X\theta))\\=\bigtriangledown_{\theta}(\frac{1}{2}(Y^{T}Y-\theta^{T}X^{T}Y-Y^{T}X\theta+\theta^{T}X^{T}X\theta))\\=\frac{1}{2}(2X^{T}X\theta-X^{T}Y-(Y^{T}X)^{T})=X^{T}X\theta-X^{T}Y\tag{7}
▽θJ(θ)=▽θ(21(Y−Xθ)T(Y−Xθ))=▽θ(21(YT−θTXT)(Y−Xθ))=▽θ(21(YTY−θTXTY−YTXθ+θTXTXθ))=21(2XTXθ−XTY−(YTX)T)=XTXθ−XTY(7)
令(7)等于0,即
▽
θ
J
(
θ
)
=
0
\bigtriangledown _{\theta}J(\theta)=0
▽θJ(θ)=0,解得解析解
θ
=
(
X
T
X
)
−
1
X
T
Y
\theta = (X^{T}X)^{-1}X^{T}Y
θ=(XTX)−1XTY
如此看来,为了得到最优的
θ
\theta
θ,需要求矩阵的逆,那么问题就来了,不是所有的矩阵都可以求逆的,所以需要使用梯度下降法得到
θ
\theta
θ。
梯度下降
在上面算法推导到最小二乘公式那块,依然对其求导,但使用梯度下降法(如果关于梯度下降法不清晰,请立即百度),更新参数 θ \theta θ:
优化目标:
J
(
θ
)
=
1
2
m
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
2
=
1
2
(
Y
−
θ
T
X
)
T
(
Y
−
θ
T
X
)
(8)
J(\theta)=\frac{1}{2m}\sum_{k=1}^{m}(y^{k}- \theta^{T}X^{k})^{2}=\frac{1}{2}(Y - \theta^{T}X)^{T}(Y -\theta^{T}X)\tag{8}
J(θ)=2m1k=1∑m(yk−θTXk)2=21(Y−θTX)T(Y−θTX)(8)
注:(8)式与(6)式的不同
令
θ
j
表
示
n
个
θ
中
第
j
个
θ
(
n
个
属
性
一
定
有
n
个
θ
,
这
块
要
想
明
白
,
不
然
算
法
实
现
有
点
费
劲
)
令\theta_{j}表示n个\theta中第j个\theta(n个属性一定有n个\theta ,这块要想明白,不然算法实现有点费劲)
令θj表示n个θ中第j个θ(n个属性一定有n个θ,这块要想明白,不然算法实现有点费劲)
1、批量梯度下降(GD)
∂
J
(
θ
)
∂
θ
j
=
−
1
m
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
X
j
k
(9)
\frac{\partial J(\theta)}{\partial \theta_{j}} =-\frac{1}{m}\sum_{k=1}^{m}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{9}
∂θj∂J(θ)=−m1k=1∑m(yk−θTXk)Xjk(9)
更新参数
θ
j
\theta_{j}
θj:
θ
j
‘
=
θ
j
+
α
m
∑
k
=
1
m
(
y
k
−
θ
T
X
k
)
X
j
k
(10)
\theta_{j}^{`}=\theta_{j}+\frac{\alpha}{m}\sum_{k=1}^{m}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{10}
θj‘=θj+mαk=1∑m(yk−θTXk)Xjk(10)
批量梯度下降的缺点:由(10)(下图圈中部分)可以看出,每个参数更新一次,都会动用全部数据集,所以速度很慢;
优点:容易得到最优解。
2、随机梯度下降(SGD)
更新参数
θ
j
\theta_{j}
θj:
θ
j
‘
=
θ
j
+
(
y
k
−
θ
T
X
k
)
X
j
k
(11)
\theta_{j}^{`}=\theta_{j}+(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{11}
θj‘=θj+(yk−θTXk)Xjk(11)
优点:每次找一个样本,迭代速度很快
缺点:不一定每次都能朝着收敛的方向
3、小批量梯度下降法(MBGD)
批量随机下降很慢,随机梯度下降又很不准,那么综合这两个,提出小批量梯度下降:
θ
j
‘
=
θ
j
−
α
1
n
u
m
∑
k
=
i
i
+
n
u
m
(
y
k
−
θ
T
X
k
)
X
j
k
(12)
\theta_{j}^{`}=\theta_{j}-\alpha \frac{1}{num}\sum_{k=i}^{i+num}(y^{k}-\theta^{T}X^{k})X_{j}^{k}\tag{12}
θj‘=θj−αnum1k=i∑i+num(yk−θTXk)Xjk(12)
α
是
更
新
步
长
,
学
习
率
;
n
u
m
是
需
要
指
定
的
需
要
选
择
参
加
计
算
的
样
本
个
数
,
一
般
取
2
的
指
数
,
64
、
128
等
\alpha是更新步长,学习率;num是需要指定的需要选择参加计算的样本个数,一般取2的指数,64、128等
α是更新步长,学习率;num是需要指定的需要选择参加计算的样本个数,一般取2的指数,64、128等
这样的话每次更新选择一小部分数据来算,实用!
代码实现
使用求逆矩阵的方法:
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))
for j in range(m): #next 2 lines create weights matrix
diffMat = testPoint - xMat[j,:] #
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws