线性模型
算法思想
线性回归模型旨在寻找一条直线或者一个平面,使得所有数据样本都尽可能接近这条直线或者平面,以此当新的数据样品出现时,可以用得到的模型结果进行预测。而线性分类模型旨在找到一条直线或者一个平面,是的这个直线或者平面能够分割开不同类别的数据样本。
2. 数学建模
线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。
其中,
x
1
,
x
2
,
⋅
⋅
⋅
,
x
n
x_1,x_2,⋅⋅⋅,x_n
x1,x2,⋅⋅⋅,xn表示自变量(特征分量),
y
y
y表示因变量,
θ
i
θ_i
θi表示对应自变量(特征)的权重,
θ
0
\theta_0
θ0是偏置项(又称为截距),不难发现,对于参数
θ
i
\theta_i
θi反映自变量xi对因变量y的影响程度,
θ
i
\theta_i
θi越大,说明
x
i
x_i
xi对结果
y
i
y_i
yi的影响越大。如果令
x
0
x_0
x0=1,y=
h
θ
(
x
)
h_\theta(x)
hθ(x),可以将上述模型写成向量形式得:
其中
θ
=
(
θ
0
,
θ
1
,
⋅
⋅
⋅
,
θ
n
)
,
x
=
(
1
(
x
0
)
,
x
1
,
x
2
,
⋅
⋅
⋅
,
x
n
)
θ=(θ_0,θ_1,⋅⋅⋅,θ_n),x=(1(x_0),x_1,x_2,⋅⋅⋅,x_n)
θ=(θ0,θ1,⋅⋅⋅,θn),x=(1(x0),x1,x2,⋅⋅⋅,xn)均为向量,
θ
T
θ^{T}
θT为
θ
θ
θ的转置。
误差
线性回归作为拟合尽量接近于真实情况的模型,误差必定存在,所以即有
y
i
=
θ
T
x
+
ϵ
i
y_i= θ^{T}x+\epsilon_i
yi=θTx+ϵi
其中
ϵ
i
\epsilon_i
ϵi为误差值,
y
i
y_i
yi为真实,
θ
T
x
θ^{T}x
θTx为预测值。那么我们不难发现,如果想要预测的结果尽可能接近真实值,那么误差就应该达到最小。在建立模型时,我们假设误差
ϵ
i
\epsilon_i
ϵi满足
- 独立并且具有相同的分布,并且服从均值为0,方差 θ 2 θ^{2} θ2的高斯分布
由上式得
ϵ
i
=
y
i
−
θ
T
x
\epsilon_i= y_i-θ^{T}x
ϵi=yi−θTx
因为误差服从高斯分布(正态分布)我们由此可得出:
利用极大似然估计法求参数
θ
θ
θ
对数似然,把极大似然中连乘转换为求和,减少运算量。(由
l
o
g
A
∗
B
=
l
o
g
A
+
l
o
g
B
logA*B = logA + logB
logA∗B=logA+logB)
若要实现极大似然估计,从上图的对数似然 估计的式子中可以知道,若要实现极大似然估计,对数似然估计必须取最大值,因为log函数是单调递增函数;而途中波浪线标注的量均为常数,意味需要
1
2
∑
i
=
1
m
(
y
i
−
θ
T
x
i
)
2
\frac{1}{2}\sum_{i=1}^{m}(y_i-θ^{T}x_i)^{2}
21∑i=1m(yi−θTxi)2取最小。
令
m
i
n
J
θ
=
1
2
∑
i
=
1
m
(
y
i
−
θ
T
x
i
)
2
min J_θ = \frac{1}{2}\sum_{i=1}^{m}(y_i-θ^{T}x_i)^{2}
minJθ=21i=1∑m(yi−θTxi)2
以此作为模型的目标函数,得到目标函数后,可以用最小二乘法,梯度下降法,牛顿法,拟牛顿法进行求解优化。
最小二乘法
将m个n维样本组成矩阵X:
则目标函数的矩阵形式为
m
i
n
J
θ
=
1
2
∑
i
=
1
m
(
y
i
−
θ
T
x
i
)
2
=
1
2
(
X
θ
−
y
)
T
(
X
θ
−
y
)
min J_θ = \frac{1}{2}\sum_{i=1}^{m}(y_i-θ^{T}x_i)^{2}= \frac{1}{2}(Xθ-y)^{T}(Xθ-y)
minJθ=21i=1∑m(yi−θTxi)2=21(Xθ−y)T(Xθ−y)
对目标函数进行最小二乘法求解:
对
θ
θ
θ进行求导:
最后得到
θ
θ
θ关于样本数据属性和标签的表达式
θ
=
(
X
T
X
)
−
1
X
T
y
θ=(X^{T}X)^{-1}X^{T}y
θ=(XTX)−1XTy
梯度下降法
梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是 ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z ) T ( \frac{∂f}{∂x}, \frac{∂f}{∂y},\frac{∂f}{∂z})^{T} (∂x∂f,∂y∂f,∂z∂f)T,以此类推。
那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数 f ( x , y ) f(x,y) f(x,y),在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),沿着梯度向量的方向就是 ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T (\frac{∂f}{∂x_0}, \frac{∂f}{∂y_0})^{T} (∂x0∂f,∂y0∂f)T的方向是 f ( x , y ) f(x,y) f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 − ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T -(\frac{∂f}{∂x_0}, \frac{∂f}{∂y_0})^{T} −(∂x0∂f,∂y0∂f)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。
梯度下降
梯度下降法是按下面的流程进行的:
- 1)首先对θ赋值,这个值可以是随机的,也可是让θ是一个全零的向量;
- 2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。
直观点理解即为一个人在山顶上想要下山,那怎么走才是下山的正确方向呢?按照人的既有思维,肯定是后一步比前一步走到了山的更低才是对的。那么梯度下降算法就是实现了这么一个思想,算法提供了下山的方向(梯度)以及每一步走多远的距离,直到下到山脚(最小值)就可以停止了。而梯度上升思想也一致,只是要上山(寻找最大值),是梯度下降的反向过程。
算法模型
1.目标函数:
m
i
n
J
θ
=
1
2
∑
i
=
1
m
(
y
i
−
θ
T
x
i
)
2
min J_θ = \frac{1}{2}\sum_{i=1}^{m}(y_i-θ^{T}x_i)^{2}
minJθ=21i=1∑m(yi−θTxi)2
2.向量可以初始化为默认值,或者调优后的值。算法终止距离ε,步长α
3.算法过程:
1)确定当前位置的损失函数的梯度,对于θ向量,其梯度表达式如下:
∂
∂
θ
J
(
θ
)
\frac{∂}{∂θ}J(θ)
∂θ∂J(θ)
2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即
α
∂
∂
θ
J
(
θ
)
α\frac{∂}{∂θ}J(θ)
α∂θ∂J(θ)对应于前面登山例子中的某一步。
3)确定θ向量里面的每个值,梯度下降的距离都小于
ε
ε
ε,如果小于
ε
ε
ε则算法终止,当前
θ
θ
θ向量即为最终结果。否则进入步骤4.
4)更新
θ
θ
θ向量,其更新表达式如下。更新完毕后继续转入步骤1.
θ
=
θ
−
α
∂
∂
θ
J
(
θ
)
θ=θ−α\frac{∂}{∂θ}J(θ)
θ=θ−α∂θ∂J(θ)
算法流程图:
批量梯度下降法(BGD)
可以看出,参数θ的值每更新一次都要遍历样本集中的所有的样本,得到新的
θ
j
θ_j
θj,看是否满足阈值要求,若满足,则迭代结束,根据此值就可以得到;否则继续迭代。注意到,虽然梯度下降法易受到极小值的影响,但是一般的线性规划问题只有一个极小值,所以梯度下降法一般可以收敛到全局的最小值。更新公式为:
θ
=
θ
−
α
∂
∂
θ
J
(
θ
)
θ=θ−α\frac{∂}{∂θ}J(θ)
θ=θ−α∂θ∂J(θ)
随机梯度下降算法(SGD)
在这个算法中,我们每次更新只用到一个训练样本,若根据当前严格不能进行迭代得到一个,此时会得到一个,有新样本进来之后,在此基础上继续迭代,又得到一组新的和,以此类推。更新公式为:
θ
i
=
θ
−
α
∂
∂
θ
J
(
θ
)
(
j
)
=
θ
i
−
α
(
h
θ
(
x
0
(
j
)
,
x
1
(
j
)
,
.
.
.
x
n
(
j
)
−
y
j
)
x
i
(
j
)
θ_i=θ−α\frac{∂}{∂θ}J(θ)^{(j)} =θ_i−α(h_θ(x_0^{(j)},x_1^{(j)},...x_n^{(j)} −y_j)x_i^{(j)}
θi=θ−α∂θ∂J(θ)(j)=θi−α(hθ(x0(j),x1(j),...xn(j)−yj)xi(j)
两个算法总结:
批量梯度下降法,每更新一次,需要用到样本集中的所有样本;随机梯度下降法,每更新一次,只用到训练集中的一个训练样本,所以一般来说,随机梯度下降法能更快地使目标函数达到最小值(新样本的加入,随机梯度下降法有可能会使目标函数突然变大,迭代过程中在变小。所以是在全局最小值附近徘徊,但对于实际应用俩说,误差完全能满足要求)。另外,对于批量梯度下降法,如果样本集增加了一些训练样本,就要重新开始迭代。由于以上原因,当训练样本集较大时,一般使用随机梯度下降法。那么,有没有一个中庸的办法能够结合两种方法的优点呢?有!这就是小批量梯度下降法。
小批量梯度下降法
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<xm。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:
θ
i
=
θ
i
−
α
∑
j
=
1
t
+
x
−
1
(
x
0
(
j
)
,
x
1
(
j
)
,
.
.
.
x
n
(
j
)
−
y
j
)
x
i
(
j
)
θ_i=θ_i−α\sum_{j=1}^{t+x-1}(x_0^{(j)},x_1^{(j)},...x_n^{(j)}−y_j)x_i^{(j)}
θi=θi−αj=1∑t+x−1(x0(j),x1(j),...xn(j)−yj)xi(j)
梯度下降法和其他无约束优化算法的比较
在机器学习中的无约束优化算法,除了梯度下降以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。
梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
python实现
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
# 导入sklearn官方数据集
diabetes = datasets.load_diabetes()
# 只使用一个特征
diabetes_X = diabetes.data[:, np.newaxis, 2]
# 切分属性集的测试集与训练集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# 切分标签的测试集与训练集
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
# 创建线性回归模型对象
regr = linear_model.LinearRegression()
# 训练
regr.fit(diabetes_X_train, diabetes_y_train)
# 预测
diabetes_y_pred = regr.predict(diabetes_X_test)
# The coefficients
print('回归系数: \n', regr.coef_)
# The mean squared error
print("均方误差: %.2f"
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# 方差得分
print('方差得分: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
程序结果: