线性回归
线性回归试图学得一个线性模型以尽可能准确地预测实值输出标记;
1、模型
其向量形式:
2、策略
下面将使用最简单的形式来分析线性回归:
y=w∗x+b
y
=
w
∗
x
+
b
1、绝对值损失函数
Loss=|y0−y′|={y0−y′,y′−y0,y0>y′y0≤y′ L o s s = | y 0 − y ′ | = { y 0 − y ′ , y 0 > y ′ y ′ − y 0 , y 0 ≤ y ′
以 y0>y′ y 0 > y ′ 为例,对参数w,b进行导数:
dErrordw=y0−w∗x0−bdw=−x0 d E r r o r d w = y 0 − w ∗ x 0 − b d w = − x 0
dErrordb=y0−w∗x0−bdb=−1 d E r r o r d b = y 0 − w ∗ x 0 − b d b = − 1
根据梯度下降进行更新参数w,b:
w=w−(−x0)=w+x0 w = w − ( − x 0 ) = w + x 0b=b−(−1)=b+1 b = b − ( − 1 ) = b + 1
由上述的更新函数可知,参数w的变化量与 x0 x 0 的值有关,当 x0 x 0 的值很大时,w的变化也很大,这时就有可能会出现梯度爆炸;参数b的变化量是一个固定值1,但如果b本来就很小,那1相对于b来说也是一个大值,因此也有可能会出现梯度爆炸;为解决梯度爆炸的问题,需要添加一个学习率 λ λ ; λ λ 值不能太小,不然会出现梯度消失的情况。
最终得到更新函数:
y=(w+λ∗x0)∗x+(b+λ) y = ( w + λ ∗ x 0 ) ∗ x + ( b + λ )
2、平方损失函数
Loss=12(y0−y′)2 L o s s = 1 2 ( y 0 − y ′ ) 2
注:为什么会有个 12 1 2 的系数?为了在导数后消除系数。
对参数w,b进行导数:
dErrordw=d12(y0−w∗x0−b)2dw=12∗2∗(y0−w∗x0−b)∗(−x0)=−(y0−y′)∗x0 d E r r o r d w = d 1 2 ( y 0 − w ∗ x 0 − b ) 2 d w = 1 2 ∗ 2 ∗ ( y 0 − w ∗ x 0 − b ) ∗ ( − x 0 ) = − ( y 0 − y ′ ) ∗ x 0dErrordb=d12(y0−w∗x0−b)2db=12∗2∗(y0−w∗x0−b)∗(−1)=−(y0−y′) d E r r o r d b = d 1 2 ( y 0 − w ∗ x 0 − b ) 2 d b = 1 2 ∗ 2 ∗ ( y 0 − w ∗ x 0 − b ) ∗ ( − 1 ) = − ( y 0 − y ′ )
根据梯度下降进行更新参数w,b:
w=w−λ(−(y0−y′)∗x0)=w+λ∗x0∗(y0−y) w = w − λ ( − ( y 0 − y ′ ) ∗ x 0 ) = w + λ ∗ x 0 ∗ ( y 0 − y )
b=b−λ(−(y0−y′))=b+λ∗(y0−y) b = b − λ ( − ( y 0 − y ′ ) ) = b + λ ∗ ( y 0 − y )
最终得到更新函数:
y=(w+λ∗x0∗(y0−y))∗x+(b+λ∗(y0−y)) y = ( w + λ ∗ x 0 ∗ ( y 0 − y ) ) ∗ x + ( b + λ ∗ ( y 0 − 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)