机器学习 线性回归(LinearRegression)

线性模型

算法思想

线性回归模型旨在寻找一条直线或者一个平面,使得所有数据样本都尽可能接近这条直线或者平面,以此当新的数据样品出现时,可以用得到的模型结果进行预测。而线性分类模型旨在找到一条直线或者一个平面,是的这个直线或者平面能够分割开不同类别的数据样本。
在这里插入图片描述
在这里插入图片描述

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 logAB=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} 21i=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=1m(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=1m(yiθTxi)2=21XθyTXθ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} (xf,yfzf)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} (x0f,y0f)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} (x0f,y0f)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=1m(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=1t+x1(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()

程序结果:
在这里插入图片描述

参考资料:

机器学习算法系列(2):线性回归
梯度下降(Gradient Descent)小结

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值