线性回归(Linear regression)

55 阅读5分钟

1、线性回归

定义:线性回归是一种用于建立变量之间线性关系的统计模型。它试图找到一个线性函数,使得该函数能够最好地描述自变量(解释变量)与因变量(响应变量)之间的关系,从而可以根据自变量的值来预测或解释因变量的值。

2、线性回归主要数学公式

线性回归主要是将训练数据拟合成一个多元线性函数,若需要拟合的数据有n个特征属性值,有m个数据,一个标签,那么线性回归就将其拟合成一个n元线性函数hθ(x0i,x1i,x2i,...,xji)=hθ(xi)=(θ)Txih_\theta(x_0^i,x_1^i,x_2^i,...,x_j^i)=h_\theta(\vec{x^i})=(\vec{\theta})^T\cdot\vec{x^i}(其中xi=(x0i,x1i,x2i,x3i,...,xji)T,θ=(θ0,θ1,θ2,θ3,...,θj)T\vec{x^i}=(x^i_0,x^i_1,x^i_2,x^i_3,...,x^i_j)^T,\vec{\theta}=(\theta_0,\theta_1,\theta_2,\theta_3,...,\theta_j)^T,i表示第i个数据,总共有m个,i=1,2,3,...,m,j表示第j个特征值,总共有n个,j=0,1,2,3,...,n,其中第0个特征认为是线性函数的常数项,故x0ix_0^i恒等于1),比如:现有三个属性:房子面积x1x_1,房子楼层x2x_2,房子地段x3x_3。一个标签:房子价格yy。那么线性回归拟合的线性函数为:y=θ1x1+θ2x2+θ3x3+θ0y=\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_0,其中θ0,θ1,θ2,θ3\theta_0,\theta_1,\theta_2,\theta_3为拟合的目标,通过梯度下降找到最佳的θj\theta_j

使用梯度下降进行优化损失函数,使得损失函数最小:

目标损失函数:J(θ)=12mi=1m(yihθ(xi))2J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))^2
梯度下降公式:J(θ)θj=1mi=1m(yihθ(xi))xji\frac{\partial J(\theta)}{\partial \theta_j}=-\frac{1}{m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))x^i_j
批量梯度下降:随机找到一个初始θj\theta_j(j是每个特征对应的j,如x1x_1对应的j是1)然后逐步更新θj\theta_j,根据以下公式θj=θjJ(θ)θj\theta^{'}_j=\theta_j-\frac{\partial J(\theta)}{\partial \theta_j}直到找到最小的θj\theta_j(每一个θj\theta_j同时更新)
随机梯度下降:随机找到一个初始θj\theta_j(j是每个属性对应的j,如x1x_1对应的j是1)然后逐步更新θj\theta_j,根据以下公式θj=θj+(yihθ(xi))xji\theta^{'}_j=\theta_j+(y^i-h_\theta(x^i))x_j^i直到找到最小的θj\theta_j(每一个θj\theta_j同时更新)
小批量梯度下降(一般用这个):随机找到一个初始θj\theta_j(j是每个属性对应的j,如x1x_1对应的j是1)然后逐步更新θj\theta_j,根据以下公式θj=θjαJ(θ)θj\theta^{'}_j=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}(α\alpha为学习率)直到找到最小的θj\theta_j(每一个θj\theta_j同时更新)

3、真实数据展示

数据说明:五组数据,每组数据有4个特征值:

特征值1特征值2特征值3特征值4标签
1.22.53.74.112.3
2.13.24.55.316.8
3.34.75.96.220.5
4.25.16.77.324.8
5.46.37.28.129.6

以小批量梯度下降为准,特征值1,特征值2,特征值3,特征值4为x1,x2,x3,x4x_1,x_2,x_3,x_4,标签为yy,目标:找到一个函数:y=θ1x1+θ2x2+θ3x3+θ4x4+θ0y=\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_4x_4+\theta_0,于是假设初始θ1=1,θ2=1,θ3=1,θ4=1,θ0=1,α=0.1\theta_1=1,\theta_2=1,\theta_3=1,\theta_4=1,\theta_0=1,\alpha=0.1,于是,以更新θ1\theta_1为例,J(θ)θ1=1mi=1m(yihθ(xi))x1i=15((12.3(1×1.2+1×2.5+1×3.7+1×4.1+1))×1.2+(16.8(1×2.1+1×3.2+1×4.5+1×5.3))×2.1+(20.5(1×3.3+1×4.7+1×5.9+1×6.2))×3.3+(24.8(1×4.2+1×5.1+1×6.7+1×7.3))×4.2+(29.6(1×5.4+1×6.3+1×7.2+1×8.1))×5.4)=1.998\frac{\partial J(\theta)}{\partial \theta_1}=-\frac{1}{m}\sum_{i=1}^{m}(y^i-h_\theta(x^i))x^i_1=-\frac{1}{5}((12.3-(1\times1.2+1\times2.5+1\times3.7+1\times4.1+1))\times1.2+(16.8-(1\times2.1+1\times3.2+1\times4.5+1\times5.3))\times2.1+(20.5-(1\times3.3+1\times4.7+1\times5.9+1\times6.2))\times3.3+(24.8-(1\times4.2+1\times5.1+1\times6.7+1\times7.3))\times4.2+(29.6-(1\times5.4+1\times6.3+1\times7.2+1\times8.1))\times5.4)=-1.998,按照小批量梯度下降公式可得θ1=θ1αJ(θ)θ1=10.1×(1.998)=1.1998\theta^{'}_1=\theta_1-\alpha\frac{\partial J(\theta)}{\partial \theta_1}=1-0.1\times(-1.998)=1.1998,同时,按照此θ1\theta_1更新,更新θ0,θ2,θ3,θ4\theta_0,\theta_2,\theta_3,\theta_4(在更新θ0\theta_0时,将所有xji=1x^i_j=1),于是,就得到了第一次更新的θ0,θ1,θ2,θ3,θ4\theta_0,\theta_1,\theta_2,\theta_3,\theta_4,接下来,更新n次,使得J(θ)J(\theta)最小。

代码实现:

import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[1.2,2.5,3.7,4.1],
              [2.1,3.2,4.5,5.3],
              [3.3,4.7,5.9,6.2],
              [4.2,5.1,6.7,7.3],
              [5.4,6.3,7.2,8.1]])
y = np.array([[12.3],[16.8],[20.5],[24.8],[29.6]])
reg = LinearRegression()
reg.fit(X,y)
w_ =np.array(reg.coef_)
w = w_.flatten()
b = np.array(reg.intercept_)
print(w)
print(b)

结果:

在这里插入图片描述

4、多项式回归

定义:多项式线性回归是线性回归的一种扩展,通过引入特征的高次项(如x2x^2,x3x^3,...)来拟合非线性关系。虽然输入特征被非线性变换,但模型对参数θ\theta仍然是线性的,即将原本的n个属性通过两两组合的方式变成i=1i=kCn+i1i\sum_{i=1}^{i=k}C_{n+i-1}^i个属性,其中k扩展的最高次项的次数,比如:有三个属性:x1,x2,x3x_1,x_2,x_3,将其扩展到最高次项的次数为2,那么,它就变成Cn1+Cn+12=C31+C3+12=9C_{n}^1+C_{n+1}^2=C_{3}^1+C_{3+1}^2=9项,分别为:x1,x2,x3,x12,x22,x32,x1x2,x1x3,x2x3x_1,x_2,x_3,x_1^2,x_2^2,x_3^2,x_1x_2,x_1x_3,x_2x_3,最后把这9项当成9个属性作线性回归,就得到了多项式线性回归的函数。

5、正则化

1)lasso回归:

Lasso 回归,即最小绝对收缩和选择算子回归(Least Absolute Shrinkage and Selection Operator),是一种用于线性回归模型的正则化方法,为的是防止过拟合,即回归曲线完美拟合训练数据,但是对测试数据效果预测效果不理想的情况。lasso回归增加了惩罚项:λj=1nθj\lambda\sum_{j=1}^{n}\left|\theta_j\right|(n表示特征数量)。于是,目标损失函数就变成:J(θ)=12mi=1m(yihθ(xi))2+λj=1nθjJ^{'}(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))^2+\lambda\sum_{j=1}^{n}\left|\theta_j\right|,对于该损失函数的优化,使用坐标轴下降法(coordinate descent)优化θ0\theta_0不需要正则优化,步骤如下:
1.把目标损失函数展开: J(θ)=12mi=1m(yihθ(xi))2+λj=1nθj=12mi=1m(j=1nθjxji+θ0yi)2+λj=1nθjJ^{'}(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))^2+\lambda\sum_{j=1}^{n}\left|\theta_j\right|=\frac{1}{2m}\sum_{i=1}^{m}(\sum_{j=1}^{n}\theta_jx^i_j+\theta_0-y^i)^2+\lambda\sum_{j=1}^{n}\left|\theta_j\right|
2.固定其他θj\theta_j,先优化其中的θl\theta_ll[1,n]l\in[1,n],求其对于θl\theta_l的偏导数: J(θ)θl=1mi=1m(j=1nθjxji+θ0yi)xli+λθlθl=1mi=1m(j=1,jlnθjxji+θ0yi+θlxli)xli+λθlθl=1mi=1m(j=1,jlnθjxji+θ0yi)+1mi=1mθl(xli)2+λθlθl\frac{\partial J(\theta)}{\partial \theta_l}=\frac{1}{m}\sum_{i=1}^{m}(\sum_{j=1}^{n}\theta_jx^i_j+\theta_0-y^i)x^i_l+\lambda\frac{\partial\left|\theta_l\right|}{\partial\theta_l}=\frac{1}{m}\sum_{i=1}^{m}(\sum_{j=1,j\neq l}^{n}\theta_jx^i_j+\theta_0-y^i+\theta_lx^i_l)x^i_l+\lambda\frac{\partial\left|\theta_l\right|}{\partial\theta_l}=\frac{1}{m}\sum_{i=1}^{m}(\sum_{j=1,j\neq l}^{n}\theta_jx^i_j+\theta_0-y^i)+\frac{1}{m}\sum_{i=1}^{m}\theta_l(x^i_l)^2+\lambda\frac{\partial\left|\theta_l\right|}{\partial\theta_l}(正则项 λθlθl\lambda\frac{\partial\left|\theta_l\right|}{\partial\theta_l} 需要分情况讨论),由于先固定除θl\theta_l之外的其他θj\theta_j故把第一项1mi=1m(j=1,jlnθjxji+θ0yi)\frac{1}{m}\sum_{i=1}^{m}(\sum_{j=1,j\neq l}^{n}\theta_jx^i_j+\theta_0-y^i)当作常数,作记号为ClC_l,第二项1mi=1mθl(xli)2\frac{1}{m}\sum_{i=1}^{m}\theta_l(x^i_l)^2是优化项,将1mi=1m(xli)2\frac{1}{m}\sum_{i=1}^{m}(x^i_l)^2 作记号为 AlA_l,显然 Al>0A_l>0,一般情况下不太可能等于0,于是认为它是大于0的,于是原式就变J(θ)θl=Cl+Alθl+λθlθl\frac{\partial J(\theta)}{\partial \theta_l}=C_l+A_l\theta_l+\lambda\frac{\partial\left|\theta_l\right|}{\partial\theta_l}
3.分情况讨论J(θ)θl\frac{\partial J(\theta)}{\partial \theta_l}:
a.当θl>0\theta_l>0时,J(θ)θl=Cl+Alθl+λ\frac{\partial J(\theta)}{\partial \theta_l}=C_l+A_l\theta_l+\lambda (θl=θl\left|\theta_l\right|=\theta_l)
b.当θl<0\theta_l<0时,J(θ)θl=Cl+Alθlλ\frac{\partial J(\theta)}{\partial \theta_l}=C_l+A_l\theta_l-\lambda (θl=θl\left|\theta_l\right|=-\theta_l)
c.当θl=0\theta_l=0时,J(θ)θl[Cl+Alθlλ,Cl+Alθl+λ]\frac{\partial J(\theta)}{\partial \theta_l}\in [C_l+A_l\theta_l-\lambda,C_l+A_l\theta_l+\lambda] (θlθlθl0=Cl+Alθlλ,θlθlθl0+=Cl+Alθl+λ\left.\frac{\partial\left|\theta_l\right|}{\partial \theta_l}\right|_{\theta_l\to0^-}=C_l+A_l\theta_l-\lambda,\left.\frac{\partial\left|\theta_l\right|}{\partial \theta_l}\right|_{\theta_l\to0^+}=C_l+A_l\theta_l+\lambda)
4.另偏导数J(θ)θl=0\frac{\partial J(\theta)}{\partial \theta_l}=0 解得:
a.当θl>0\theta_l>0时,θl=ClλAl>0\theta_l=\frac{-C_l-\lambda}{A_l}>0因为 Al>0A_l>0Clλ>0-C_l-\lambda>0,即 Cl<λC_l<-\lambda
b.当θl<0\theta_l<0时,θl=λClAl<0\theta_l=\frac{\lambda-C_l}{A_l}<0因为 Al>0A_l>0λCl<0\lambda-C_l<0,即 Cl>λC_l>\lambda
c.当θl=0\theta_l=0时,Cl[λ,λ]C_l\in [-\lambda,\lambda]
5.最终θl\theta_l更新的结论:
a.当Cl<λC_l<-\lambda时,θl=ClλAl\theta_l=\frac{-C_l-\lambda}{A_l}
b.当Cl>λC_l>\lambda时,θl=λClAl\theta_l=\frac{\lambda-C_l}{A_l}
c.当Cl[λ,λ]C_l\in [-\lambda,\lambda]时,θl=0\theta_l=0
6.最终所有的θj\theta_j更新: 将ll1,2,3,4,...,n1,2,3,4,...,n,每次取ll为其中一个值,固定其他值,直至所有的除θ0\theta_0外的θj\theta_j都更新,最后就得到最优解
7.对于θ0\theta_0的更新:因为正则项里面θj\theta_jjj是从11nn,所以更新θ0\theta_0的方法与没有正则项的目标损失函数一样的优化。

2)岭回归:

岭回归(Ridge Regression)是一种用于处理线性回归模型中多重共线性问题的有偏估计方法,与lasso回归一样,都是为了防止过拟合,于是增加了惩罚项:λ2j=1nθj2\frac{\lambda}{2}\sum_{j=1}^{n}\theta_j^2(n表示特征数量)。于是,目标损失函数就变成:J(θ)=12mi=1m(yihθ(xi))2+λ2j=1nθj2J^{'}(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))^2+\frac{\lambda}{2}\sum_{j=1}^{n}\theta_j^2,想要优化损失函数,使用梯度下降法找到最优的θ=(θ0,θ1,θ2,...,θn)\vec{\theta}=(\theta_0,\theta_1,\theta_2,...,\theta_n),其中θ0\theta_0不需要正则优化。于是,使用小批量梯度下降,θj=θjαJ(θ)θj=θjα(1mi=1m(yihθ(xi))xji+λθj)=θjα(1mi=1m(hθ(xi)yi))xji+λθj)=(1αλ)θjα(1mi=1m(hθ(xi)yi))xji)=(1αλ)θjαJ(θ)θj\theta^{'}_j=\theta_j-\alpha\frac{\partial J^{'}(\theta)}{\partial \theta_j}=\theta_j-\alpha(-\frac{1}{m}\sum_{i=1}^{m}(y^i-h_\theta(\vec{x^i}))x^i_j+\lambda\theta_j)=\theta_j-\alpha(\frac{1}{m}\sum_{i=1}^{m}(h_\theta(\vec{x^i})-y^i))x^i_j+\lambda\theta_j)=(1-\alpha\lambda)\theta_j-\alpha(\frac{1}{m}\sum_{i=1}^{m}(h_\theta(\vec{x^i})-y^i))x^i_j)=(1-\alpha\lambda)\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j},其中1αλ1-\alpha\lambda 是正则项。对于θ0\theta_0的更新,因为正则项里面θj\theta_jjj是从11nn,所以更新θ0\theta_0的方法与没有正则项的目标损失函数一样的优化。