最小二乘法
最小二乘法是一种在误差估计、不确定度、系统辨识及预测、预报等数据处理诸多学科领域得到广泛应用的数学工具。——百度百科
最小二乘法又称最小平方法,它通过最小化误差的平方和来寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得一个通过某个函数计算得到的预测值,然后使得这些求得的数据与真实数据之间误差(差距)的平方和为最小。
对于一元线性回归
简介
一元线性回归就是指,自变量X和因变量Y都是单个数据的情况下,自变量X和因变量Y之间的关系。
那么,X与Y之间有关系 Y = a X + b Y=aX+b Y=aX+b, a a a和 b b b都是未知数。
显然,对于单自变量和单因变量,有
b
=
Y
−
a
X
b=Y-aX
b=Y−aX
a = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X i − X ‾ ) 2 a=\frac{\sum_{i=1}^{n}(X_i-\overline{X})(Y_i-\overline{Y})}{\sum_{i=1}^{n}(X_i-\overline{X})^2} a=∑i=1n(Xi−X)2∑i=1n(Xi−X)(Yi−Y)
一元线性回归模拟
-
现在给定多组 ( X , Y ) (X,Y) (X,Y)值,Y是X对应的真实结果值。
对于一元线性关系,多组 ( X , Y ) (X,Y) (X,Y)的X值和Y值是一对一的关系。
-
给a和b两个随机值。
-
将 X i X_i Xi代入公式 Y = a X + b Y=aX+b Y=aX+b中,会得到当前预测值 Y i ∗ Y_i^* Yi∗。
-
使用最小二乘法来判断真实值 Y Y Y与预测值 Y i ∗ Y_i^* Yi∗之间的关系(差距)。
r e s i d ( X i , Y i ) = ( Y i − Y i ∗ ) 2 resid(X_i,Y_i)=(Y_i-Y_i^*)^2 resid(Xi,Yi)=(Yi−Yi∗)2 -
那么有m组 ( X , Y ) (X,Y) (X,Y)值,这m组观测数据所有得到的残差值如下式
r e s i d ( X , Y ) = ∑ i = 1 m ( Y i − Y i ∗ ) 2 resid(X,Y)=\sum_{i=1}^{m}(Y_i-Y_i^*)^2 resid(X,Y)=i=1∑m(Yi−Yi∗)2 -
通过得到 r e s i d ( X i , Y i ) resid(X_i,Y_i) resid(Xi,Yi)可以知道目标函数 Y = a X + b Y=aX+b Y=aX+b与真实值的差距,通过修改 a a a和 b b b值来不断逼近真实值。
目标函数推广到抽象函数 f ( x , ω ) f(x,\omega) f(x,ω)
在一般情况下,最小二乘法的一般形式为
L
(
y
,
f
(
x
,
ω
)
)
=
∑
i
=
1
m
[
y
i
−
f
(
x
i
,
ω
i
)
]
2
\mathcal{L}(y,f(x,\omega))=\sum_{i=1}^{m}[y_i-f(x_i,\omega_i)]^2
L(y,f(x,ω))=i=1∑m[yi−f(xi,ωi)]2
机器学习方法自动迭代更新参数
使用机器学习的方法,根据给定的数据集来求得一元线性回归的目标函数 f ( x , ω ) f(x,\omega) f(x,ω)
首先,构造数据集
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
X = np.random.normal(size=(100,1),scale=1)
Y = 4 * X[:,0] + 2
我们制定了目标函数 f ( x ) = 4 x + 2 f(x)=4x+2 f(x)=4x+2
数据集构造好后,观察下数据的分布情况
plt.scatter(X,Y)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWVUTOvU-1609130636844)(D:\Program File(x86)]\DECADEMO\laterseason.com\图片归档\最小二乘法在一元一次线性回归和二元一次线性回归上的作用\image-20201105211715272.png)
这是100组 ( X , Y ) (X,Y) (X,Y)值的分布情况,可以看到它是有严格的一元线性关系的。
数据处理,拆分训练集与测试集
All_data = np.concatenate((X,Y.reshape(100,1)),axis=1)
np.random.shuffle(All_data)
train_data = All_data[:70,:]
test_data = All_data[70:,:]
随机初始化参数 w w w和 b b b
W = np.random.normal(size=(1))
b = np.random.rand()
W_hat = np.concatenate((W,np.array([b]))).reshape(2,1)
为偏置值 b b b给 X X X构造增广矩阵
X = train_data[:,:-1]
X = X.reshape(1,70)
Y = train_data[:,-1]
Y = Y.reshape(70,1)
X_hat = np.concatenate((X,np.ones((1,70))))
开始训练
训练过程:最小二乘法得到残差值 L o s s Loss Loss,梯度下降算法更新参数 ω \omega ω和 b b b
lr = 0.001
Num = 1
W_list = []
b_list = []
loss_list = []
while True:
# 更新参数
W_hat = W_hat + lr * np.dot(X_hat,(Y - np.dot(X_hat.T,W_hat)))
# 计算经验错误 loss
loss = np.sum( (Y - np.dot(X_hat.T,W_hat))**2 )/2
# 记录 w,b和loss
W_list.append(W_hat[0])
b_list.append(W_hat[1])
loss_list.append(loss)
Num = Num + 1
print("Num: %d, loss: %f, w: %f, b: %f"%(Num,loss,W_hat[0],W_hat[1]))
if loss < 1 or Num > 1000:
break
观察训练过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g4ISHhZJ-1609130636848)(D:\Program File(x86)]\DECADEMO\laterseason.com\图片归档\最小二乘法在一元一次线性回归和二元一次线性回归上的作用\image-20201105212425760.png)
可以看到,训练到50次左右时, ω \omega ω和 b b b已经很接近真实值了。
再看看残差值 L o s s Loss Loss的下降曲线
plt.plot(loss_list)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtuQajB3-1609130636852)(D:\Program File(x86)]\DECADEMO\laterseason.com\图片归档\最小二乘法在一元一次线性回归和二元一次线性回归上的作用\image-20201105212543694.png)
L o s s Loss Loss值在迭代次数达到30次之后,就逐渐平稳,这说明此时目标函数已经接近最优情况。
plt.plot(W_list)
plt.plot(b_list)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-unvD2cnB-1609130636857)(D:\Program File(x86)]\DECADEMO\laterseason.com\图片归档\最小二乘法在一元一次线性回归和二元一次线性回归上的作用\image-20201105212657022.png)
ω \omega ω和 b b b值的趋势也是如此。
一元线性回归对最小二乘法的总结
最小二乘法就是一种通过最小化误差的平方和来寻找最佳的函数匹配,这种思想不止可以应用在一元线性回归中,也可以应用在多元线性回归中。
但是我们目前看到的最小二乘算法在一元线性回归上的效果较好,我们也在二元线性回归中做了测试,结果并不乐观。