线性回归算法

理论

思想:用一条直线拟合样本点,让残差平方和最小。

模型: h ( x ) = X θ h(x)=X\theta h(x)=Xθ

参数: θ = ( θ 0 , . . . , θ n ) ′ \theta=(\theta_0,...,\theta_n)^{'} θ=(θ0,...,θn)

目标函数: J ( θ ) = 1 2 m ∑ i = 1 m ( y ( i ) − h ( x ( i ) ) ) 2 = 1 2 m ∣ ∣ y − X θ ∣ ∣ 2 2 J(\theta)=\frac{1}{2m}\sum^{m}_{i=1}(y^{(i)}-h(x^{(i)}))^2=\frac{1}{2m}||y-X\theta||_2^2 J(θ)=2m1i=1m(y(i)h(x(i)))2=2m1yXθ22

梯度: ▽ J ( θ ) = 1 m X T ( h ( x ) − y ) \bigtriangledown J(\theta)=\frac{1}{m}X^T(h(x)-y) J(θ)=m1XT(h(x)y)

最优参数: θ ^ = ( X T X ) − 1 X T y \hat{\theta}=(X^TX)^{-1}X^Ty θ^=(XTX)1XTy

优点:

  1. 建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。
  2. 可以根据系数给出每个变量的解释。

缺点:

  1. 不能很好地拟合非线性数据。所以需要先判断变量之间是否是线性关系。

1.最小二乘法(代数视角)

一种思路是,对于样本,有观测值 y i y_i yi和理论值 y i ^ \hat{y_i} yi^,两者的差就是残差 e i e_i ei。我们让总残差最小,比如使均方误差(MSE)最小,这就是最小二乘法的主要思想。

小样本OLS基本假定

  1. 线性假定:每个解释变量对被解释变量的边际效应均为常数。
  2. 严格外生性: E ( ϵ ∣ X ) = E ( ϵ i ∣ x 1 , . . . , x n ) = 0 E(\epsilon | X) = E(\epsilon_i | x_1, ..., x_n) = 0 E(ϵX)=E(ϵix1,...,xn)=0,即扰动项与所有解释变量均不相关。
  3. 不存在严格多重共线性:即X满列秩,则 X ′ X X^{'}X XX为正定矩阵。
  4. 球形扰动项:扰动项满足‘同方差’、‘无自相关’等性质。
    v a r ( ϵ ∣ X ) = E ( ϵ ′ ϵ ∣ X ) = σ 2 I = { σ 2 ⋯ 0   ⋮ ⋱ ⋮ 0 ⋯ σ 2 } var(\epsilon | X) = E(\epsilon ^{'}\epsilon | X) = \sigma ^2I = \left\{ \begin{matrix} \sigma^2 & \cdots & 0\ \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \sigma^2 \end{matrix} \right\} var(ϵX)=E(ϵϵX)=σ2I=σ200 σ2

大样本OLS的基本假定

  1. 线性假定(不变)
  2. 同期外生性:不再要求扰动项对所有解释变量正交,只是要求扰动项对同期的解释变量正交。
  3. 无严格多重共线性(不变)
  4. 渐近独立的平稳过程:保证样本均值是总体均值的一致估计。

公式推导

J ( β ) = 1 m ∑ i = 1 m ( y ( i ) − X ( i ) β ^ ) 2 = 1 m ( e ′ ) 2 = 1 m e ′ e = 1 m ( Y − X β ^ ) ′ ( Y − X β ^ ) = 1 m ( Y ′ Y − Y ′ X β ^ − β ^ ′ X ′ Y + β ^ ′ X ′ X β ^ ) J(\beta) = \frac{1}{m}\sum^{m}_{i=1}(y^{(i)}-X^{(i)}\hat{\beta})^2\\ =\frac{1}{m}(e^{'})^2\\ =\frac{1}{m}\boldsymbol{e^{'}e}\\ =\frac{1}{m}\boldsymbol{(Y - X\hat{\beta})^{'}(Y - X\hat{\beta})}\\ =\frac{1}{m}(\boldsymbol{Y^{'}Y-Y^{'}X\hat{\beta}-\hat{\beta}^{'}X^{'}Y+\hat{\beta}^{'}X^{'}X\hat{\beta}}) J(β)=m1i=1m(y(i)X(i)β^)2=m1(e)2=m1ee=m1(YXβ^)(YXβ^)=m1(YYYXβ^β^XY+β^XXβ^)

∂ J ( β ) ∂ β ^ = ∂ ( Y ′ Y − Y ′ X β ^ − β ^ ′ X ′ Y + β ^ ′ X ′ X β ^ ∂ β ^ = ∂ t r ( Y ′ Y − Y ′ X β ^ − β ^ ′ X ′ Y + β ^ ′ X ′ X β ^ ) ∂ β ^ = − ( Y ′ X ) ′ − X ′ Y + X ′ X β ^ + ( β ^ ′ X ′ X ) ′ = − 2 X ′ Y + 2 X ′ X β ^ \frac{\partial J(\beta)}{\partial \hat{\beta}}=\frac{\partial (\boldsymbol{Y^{'}Y-Y^{'}X\hat{\beta}-\hat{\beta}^{'}X^{'}Y+\hat{\beta}^{'}X^{'}X\hat{\beta}}}{\partial \hat{\beta}}\\ =\frac{\partial tr(\boldsymbol{Y^{'}Y-Y^{'}X\hat{\beta}-\hat{\beta}^{'}X^{'}Y+\hat{\beta}^{'}X^{'}X\hat{\beta}})}{\partial \hat{\beta}}\\ =-(Y^{'}X)^{'}-X^{'}Y+X^{'}X\hat{\beta}+(\hat{\beta}^{'}X^{'}X)^{'}\\ =-2X^{'}Y+2X^{'}X\hat{\beta} β^J(β)=β^(YYYXβ^β^XY+β^XXβ^=β^tr(YYYXβ^β^XY+β^XXβ^)=(YX)XY+XXβ^+(β^XX)=2XY+2XXβ^

∂ J ( β ) ∂ β ^ = 0 \frac{\partial J(\beta)}{\partial \hat{\beta}}=0 β^J(β)=0, 则 β ^ = ( X ′ X ) − 1 X ′ Y \hat{\beta}=(X^{'}X)^{-1}X^{'}Y β^=(XX)1XY

矩阵的迹求导

2.梯度下降法

梯度下降法是一种基于搜索的最优化方法,作用是最小化一个损失函数(最大化效用函数用梯度上升法)。

我们首先来明晰两个概念
方向导数:函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)沿方向 l ⃗ \vec{l} l 的方向导数

∂ f ∂ l = lim ⁡ ρ → 0 + f ( x 0 + ρ cos ⁡ α , y 0 + ρ cos ⁡ β ) − f ( x 0 , y 0 ) ρ \frac{\partial f}{\partial l}=\lim_{\rho \rightarrow 0^+}\frac{f(x_0+\rho \cos{\alpha}, y_0+\rho \cos{\beta})-f(x_0,y_0)}{\rho} lf=limρ0+ρf(x0+ρcosα,y0+ρcosβ)f(x0,y0)

∂ f ∂ l \frac{\partial f}{\partial l} lf是函数 z z z对点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)沿方向 l ⃗ \vec{l} l ρ \rho ρ的变化率,也是曲面 z z z在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)沿方向 l ⃗ \vec{l} l 的倾斜程度。

梯度:向量 ( ∂ f ∂ x , ∂ f ∂ y ) (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) (xf,yf)是使 f ( x , y ) f(x,y) f(x,y)在一点增加最快的方向,称向量 ( ∂ f ∂ x , ∂ f ∂ y ) (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) (xf,yf)为可微函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x , y ) (x,y) (x,y)处的梯度向量,简称梯度。

记作:
g r a d f = ( ∂ f ∂ x , ∂ f ∂ y ) = ∂ f ∂ x i + ∂ f ∂ y j = ▽ f grad f=(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})=\frac{\partial f}{\partial x}i+\frac{\partial f}{\partial y}j=\bigtriangledown f gradf=(xf,yf)=xfi+yfj=f

梯度 g r a d f grad f gradf是一个向量,是可微函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x , y ) (x,y) (x,y)处取得最大方向导数的方向(即函数增加最快的方向)。

原理

对于损失函数 J ( β ) = 1 2 m ∑ i = 1 m ( y ( i ) − X ( i ) β ) 2 = 1 2 m ∑ i = 1 m ( y ( i ) − ∑ j = 0 n β j x j ( i ) ) 2 J(\beta) = \frac{1}{2m}\sum^{m}_{i=1}(y^{(i)}-X^{(i)}\beta)^2=\frac{1}{2m}\sum^{m}_{i=1}(y^{(i)}-\sum^{n}_{j=0}\beta_jx^{(i)}_j)^2 J(β)=2m1i=1m(y(i)X(i)β)2=2m1i=1m(y(i)j=0nβjxj(i))2

梯度 ▽ J ( β ) = ( ∂ J ∂ β 0 , . . . , ∂ J ∂ β n ) ′ = − 1 m ( . . . , ∑ i = 1 m ( y ( i ) − X ( i ) β ) x j ( i ) , . . . ) ′ j ∈ ( 0 , n ) \bigtriangledown J(\beta)=(\frac{\partial J}{\partial \beta_0},...,\frac{\partial J}{\partial \beta_n})^{'}=-\frac{1}{m}(...,\sum^{m}_{i=1}(y^{(i)}-X^{(i)}\beta)x^{(i)}_j,...)^{'}j\in{(0,n)} J(β)=(β0J,...,βnJ)=m1(...,i=1m(y(i)X(i)β)xj(i),...)j(0,n)

用矩阵形式表示

▽ J ( β ) = 1 m X ′ ( X β − Y ) \bigtriangledown J(\beta)=\frac{1}{m}X^{'}(X\beta - Y) J(β)=m1X(XβY)

梯度的方向就是损失函数 J J J上升最快的方向,要使 J J J最小,则 β : = β − η ▽ J \beta := \beta - \eta \bigtriangledown J β:=βηJ,其中 η \eta η是步长,也称学习率。即 β \beta β沿损失函数 J J J下降最快的方向移动 η ▽ J \eta \bigtriangledown J ηJ,直至梯度为0。

3.最大似然法(概率视角)

最大似然估计的思想,在于已知模型,最有可能产生观测的样本的参数是多少。

Y = X β + ϵ Y = X\beta + \epsilon Y=Xβ+ϵ,假定 v a r ( ϵ ∣ X ) = σ 2 I var(\epsilon | X) = \sigma ^2I var(ϵX)=σ2I,则 Y ∣ X ∼ N ( X β , σ 2 I ) Y|X \sim N(X\beta, \sigma^2I) YXN(Xβ,σ2I)

f ( y ( i ) ∣ X ( i ) ) = 1 2 π σ exp ⁡ { − ( y ( i ) − X ( i ) ′ β ) 2 2 σ 2 } f(y^{(i)}|X^{(i)})=\frac{1}{\sqrt{2\pi} \sigma}\exp\{-\frac{(y^{(i)}-X^{(i)'}\beta)^2}{2\sigma^2}\} f(y(i)X(i))=2π σ1exp{2σ2(y(i)X(i)β)2}

效用函数:

L ( β ) = ∏ i = 1 m f ( y ( i ) ∣ X ( i ) ) = ( 2 π σ 2 ) − m 2 exp ⁡ { − ( Y − X β ) ′ ( Y − X β ) 2 σ 2 } L(\beta)=\prod^{m}_{i=1}f(y^{(i)}|X^{(i)})=(2\pi \sigma^2)^{-\frac{m}{2}}\exp\{-\frac{(Y-X\beta)^{'}(Y-X\beta)}{2\sigma^2}\} L(β)=i=1mf(y(i)X(i))=(2πσ2)2mexp{2σ2(YXβ)(YXβ)}

ln ⁡ L ( β ) = − m 2 ln ⁡ 2 π σ 2 − ( Y − X β ) ′ ( Y − X β ) 2 σ 2 \ln{L(\beta})=-\frac{m}{2}\ln{2\pi \sigma^2}-\frac{(Y-X\beta)^{'}(Y-X\beta)}{2\sigma^2} lnL(β=2mln2πσ22σ2(YXβ)(YXβ)

β \beta β求导

∂ ln ⁡ L ( β ) ∂ β = − 1 2 σ 2 ∂ t r ( ( Y − X β ) ′ ( Y − X β ) ) ∂ β = 0 \frac{\partial \ln{L(\beta})}{\partial \beta}=-\frac{1}{2\sigma^2}\frac{\partial tr((Y-X\beta)^{'}(Y-X\beta))}{\partial \beta}=0 βlnL(β=2σ21βtr((YXβ)(YXβ))=0

β ^ = ( X ′ X ) − 1 X ′ Y \hat{\beta}=(X^{'}X)^{-1}X^{'}Y β^=(XX)1XY

4.从几何视角看线性回归

对于 X X X构成的n维特征空间(每个特征向量构成一个轴),向量 Y Y Y在空间上的投影为 X β X\beta Xβ,要使残差 Y − X β Y-X\beta YXβ最小,则 Y − X β Y-X\beta YXβ与超平面 X X X正交。

X ′ ( Y − X β ) = 0 ( 两 个 向 量 垂 直 , 即 a ′ b = 0 ) X^{'}(Y-X\beta)=0(两个向量垂直,即a^{'}b=0) X(YXβ)=0(ab=0)

β ^ = ( X ′ X ) − 1 X ′ Y \hat{\beta}=(X^{'}X)^{-1}X^{'}Y β^=(XX)1XY

实现

class myLinReg():
    def __init__(self, eta=1e-1, thread=1e-3, max_iter=1000):
        self._X = None
        self._y = None
        self._theta = None
        self._eta = eta
        self._thread = thread
        self._max_iter = max_iter
        
    def fit(self, X_train, y_train):
        self._X = np.c_[np.ones(X_train.shape[0]), X_train]
        self._y = np.array(y_train).reshape(-1, 1)
        self._theta = np.linalg.inv(self._X.T @ self._X) @ self._X.T @ self._y
    
    # 目标函数
    def _J(self):
        h = self._X @ self._theta
        m = len(self._y)
        return np.sum((self._y - h)**2) / 2*m
    
    # 梯度
    def _dJ(self):
        h = self._X @ self._theta
        m = len(self._y)
        return (self._X.T @ (h - self._y)) / m
    
    def fit_gd(self, X_train, y_train):
        self._X = np.c_[np.ones(X_train.shape[0]), X_train]
        self._y = np.array(y_train).reshape(-1, 1)
        self._theta = np.zeros(self._X.shape[1]).reshape(-1,1)
        count = 1
        while count < self._max_iter:
            old_J = self._J()
            dJ = self._dJ()
            self._theta -= self._eta * dJ
            new_J = self._J()
            if np.abs(new_J - old_J) < self._thread:
                break
            count +=1
        return self
    
    def predict(self, X_test):
        X_b = np.c_[np.ones(X_test.shape[0]), X_test]
        return X_b @ self._theta
    
    def score(self, X_test, y_test):
        y_pred = self.predict(X_test).reshape(-1,1)
        y_test = np.array(y_test).reshape(-1,1)
        sse = np.sum((y_test - y_pred)**2)
        sst = np.sum((y_test - y_test.mean())**2)
        return 1 - sse/sst
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值