线性回归
线性回归试图学得一个线性模型以尽可能准确地预测实值输出标记;
1、模型
其向量形式:
2、策略
下面将使用最简单的形式来分析线性回归:
y=w∗x+by=w∗x+b
1、绝对值损失函数

Loss=|y0−y′|={y0−y′,y′−y0,y0>y′y0≤y′Loss=|y0−y′|={y0−y′,y0>y′y′−y0,y0≤y′
以y0>y′y0>y′为例,对参数w,b进行导数:
dErrordw=y0−w∗x0−bdw=−x0dErrordw=y0−w∗x0−bdw=−x0
dErrordb=y0−w∗x0−bdb=−1dErrordb=y0−w∗x0−bdb=−1
根据梯度下降进行更新参数w,b:
w=w−(−x0)=w+x0w=w−(−x0)=w+x0b=b−(−1)=b+1b=b−(−1)=b+1
由上述的更新函数可知,参数w的变化量与x0x0的值有关,当x0x0的值很大时,w的变化也很大,这时就有可能会出现梯度爆炸;参数b的变化量是一个固定值1,但如果b本来就很小,那1相对于b来说也是一个大值,因此也有可能会出现梯度爆炸;为解决梯度爆炸的问题,需要添加一个学习率λλ;λλ值不能太小,不然会出现梯度消失的情况。
最终得到更新函数:
y=(w+λ∗x0)∗x+(b+λ)y=(w+λ∗x0)∗x+(b+λ)
2、平方损失函数

Loss=12(y0−y′)2Loss=12(y0−y′)2
注:为什么会有个1212的系数?为了在导数后消除系数。
对参数w,b进行导数:
dErrordw=d12(y0−w∗x0−b)2dw=12∗2∗(y0−w∗x0−b)∗(−x0)=−(y0−y′)∗x0dErrordw=d12(y0−w∗x0−b)2dw=12∗2∗(y0−w∗x0−b)∗(−x0)=−(y0−y′)∗x0dErrordb=d12(y0−w∗x0−b)2db=12∗2∗(y0−w∗x0−b)∗(−1)=−(y0−y′)dErrordb=d12(y0−w∗x0−b)2db=12∗2∗(y0−w∗x0−b)∗(−1)=−(y0−y′)
根据梯度下降进行更新参数w,b:
w=w−λ(−(y0−y′)∗x0)=w+λ∗x0∗(y0−y)w=w−λ(−(y0−y′)∗x0)=w+λ∗x0∗(y0−y)
b=b−λ(−(y0−y′))=b+λ∗(y0−y)b=b−λ(−(y0−y′))=b+λ∗(y0−y)
最终得到更新函数:
y=(w+λ∗x0∗(y0−y))∗x+(b+λ∗(y0−y))y=(w+λ∗x0∗(y0−y))∗x+(b+λ∗(y0−y))
3、算法
以平方损失函数、小批量梯度下降为例:
1、随机初始化参数w、b值;
2、计算损失函数:
3、更新参数:
4、重复2、3、4步,直到w、b的变化量均小于阀值(该阀值在sklearn内部框架中已经设定,不需要手工操作)。
4、小批量梯度下降
随机梯度下降:逐个地在每个数据点应用平方(或绝对)误差,并重复这一流程很多次。
批量梯度下降:同时在每个数据点应用平方(或绝对)误差,并重复这一流程很多次。
以上两种方法在实际运用中不常用,因为,如果你的数据十分庞大,两种方法的计算速度都将会很缓慢。线性回归的最佳方式是将数据拆分成很多小批次。每个批次都大概具有相同数量的数据点。然后使用每个批次更新权重。这种方法叫做小批次梯度下降法。
5、绝对损失函数VS平方损失函数

如上图,A、B、C三条直线的绝对损失函数一样,其中B的平方损失函数最低。
6、scikit-learn中的线性回归
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_values, y_values)