线性回归是一个线性模型,常用于回归预测。本文将从基本概念、训练方式、使用限制、代码实现等方面介绍线性回归

什么是线性回归线性回归的损失函数如何训练线性回归模型    线性回归的数值解    线性回归的梯度下降解线性回归的基本用途、优缺点、拓展线性回归的假设线性回归为什么使用均方误差作为损失函数使用线性回归数值解的限制基于pytorch实现的一元线性回归01—

 什么是线性回归

引用维基百科对线性回归的定义:

线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归

本文主要介绍多元回归,线性回归的数学表达式如下:

线性回归 t检验 se b 线性回归t检验怎么做_线性回归

其参数为:

                                       

线性回归 t检验 se b 线性回归t检验怎么做_线性回归_02

线性回归通过拟合训练数据从而确定

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_03

 的值,当有测试数据进来时,便可通过式1.0进行回归预测。

02

  线性回归的损失函数

一般通过最小化损失函数来进行参数估计,假设我们现有一批含有m个训练数据的训练集:

                                         

线性回归 t检验 se b 线性回归t检验怎么做_线性回归_04

其中

                                                 

线性回归 t检验 se b 线性回归t检验怎么做_线性回归_05

则线性回归的损失函数为:

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_06

线性回归的损失函数由均方误差(等号左边)推导而来,显然,当

线性回归 t检验 se b 线性回归t检验怎么做_线性回归_07

时,2.0具有最小值,通过最小化均方误差,将缩小线性回归模型与真实数据之间的差距,也就是拟合训练数据。通过最小化均方误差进行参数估计的方法称为最小二乘法。

那么为什么我们要拟合训练数据?一般来说,我们相信训练数据中隐藏了某些客观规律,并且这些客观规律也存在于测试数据中,深度学习模型或是机器学习模型通过拟合训练数据,从而找到数据中隐藏的规律,将这些规律应用于预测或是分类,线性回归模型便是假设数据中隐藏的规律是线性的,因此线性回归模型是一个非常简单的模型,其能力并不强大。目前的深度学习模型、机器学习模型都是数据导向型的,数据好坏远比模型好坏要重要。

03

如何训练线性回归模型

线性回归模型的训练分为两种方式,第一种是使用梯度下降算法,第二种是线性回归的数值解,即直接求解式2.0,从而得到

线性回归 t检验 se b 线性回归t检验怎么做_损失函数_08

的值。

线性回归的梯度下降解

如果线性回归不存在数值解,此时可以使用梯度下降进行求解。有关梯度下降,我将在机器学习——单层前馈神经网络与BP算法中介绍

线性回归的数值解

我们先来说说第二种方式,式2.0的海瑟矩阵正定,为一个凸函数,导数为0的点可以使式2.0具有最小值,在满足一定条件下,可以直接解出线性回归的数值解。

线性回归 t检验 se b 线性回归t检验怎么做_损失函数_09

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_10

,为向量,则式2.0可写成

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_11

由于

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_12

是常数,不影响式2.0的最小化,因此式3.0中省略了

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_12

,对式3.0进行矩阵运算后可得到式2.0(忽略

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_12

),对3.0求导前,我们先来进行一下简单的矩阵求导,设

线性回归 t检验 se b 线性回归t检验怎么做_损失函数_15

上述过程可以延伸至任意m*n的矩阵A,因此式3.0对

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_10

求导可得

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_17

但是矩阵

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_18

不一定时时刻刻可逆,当

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_18

为满秩矩阵(矩阵的秩等于矩阵的阶。对于方阵而言,化成阶梯型矩阵后,矩阵中每一行都不为0,即为满秩矩阵)时,

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_18

一定可逆,此时线性回归的数值解为

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_21

04

线性回归的使用和优缺点

基本用途:(引用维基百科线性回归)

1、如果目标是预测或者映射,线性回归可以用来对观测数据集的和X的值拟合出一个预测模型。当完成
这样一个模型以后,对于一个新增的X值,在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个y值。

2、给定一个变量y和一些变量X1,X2,….,Xn,这些变量有可能与Y相关,线性回归分析可以用来量化 Y 与 Xj 之间相关性的强度,评估出与Y不相关的Xj,并识别出哪些 Xj 的子集包含了关于Y的冗余信息。

3、线性回归也可以用来看事物发展的趋势,通过直线斜率便可以判断总体来说,事物是向上还是向下发展的

优点:解释性好,实现简单
缺点:对于异常值敏感,如果是离散值,例如因变量的取值为0、1,此时就无法使用线性回归

拓展:上述讲解的线性回归是用一条直线去拟合数据,当然,我们也可以对上述线性回归的公式进行改进,用一条曲线去拟合数据:


线性回归 t检验 se b 线性回归t检验怎么做_数据_22

05

线性回归的假设

引自维基百科

1、样本是在总体之中随机抽取出来的。
2、因变量Y在实直线上是连续的,
3、残差项是独立且相同分布的(iid),服从高斯分布

06

为什么使用均方误差作为损失函数

在第三点假设下,我们设模型输出

线性回归 t检验 se b 线性回归t检验怎么做_机器学习线性回归_23

与真实数据

线性回归 t检验 se b 线性回归t检验怎么做_线性回归_24

之间的误差为: 

线性回归 t检验 se b 线性回归t检验怎么做_线性回归 t检验 se b_25

此时对误差使用极大似然估计,等价于最小化均方误差,证明如下

线性回归 t检验 se b 线性回归t检验怎么做_数据_26

则极大化误差的对数似然等价于最小化 :

线性回归 t检验 se b 线性回归t检验怎么做_数据_27

其实就是最小化均方误差。在中心极限定理的前提下,残差很容易满足第三点假设。因此均方误差可作为许多机器学习、深度学习模型的损失函数

07

线性回归数值解的限制

高斯-马尔可夫定理表明在线性回归模型中,如果残差满足零均值,不相关(独立),同方差,此时回归系数的最佳线性无偏估计就是使用线性最小二乘法得到的数值解。因此求得线性回归的数值解后,一定要进行残差分析,证明残差具有上述性质。

使用线性回归的数值解,通常需要进行一系列检测,包括

  • t检验
  • F检验
  • 相关系数显著性检验
  • 残差自相关检验
  • 异方差检验
  • 如果是多元线性回归,需要做多重共线性检验

t检验与F检验可以不做,上述检验全部通过,才可以使用线性回归的数值解,此时数值解具有统计学意义。

一般来说,线性回归存在多个解,通过检验的数值解将会是最好的解,如果数值解不存在或是没有通过检验,我们将通过归纳偏好来选择解,最常见的做法是在损失函数中添加正则项。值得注意的是,如果数据之间存在多重共线性,将不能使用线性回归。

08

基于pytorch实现一元线性回归

import torch
import matplotlib.pyplot as plt
from torch import nn

# 训练数据
x_train = torch.tensor([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], [9.779], [6.182], [7.59], [2.167], [7.042], [10.791], [5.313],
     [7.997], [3.1]])
y_train = torch.tensor([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], [3.366], [2.596], [2.53], [1.221], [2.827], [3.465], [1.65],
     [2.904], [1.3]])


# def a simple network

class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        # input size与output size均为1,为一元线性回归
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        out = self.linear(x)
        return out



model = LinearRegression()


# 定义loss function 和 optimize func
criterion = nn.MSELoss()  # 均方误差作为优化函数
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
num_epochs = 30000
for epoch in range(num_epochs):

    # forward
    out = model(x_train)
    loss = criterion(out, y_train)

    # backword
    optimizer.zero_grad()  # 每次做反向传播之前都要进行归零梯度。不然梯度会累加在一起,造成不收敛的结果
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 20 == 0:
        print('Epoch[{}/{}], loss: {:.6f}'.format(epoch + 1, num_epochs, loss.data))

# 虽然model.eval()只对dropout、BN算法等有作用,但是在测试时最好加上
model.eval()

predict = model(x_train)
predict = predict.data.cpu().numpy()
plt.plot(x_train.numpy(), y_train.numpy(), 'ro', label='original data')
plt.plot(x_train.numpy(), predict, label='Fitting line')
plt.show()

运行结果:


线性回归 t检验 se b 线性回归t检验怎么做_线性回归_28

线性回归的训练结果可视化

参考

1. 性回归的假设:https://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E5%9B%9E%E6%AD%B8#%E5%8F%A4%E5%85%B8%E5%81%87%E8%A8%AD


end