文章目录
什么是线性回归
引用维基百科对线性回归的定义:
线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个
自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的
模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归
本文主要介绍多元回归,线性回归的数学表达式如下:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w n x n + b = w T x + b (1.0) f(x)=w_1x_1+w_2x_2+...+w_nx_n+b=w^Tx+b \tag{1.0} f(x)=w1x1+w2x2+...+wnxn+b=wTx+b(1.0)
其中 w T = ( w 1 , w 2 . . . . . , w n ) 、 b w^T=(w_1,w_2.....,w_n)、b wT=(w1,w2.....,wn)、b为参数,线性回归通过拟合训练数据从而确定 w T 、 b w^T、b wT、b 的值,当有测试数据进来时,便可通过式1.0进行回归预测。
线性回归的损失函数
一般通过最小化损失函数来进行参数估计,假设我们现有一批含有m个训练数据的训练集: ( x 1 , y 1 ) 、 ( x 2 , y 2 ) . . . . . ( x m , y m ) (x_1,y_1)、(x_2,y_2).....(x_m,y_m) (x1,y1)、(x2,y2).....(xm,ym),其中 x i = ( x i 1 , x i 2 , . . . . , x i n ) x_i=(x_{i1},x_{i2},....,x_{in}) xi=(xi1,xi2,....,xin),则线性回归的损失函数为:
E = 1 m ∑ i = 1 m ( y i − f ( x i ) ) 2 = 1 m ∑ i = 1 m ( y i − ( w T x i + b ) ) 2 (2.0) E=\frac{1}{m}\sum_{i=1}^m(y_i-f(x_i))^2=\frac{1}{m}\sum_{i=1}^m(y_i-(w^Tx_i+b))^2\tag{2.0} E=m1i=1∑m(yi−f(xi))2=m1i=1∑m(yi−(wTxi+b))2(2.0)
线性回归的损失函数由均方误差(等号左边)推导而来,显然,当 y i = w T x i + b y_i=w^Tx_i+b yi=wTxi+b时,2.0具有最小值,通过最小化均方误差,将缩小线性回归模型与真实数据之间的差距,也就是拟合训练数据。通过最小化均方误差进行参数估计的方法称为最小二乘法。
那么为什么我们要拟合训练数据?一般来说,我们相信训练数据中隐藏了某些客观规律,并且这些客观规律也存在于测试数据中,深度学习模型或是机器学习模型通过拟合训练数据,从而找到数据中隐藏的规律,将这些规律应用于预测或是分类,线性回归模型便是假设数据中隐藏的规律是线性的,因此线性回归模型是一个非常简单的模型,其能力并不强大。目前的深度学习模型、机器学习模型都是数据导向型的,数据好坏远比模型好坏要重要。
如何训练线性回归模型
线性回归模型的训练分为两种方式,第一种是使用梯度下降算法,第二种是线性回归的数值解,即直接求解式2.0,从而得到 w ^ T 、 b \hat w^T、b w^T、b的值。
线性回归的数值解
我们先来说说第二种方式,式2.0的海瑟矩阵正定,为一个凸函数,导数为0的点可以使式2.0具有最小值,在满足一定条件下,可以直接解出线性回归的数值解。
设
X = { x 11 x 12 . . . x 1 n 1 x 21 x 22 . . . x 2 n 1 . . . x m 1 x m 2 . . . x m n 1 } X=\left\{\begin{matrix} x_{11}&x_{12}&...&x_{1n}&1\\ x_{21}&x_{22}&...&x_{2n}&1\\ &&...\\ x_{m1}&x_{m2}&...&x_{mn}&1 \end{matrix}\right\} X=⎩⎪⎪⎨⎪⎪⎧x11x21xm1x12x22xm2............x1nx2nxmn111⎭⎪⎪⎬⎪⎪⎫
w ^ = ( w 1 ; w 2 ; . . . w n ; b ) y = ( y 1 ; y 2 ; . . . ; y n ) \hat w=(w_1;w_2;...w_n;b)\\ y=(y_1;y_2;...;y_n) w^=(w1;w2;...wn;b)y=(y1;y2;...;yn)
w ^ \hat w w^, y y y为向量,则式2.0可写成
E = ( y − X w ^ ) T ( y − X w ^ ) (3.0) E=(y-X\hat w)^T(y-X\hat w) \tag{3.0} E=(y−Xw^)T(y−Xw^)(3.0)
由于 1 m \frac{1}{m} m1是常数,不影响式2.0的最小化,因此式3.0中省略了 1 m \frac{1}{m} m1,对式3.0进行矩阵运算后可得到式2.0(忽略 1 m \frac{1}{m} m1),对3.0求导前,我们先来进行一下简单的矩阵求导,设
A = { a b c d } Y = { y 1 y 2 } W = { w 1 w 2 } A=\left\{\begin{matrix} a&b\\ c&d \end{matrix}\right\}\ \ Y=\left\{\begin{matrix}y_1\\y_2\end{matrix}\right\}\ \ W=\left\{\begin{matrix}w_1\\w_2\end{matrix}\right\} A={acbd} Y={y1y2} W={w1w2}
H = ( Y − A W ) T ( Y − A W ) = ( y 1 − ( a w 1 + b w 2 ) ) 2 + ( y 2 − ( c w 1 + d w 2 ) ) 2 H=(Y-AW)^T(Y-AW)=(y_1-(aw_1+bw_2))^2+(y_2-(cw_1+dw_2))^2 H=(Y−AW)T(Y−AW)=(y1−(aw1+bw2))2+(y2−(cw1+dw2))2
则有
∂
H
∂
w
1
=
−
2
a
(
y
1
−
(
a
w
1
+
b
w
2
)
)
−
2
c
(
y
2
−
(
c
w
1
+
d
w
2
)
)
∂
H
∂
w
2
=
−
2
b
(
y
1
−
(
a
w
1
+
b
w
2
)
)
−
2
d
(
y
2
−
(
c
w
1
+
d
w
2
)
)
\frac{\partial H}{\partial w_1}=-2a(y_1-(aw_1+bw_2))-2c(y_2-(cw_1+dw_2))\\ \frac{\partial H}{\partial w_2}=-2b(y_1-(aw_1+bw_2))-2d(y_2-(cw_1+dw_2))
∂w1∂H=−2a(y1−(aw1+bw2))−2c(y2−(cw1+dw2))∂w2∂H=−2b(y1−(aw1+bw2))−2d(y2−(cw1+dw2))
∂
H
∂
W
=
{
∂
H
∂
w
1
∂
H
∂
w
2
}
=
{
−
2
a
(
y
1
−
(
a
w
1
+
b
w
2
)
)
−
2
c
(
y
2
−
(
c
w
1
+
d
w
2
)
)
−
2
b
(
y
1
−
(
a
w
1
+
b
w
2
)
)
−
2
d
(
y
2
−
(
c
w
1
+
d
w
2
)
)
}
=
−
2
{
a
c
b
d
}
{
y
1
−
(
a
w
1
+
b
w
2
)
y
2
−
(
c
w
1
+
d
w
2
)
}
=
−
2
{
a
c
b
d
}
(
{
y
1
y
2
}
−
{
a
b
c
d
}
{
w
1
w
2
}
)
=
2
A
T
(
A
W
−
Y
)
\begin{aligned} \frac{\partial H}{\partial W}&=\left\{\begin{matrix} \frac{\partial H}{\partial w_1}\\ \frac{\partial H}{\partial w_2} \end{matrix}\right\}\\ &=\left\{\begin{matrix}-2a(y_1-(aw_1+bw_2))-2c(y_2-(cw_1+dw_2))\\-2b(y_1-(aw_1+bw_2))-2d(y_2-(cw_1+dw_2))\end{matrix}\right\}\\ &=-2\left\{\begin{matrix}a&c\\b&d\end{matrix}\right\}\left\{\begin{matrix}y_1-(aw_1+bw_2)\\y_2-(cw_1+dw_2) \end{matrix}\right\}\\ &=-2\left\{\begin{matrix}a&c\\b&d\end{matrix}\right\}(\left\{\begin{matrix}y_1\\y_2\end{matrix}\right\}-\left\{\begin{matrix} a&b\\ c&d \end{matrix}\right\}\left\{\begin{matrix}w_1\\w_2\end{matrix}\right\})\\ &=2A^T(AW-Y) \end{aligned}
∂W∂H={∂w1∂H∂w2∂H}={−2a(y1−(aw1+bw2))−2c(y2−(cw1+dw2))−2b(y1−(aw1+bw2))−2d(y2−(cw1+dw2))}=−2{abcd}{y1−(aw1+bw2)y2−(cw1+dw2)}=−2{abcd}({y1y2}−{acbd}{w1w2})=2AT(AW−Y)
上述过程可以延伸至任意m*n的矩阵A,因此式3.0对
w
^
\hat{w}
w^求导可得
∂ E ∂ w ^ = 2 X T ( X w ^ − y ) (4.0) \frac{\partial E}{\partial \hat w}=2X^T(X\hat w-y) \tag{4.0} ∂w^∂E=2XT(Xw^−y)(4.0)
令4.0为0可得
2 X T ( X w ^ − y ) = 0 2 X T X w ^ − 2 X T y = 0 X T X w ^ = X T y w ^ = ( X T X ) − 1 X T y \begin{aligned} &2X^T(X\hat w-y)=0\\ &2X^TX\hat w-2X^Ty=0\\ &X^TX\hat w=X^Ty\\ &\hat w=(X^TX)^{-1}X^Ty \end{aligned} 2XT(Xw^−y)=02XTXw^−2XTy=0XTXw^=XTyw^=(XTX)−1XTy
但是矩阵 X T X X^TX XTX不一定时时刻刻可逆,当 X T X X^TX XTX为满秩矩阵(矩阵的秩等于矩阵的阶。对于方阵而言,化成阶梯型矩阵后,矩阵中每一行都不为0,即为满秩矩阵)时, X T X X^TX XTX一定可逆,此时线性回归的数值解为 ( X T X ) − 1 X T y (X^TX)^{-1}X^Ty (XTX)−1XTy
线性回归的梯度下降解
如果线性回归不存在数值解,此时可以使用梯度下降进行求解。有关梯度下降,我将在机器学习——单层前馈神经网络与BP算法介绍
线性回归的基本用途、优缺点、拓展
基本用途:(引用维基百科线性回归)
1、如果目标是预测或者映射,线性回归可以用来对观测数据集的和X的值拟合出一个预测模型。当完成
这样一个模型以后,对于一个新增的X值,在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个y值。
2、给定一个变量y和一些变量X1,X2,…,Xn,这些变量有可能与Y相关,线性回归分析可以用来量化 Y 与 Xj 之间相关性的强度,评估出与Y不相关的Xj,并识别出哪些 Xj 的子集包含了关于Y的冗余信息。
3、线性回归也可以用来看事物发展的趋势,通过直线斜率便可以判断总体来说,事物是向上还是向下发展的
优点:解释性好,实现简单
缺点:对于异常值敏感,如果是离散值,例如因变量的取值为0、1,此时就无法使用线性回归
拓展:上述讲解的线性回归是用一条直线去拟合数据,当然,我们也可以对上述线性回归的公式进行改进,用一条曲线去拟合数据:
线性回归的假设
引自维基百科良哥最帅
1、样本是在总体之中随机抽取出来的。
2、因变量Y在实直线上是连续的,
3、残差项是独立且相同分布的(iid),服从高斯分布
线性回归为什么使用均方误差作为损失函数
在第三点假设下,我们设模型输出
f
(
x
i
)
f(x_i)
f(xi)与真实数据
y
i
y_i
yi之间的误差为:
ε
i
=
f
(
x
i
)
−
y
i
ε_i=f(x_i)−y_i
εi=f(xi)−yi,此时对误差使用极大似然估计,等价于最小化均方误差,证明如下,以下内容整合自我是链接
则极大化误差的对数似然等价于最小化
∑
i
=
0
m
ε
i
2
=
∑
i
=
0
m
(
f
(
x
i
)
,
−
y
i
)
2
\sum_{i=0}^mε_i^2=\sum_{i=0}^m(f(x_i),−y_i)^2
∑i=0mεi2=∑i=0m(f(xi),−yi)2,其实就是最小化均方误差。
在中心极限定理的前提下,残差很容易满足第三点假设。因此均方误差可作为许多机器学习、深度学习模型的损失函数
使用线性回归数值解的限制
高斯-马尔可夫定理表明在线性回归模型中,如果残差满足零均值,不相关(独立),同方差,此时回归系数的最佳线性无偏估计就是使用线性最小二乘法得到的数值解。因此求得线性回归的数值解后,一定要进行残差分析,证明残差具有上述性质。
使用线性回归的数值解,通常需要进行一系列检测,包括
- t检验
- F检验
- 相关系数显著性检验
- 残差自相关检验
- 异方差检验
- 如果是多元线性回归,需要做多重共线性检验
t检验与F检验可以不做,上述检验全部通过,才可以使用线性回归的数值解,此时数值解具有统计学意义。
一般来说,线性回归存在多个解,通过检验的数值解将会是最好的解,如果数值解不存在或是没有通过检验,我们将通过归纳偏好来选择解,最常见的做法是在损失函数中添加正则项。值得注意的是,如果数据之间存在多重共线性,将不能使用线性回归。
基于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()
运行结果:
如果您想了解更多有关深度学习、机器学习基础知识,或是java开发、大数据相关的知识,欢迎关注我们的公众号,我将在公众号上不定期更新深度学习、机器学习相关的基础知识,分享深度学习中有趣文章的阅读笔记。
如果您对增量学习感兴趣,欢迎关注我们的公众号,我将不定期在公众号上更新增量学习文章相关的阅读笔记