机器学习(一):深入解析线性回归模型

一.线性回归的基本概念

1.1 什么是回归问题?

回归是应用于经济,投资等领域的一种统计学方法,它尝试确定一个因变量(通常由 y y y表示)与一系列其他变量(称为自变量,通常用 x x x表示)之间关系,然后通过这个关系来进行相关的预测,例如我们根据一个地区的若干年的PM2.5数值变化来估计某一天该地区的PM2.5值大小。也就是说,回归问题就是确定一个模型 f f f,使得 y = f ( x ) y=f(x) y=f(x)。若 y y y x x x之间是一次函数关系,则称其为线性回归问题(狭义上的)。

1.2 一元线性回归

给定一个数据集 D = ( x ⃗ 1 , y 1 ) , ( x ⃗ 2 , y 2 ) , . . . , ( x ⃗ m , y m ) D={(\vec x_1,y_1),(\vec x_2,y_2),...,(\vec x_m,y_m)} D=(x 1,y1),(x 2,y2),...,(x m,ym),后面的讨论都是基于假想的数据集 D D D。当自变量 x x x只包含单个特征时,我们称该线性回归为一元线性回归,其数学形式如下所示:
y = w x + b y=wx+b y=wx+b
实际上一元线性回归的数学形式就是我们所熟悉的直线方程,例如下面就是根据 y = x + 1.2 y=x+1.2 y=x+1.2加上随机误差人工生成的一组 ( x i , y i ) (x_i,y_i) (xi,yi),显然 x i x_i xi y i y_i yi之间的关系明显满足一元线性模型的要求。

一元线性模型数据图

上图数据的生成代码如下:

size=1000
x = np.random.randn(size,1)
y = x + np.random.randn(size,1) + 2.2

1.3 多元线性回归

多元线性回归与一元线性回归类似,只不过自变量 x x x由标量变成了向量,即 x ⃗ = ( x 1 , x 2 , . . . , x d ) \vec x=(x_1,x_2,...,x_d) x =(x1,x2,...,xd),多元线性回归的数学形式如下:
y = w 1 x 1 + w 2 x 2 + w 3 x 3 + . . . + w d x d + b y=w_1x_1+w_2x_2+w_3x_3+...+w_dx_d+b y=w1x1+w2x2+w3x3+...+wdxd+b
同样的,这里也给出一个能利用多元线性回归求解的模型,下图是基于 y = x 1 + x 2 + 5.2 y=x_1+x_2 + 5.2 y=x1+x2+5.2(三维空间中的平面 x + y + 5.2 = z x+y+5.2=z x+y+5.2=z)加上随机误差生成的一组 ( x ⃗ i , y i ) (\vec x_i,y_i) (x i,yi)

多元线性模型数据图

其数据生成代码如下:

size=1000
x1 = np.random.randn(size,1)
x2 = np.random.randn(size,1)
y = x1 + x2 + np.random.randn(size,1) + 5.2

二.模型的确定

在1.2,1.3两节中我分别基于 y = x + 1.2 y=x+1.2 y=x+1.2 y = x 1 + x 2 + 5.2 y=x_1+x_2 + 5.2 y=x1+x2+5.2生成了两个数据集,因此两个数据集分别对应的线性回归模型各自的理想参数分别为 w = 1 , b = 1.2 w=1,b=1.2 w=1,b=1.2 w 1 = 1 , w 2 = 1 , b = 5.2 w_1=1,w_2=1,b=5.2 w1=1,w2=1,b=5.2。但在实际中,我们事先是不知道数据集所对应的模型的,那么对于一个适用于线性回归问题的数据集来说,我们如何来寻找适合其的模型呢?另外,对于一个模型我们需要如何判断其是否适合呢?

2.1 线性回归模型的度量

线性回归模型有许多的度量方式,其中均方误差(MSE,Mean-Square-Error)是线性回归最常用的性能度量。

2.1.1 一元线性模型的均方误差

设一元线性模型为 f ( x ) = w x + b f(x)=wx+b f(x)=wx+b,数据集仍为 D D D,对于某个数据 ( x i , y i ) (x_i,y_i) (xi,yi) y i y_i yi为真实标签, f ( x i ) f(x_i) f(xi)为预测值,则均方误差 L L L定义如下:
L = ∑ i = 1 m ( f ( x i ) − y i ) 2 = ∑ i = 1 m ( w x i + b − y i ) 2 L=\sum_{i=1}^m( f(x_i) - y_i) ^2=\sum_{i=1}^{m}( wx_i+b-y_i) ^2 L=i=1m(f(xi)yi)2=i=1m(wxi+byi)2
由上式可知,当均方误差衡量的是预测值与真实标签间的”差距“,当一个模型的均方误差越小时,模型的预测就越接近真实值,模型也就越理想。

2.1.2 多元线性模型的均方误差

对于多元线性回归,通常会将其表示为矩阵的形式,参照周志华机器学习中的表示方式,先将 w w w b b b吸收入向量形式 w ^ = ( w ; b ) \widehat{w}=(w;b) w =(w;b)。相应的,数据集 D D D表示为一个 m × ( d + 1 ) m\times(d+1) m×(d+1)大小的矩阵 X X X,即
X = ( x 11 x 12 . . . x 1 d 1 x 21 x 22 . . . x 2 d 1 . . . . . . . . . . . . . . . x m 1 x m 2 . . . x m d 1 ) = ( x 1 T 1 x 2 T 1 . . . . . . x m T 1 ) X=\left( \begin{matrix} x_{11}& x_{12}& ...& x_{1d}& 1\\ x_{21}& x_{22}& ...& x_{2d}& 1\\ ...& ...& ...& ...& ...\\ x_{m1}& x_{m2}& ...& x_{md}& 1\\ \end{matrix} \right) =\left( \begin{matrix} x_1^T& 1\\ x_2^T& 1\\ ...& ...\\ x_m^T& 1\\ \end{matrix} \right) X=x11x21...xm1x12x22...xm2............x1dx2d...xmd11...1=x1Tx2T...xmT11...1
同样数据集 D D D的标签也也写成向量形式 y = ( y 1 ; y 2 ; . . . ; y m ) y=(y_1;y_2;...;y_m) y=(y1;y2;...;ym),即 m × 1 m\times1 m×1矩阵,则均方误差可以表示为:
L = ( y − X w ^ ) T ( y − X w ^ ) L=(y-X\widehat{w})^T(y-X\widehat{w}) L=(yXw )T(yXw )
注:一元线性模型也可以采用多元线性模型的表示形式

2.2 如何求解 w w w b b b

既然已经知道如何对线性回归模型进行评价了,那接下来的任务就变成了如何确定一组超级参数 w w w b b b使得均方误差 L L L最小化。可知 L L L是一个凸函数,根据微积分可知,当导数为0时, L L L取最小值,因此需要对 w w w和b求偏导并令其为0。

2.2.1 一元线性模型的超级参数

∂ L ∂ w = ∑ i = 1 m 2 ( w x i + b − y i ) x i = 2 ( w ∑ i = 1 m x i 2 − ∑ i = 1 m ( y i − b ) x i ) = 0 ∂ L ∂ b = ∑ i = 1 m 2 ( w x i + b − y i ) = 2 ( m b − ∑ i = 1 m y i − w x i ) = 0 \frac{\partial L}{\partial w} = \sum_{i=1}^m{2( wx_i+b-y_i) x_i} =2(w\sum_{i=1}^m{x_i}^2-\sum_{i=1}^m{(y_i-b)x_i})=0 \\ \frac{\partial L}{\partial b} = \sum_{i=1}^m{2( wx_i+b-y_i)} = 2(mb-\sum_{i=1}^m{y_i-wx_i})=0 wL=i=1m2(wxi+byi)xi=2(wi=1mxi2i=1m(yib)xi)=0bL=i=1m2(wxi+byi)=2(mbi=1myiwxi)=0

可得 w w w和b的最优解为:
w = ∑ i = 1 m y i ( x i − x ‾ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 b = 1 m ∑ i = 1 m ( y i − w x i ) w=\frac{\sum_{i=1}^m{y_i\left( x_i-\overline{x} \right)}}{\sum_{i=1}^m{x_{\mathrm{i}}^2-\frac{1}{m}\left( \sum_{i=1}^m{xi} \right) ^2}} \\ b=\frac{1}{m}\sum_{i=1}^m{\left( y_i-wx_i \right)} w=i=1mxi2m1(i=1mxi)2i=1myi(xix)b=m1i=1m(yiwxi)
其中 x ‾ = 1 m ∑ i = 1 m ( x i ) \overline{x}=\frac{1}{m}\sum_{i=1}^m(x_i) x=m1i=1m(xi),即为 x x x的均值。

2.2.2 多元线性模型的超级参数

损失函数 L L L w ^ \widehat{w} w 的求偏导并令其为0,即:
∂ L ∂ w ^ = 2 X T ( X w ^ − y ) = 0 \frac{\partial L}{\partial \widehat{w}}=2X^T\left( X\widehat{w}-y \right)=0 w L=2XT(Xw y)=0
因此 w ^ \widehat{w} w 的最优解:
w ^ = ( X T X ) − 1 X T y \widehat{w}=(X^TX)^{-1}X^Ty w =(XTX)1XTy

三.代码实现

根据2.3节的针对一元线性模型和二元线性模型超级参数的求解实现代码如下(其中一元线性模型也转换成了矩阵形式进行求解尝试):

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def loadDataset1(size=1000):
    """
    功能:生成一元线性模型数据集
    size:数据集大小
    """
    x = np.random.randn(size,1)
    y = x + np.random.randn(size,1) + 1.2
    
    return x,y

def loadDataset2(size=1000):
    """
    功能:生成多元线性模型数据集
    size:数据集大小
    """
    x1 = np.random.randn(size,1)
    x2 = np.random.randn(size,1)
    x3 = np.random.randn(size,1)
    y = 0.8*x1 + 1.7*x2 + 6.6*x3 + np.random.randn(size,1) + 5.2
    ones = np.ones(shape=(size,1))
    #构造(w,b)形式
    x = np.hstack((x1,x2,x3,ones))
    
    return x,y



if __name__ == "__main__":
    size = 1000
    x1,y1 = loadDataset1(size=size)
    #一元线性模型参数求解方法
    w1 = np.dot(y1.T,x1-np.mean(x1)) / (np.sum(x1**2) - 1.0 /size * np.sum(x1)**2)
    b1 = 1.0 / size * np.sum((y1-w1*x1))
    print(w1[0,0],b1)
    
    #一元线性模型划为矩阵形式后进行求解
    ones = np.ones(shape=(size,1))
    #构造(w,b)形式
    x1 = np.hstack((x1,ones))
    print(np.linalg.inv(x1.T.dot(x1)).dot(x1.T).dot(y1))
    
    #多元线性模型超级参数求解
    x2,y2 = loadDataset2(size=size)
    print(np.linalg.inv(x2.T.dot(x2)).dot(x2.T).dot(y2))
    """
    0.9837945577476686 1.2292211441168228
    [[0.98379456]
     [1.22922114]]
    [[0.83507322]
     [1.66517019]
     [6.67787326]
     [5.18590384]]
    """

可以看出根据数据集预测的超级参数和实际的参数已经十分接近了。

参考博客

以上便是本文的全部内容,如果觉得不错的话就点个赞或关注一下博主吧,你们的支持是博主创作的不竭动力,倘若有任何问题也敬请批评指正!!!

猜你喜欢

转载自blog.csdn.net/qq_42103091/article/details/109276571