最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
几个关键字: 优化技术
,最小误差的平方和
, 最佳函数
, 曲线拟合
1、线性最小二乘的基本公式
考虑超定方程组(超定指未知数小于方程个数):
∑
j
=
1
n
X
i
j
β
j
=
y
i
,
(
i
=
1
,
2
,
3...
m
)
\sum_{j=1}^nX_{ij}\beta_j=y_i,(i=1,2,3...m)
j=1∑nXijβj=yi,(i=1,2,3...m)
其中m代表有m个等式,n代表有 n 个未知数 ,m>n ;将其进行向量化后为:
X
β
=
y
X\beta=y
Xβ=y
, ,
显然该方程组一般而言没有解,所以为了选取最合适的
β
\beta
β 让该等式"尽量成立",引入残差平方和函数S :
S
(
β
)
=
∥
X
β
−
y
∥
S(\beta)=\lVert{X\beta-y}\rVert
S(β)=∥Xβ−y∥
(在统计学中,残差平方和函数可以看成n倍的均方误差MSE)
当
β
=
β
^
\beta=\hat{\beta}
β=β^ 时,
S
(
β
)
S(\beta)
S(β) 取最小值,通过对
S
(
β
)
S(\beta)
S(β) 进行微分求最值,可以得到:
X
T
X
β
^
=
X
T
y
X^TX\hat{\beta}=X^Ty
XTXβ^=XTy
如果矩阵 X T X X^TX XTX 非奇异则 β \beta β有唯一解:
β ^ = ( X T X ) − 1 X T y \hat{\beta}=(X^TX)^{-1}X^Ty β^=(XTX)−1XTy
2、一元线性回归
一元线性回归,表示只有一个因变量,从数学公式来说就是一条直线,数学公式: y = a x + b y=ax+b y=ax+b
现在生成 100 组模拟数据,这些数据为 y = 0.5 ∗ x + 0.5 , ( a = 0.5 , b = 0.5 ) y=0.5*x + 0.5, (a=0.5, b=0.5) y=0.5∗x+0.5,(a=0.5,b=0.5) 直线附近的散点。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
g = np.random.normal(0, 0.01, 100)
x = np.linspace(0,1,100)
a = 0.5
b = 0.5
y = x*a + b
y2 = y + g
plt.plot(x, y)
plt.scatter(x, y2, color='red')
plt.grid()
plt.title("linear regression")
plt.show()
上面的代码可见,y 数组中的点都分布在直线上,而 y2 数组中的点与直线有一定的偏离,偏离值符合期望为 0,标准差为 0.01 的正态分布。
问题是,如果我们已知 y2 数组中的值,如何去拟合并求得最终的一元线性方程呢?
监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。对于二维空间线性是一条直线;对于三维空间线性是一个平面,对于多维空间线性是一个超平面。
最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。
最常用的是普通最小二乘法(Ordinary Least Square,OLS):所选择的回归模型应该使所有观察值的残差平方和达到最小。(Q为残差平方和)- 即采用平方损失函数。
样本回归模型:
其中 e i e_i ei 为样本 $(X_i, Y_i) $ 的误差。
对平方损失函数求偏导,函数的极值点为偏导为 0 的点,最后可得:
实例
数据编号 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
x | 0.1 | 0.1 | 0.2 | 0.3 | 0.4 |
y | 1.1 | 1.1 | 1.9 | 3.1 | 3.9 |
∑
i
=
1
5
X
i
\displaystyle\sum_{i=1}^5X_i
i=1∑5Xi = 0.1+0.1+0.2+0.3+0.4 = 1.1
∑
i
=
1
5
X
i
2
\displaystyle\sum_{i=1}^5X_i^2
i=1∑5Xi2 = 0.01 + 0.01 + 0.04 + 0.09 + 0.16 = 0.31
∑
i
=
1
5
X
i
Y
i
\displaystyle\sum_{i=1}^5X_iY_i
i=1∑5XiYi = 3.09
∑
i
=
1
5
Y
i
\displaystyle\sum_{i=1}^5Y_i
i=1∑5Yi = 11.1
结合公式可以算法直线方程为 : y = 0.1235 + 9.5294 x y=0.1235+9.5294x y=0.1235+9.5294x
使用 Java Math3 中的 SimpleRegression 来验证计算结果:
SimpleRegression regression = new SimpleRegression();
regression.addData(0.1d, 1.1);
regression.addData(0.1d, 1.1);
regression.addData(0.2d, 1.9);
regression.addData(0.3d, 3.1);
regression.addData(0.4d, 3.9);
System.out.println(regression.getIntercept()); //0.12352941176470651
System.out.println(regression.getSlope());//9.529411764705879
3、最小二乘法的矩阵形式
最小二乘法的矩阵形式为: A x = b Ax=b Ax=b
其中 A 为 n × k n{\times}k n×k 的矩阵, x 为 k × 1 k{\times}1 k×1 的列向量, b 为 为 n × 1 n{\times}1 n×1 的列向量。
正常来看,这个方程是没有解的,但在数值计算领域,我们通常是计算 m i n ∥ A x − b ∥ min\lVert{Ax-b}\rVert min∥Ax−b∥ ,解出其中的 x 。比较直观的做法是求解 A T A x = A T b A^TAx=A^Tb ATAx=ATb,但通常比较低效。
其中一种常见的解法是对 A 进行QR分解(
A
=
Q
R
A=QR
A=QR ),其中 Q 是
n
×
k
n{\times}k
n×k 正交矩阵(Orthonormal Matrix),R 是
k
×
k
k{\times}k
k×k 上三角矩阵(Upper Triangular Matrix),则有:
m
i
n
∥
A
x
−
b
∥
=
m
i
n
∥
Q
R
x
−
b
∥
=
m
i
n
∥
R
x
−
Q
−
1
b
∥
min\lVert{Ax-b}\rVert=min\lVert{QRx-b}\rVert=min\lVert{Rx-Q^{-1}b}\rVert
min∥Ax−b∥=min∥QRx−b∥=min∥Rx−Q−1b∥