线性拟合之最小二乘法
关于最小二乘法
以下是百度百科的解释:最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
对于线性拟合,给定的具有线性关系的观测样本,可以通过最小二乘法求解得到线性模型。
一元线性回归模型求解
给定的观测数据 :(x1,y1),(x2,y1),(x3,y3)…(xn,yn),假设其存在着线性关系,线性模型为:
y
ˉ
=
w
x
+
b
\bar{y} = wx +b
yˉ=wx+b
优化目标函数为:
L
=
∑
i
=
1
n
(
y
i
−
y
i
ˉ
)
2
L = \sum^{n}_{i=1}(y_{i}-\bar{y_{i}})^{2}
L=i=1∑n(yi−yiˉ)2
即标签值和预测值之间的均方误差,所选择的回归模型应该使所有观察值的残差平方和达到最小,也就是 Least square。
将目标函数展开:
L
=
∑
i
=
1
n
(
y
i
−
(
w
x
i
+
b
)
)
2
L = \sum _{i=1} ^{n}(y_{i}-(wx_{i} + b)) ^{2}
L=i=1∑n(yi−(wxi+b))2
L
=
∑
i
=
1
n
(
y
i
−
w
x
i
−
b
)
2
L = \sum _{i=1} ^{n} (y_{i}-wx_{i}-b) ^{2}
L=i=1∑n(yi−wxi−b)2
此时,L是关于w 和 b 的函数,要使 L的值最小,由数学知识可知,可以通过求偏导令为0可解得,即:
∂
L
∂
w
=
2
∑
i
=
1
n
(
y
i
−
w
x
i
−
b
)
(
−
x
i
)
=
0
\frac{\partial L}{\partial w} = 2\sum_{i=1}^{n}(y_{i}-wx_{i}-b)(-x_{i})=0
∂w∂L=2i=1∑n(yi−wxi−b)(−xi)=0
∂
L
∂
b
=
2
∑
i
=
1
n
(
y
i
−
w
x
i
−
b
)
(
−
1
)
=
0
\frac{\partial L}{\partial b} = 2\sum_{i=1}^{n}(y_{i}-wx_{i}-b)(-1)=0
∂b∂L=2i=1∑n(yi−wxi−b)(−1)=0
b
=
∑
i
=
1
n
y
i
−
w
∑
i
=
1
n
x
i
n
b = \frac{\sum_{i=1}^{n}y_{i}-w\sum_{i=1}^{n}x_{i}}{n}
b=n∑i=1nyi−w∑i=1nxi
记:
y
ˉ
=
1
n
∑
i
=
1
n
y
i
\bar{y} = \frac{1}{n}\sum_{i=1}^{n}y_{i}
yˉ=n1i=1∑nyi
x
ˉ
=
1
n
∑
i
=
1
n
x
i
\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_{i}
xˉ=n1i=1∑nxi
则
b
=
y
ˉ
−
w
x
ˉ
b = \bar{y} - w\bar{x}
b=yˉ−wxˉ
同理可得:
w
=
∑
i
=
1
n
x
i
y
i
−
n
x
ˉ
y
ˉ
∑
i
=
1
n
x
i
2
−
n
x
ˉ
2
w = \frac{\sum_{i=1}^{n}x_{i}y_{i}-n\bar{x}\bar{y}}{\sum_{i=1}^{n}x_{i}^{2}-n\bar{x}^{2}}
w=∑i=1nxi2−nxˉ2∑i=1nxiyi−nxˉyˉ
即可求得w,b。
最小二乘实现
一元最小二乘法
由上面的 w 可以看出,整个计算结果依赖于
x
ˉ
\bar{x}
xˉ,
y
ˉ
\bar{y}
yˉ,
x
i
y
i
x_{i}y_{i}
xiyi,
x
i
2
x_{i}^{2}
xi2
python测试代码如下:
import matplotlib.pyplot as plt
import numpy as np
class Least_square:
weight = 0
bias = 0
def get_weight(self):
return self.weight
def get_bias(self):
return self.bias
def least_square(self,x,y):
if len(x)!= len(y):
print('data error')
return
x_ = 0
y_ = 0
x_mul_y = 0
x_2 = 0
n = len(x)
for i in range(n):
x_ = x[i] + x_
y_ = y[i] + y_
x_mul_y = x[i]*y[i] + x_mul_y
x_2 = x[i]*x[i] + x_2
x_ = x_ / n
y_ = y_ / n
self.weight = (x_mul_y - n*x_*y_)/(x_2 - n*x_*x_)
self.bias = y_ - self.weight*x_
def fun_plot(self):
data_x = np.linspace(0,10,20)
data_y = [self.weight * x +self.bias for x in data_x]
print('y='+str(self.weight)+'x+'+str(self.bias))
plt.plot(data_x,data_y)
plt.show()
test = Least_square()
x = np.array([1,2,3,6,1.5,4,7,4.3,9.2])
y = np.array([2,1.5,4,7,1.8,5.3,8.6,5.6,11])
plt.plot(x,y,'ro')
test.least_square(x,y)
test.fun_plot()
运行结果示例:
因为最小二乘法是对所有数据进行拟合,寻找到所有点的误差最小的直线,当数据不存在大的异常点时,效果应该是很好的。
如下图,当增加一个明显的异常点(蓝色点)时,拟合的直线会靠向异常点
多元线性回归模型
百度百科:在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。
记多元线性回归模型为:
y
=
w
0
+
w
1
x
i
1
+
w
2
x
i
2
+
.
.
.
+
w
p
x
i
p
y = w_{0}+w_{1}x_{i1}+w_{2}x_{i2}+...+w_{p}x_{ip}
y=w0+w1xi1+w2xi2+...+wpxip
已有的观测数据:
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
.
.
.
(
x
n
,
y
n
)
(x_{1},y_{1}),(x_{2},y_{2})...(x_{n},y_{n})
(x1,y1),(x2,y2)...(xn,yn),其中
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
p
)
x_{i} = (x_{i1},x_{i2},...,x_{ip})
xi=(xi1,xi2,...,xip)
最小化残差平方和函数:
L
=
∑
i
=
1
n
(
y
i
−
y
i
ˉ
)
2
L = \sum^{n}_{i=1}(y_{i}-\bar{y_{i}})^{2}
L=i=1∑n(yi−yiˉ)2
L
=
∑
i
=
1
n
(
y
i
−
w
0
−
w
1
x
i
1
−
w
2
x
i
2
−
.
.
.
−
w
p
x
i
p
)
2
L = \sum _{i=1} ^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip}) ^{2}
L=i=1∑n(yi−w0−w1xi1−w2xi2−...−wpxip)2
求偏导:
∂
L
∂
w
j
=
2
∑
i
=
1
n
(
y
i
−
w
0
−
w
1
x
i
1
−
w
2
x
i
2
−
.
.
.
−
w
p
x
i
p
)
(
−
x
i
j
)
=
0
,
j
=
[
1
,
p
]
\frac{\partial L}{\partial w_{j}} = 2\sum_{i=1}^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip})(-x_{ij})=0,j = [1,p]
∂wj∂L=2i=1∑n(yi−w0−w1xi1−w2xi2−...−wpxip)(−xij)=0,j=[1,p]
∂
L
∂
w
0
=
2
∑
i
=
1
n
(
y
i
−
w
0
−
w
1
x
i
1
−
w
2
x
i
2
−
.
.
.
−
w
p
x
i
p
)
(
−
1
)
=
0
\frac{\partial L}{\partial w_{0}} = 2\sum_{i=1}^{n}(y_{i}-w_{0}-w_{1}x_{i1}-w_{2}x_{i2}-...-w_{p}x_{ip})(-1)=0
∂w0∂L=2i=1∑n(yi−w0−w1xi1−w2xi2−...−wpxip)(−1)=0
然后写成:
{
∑
y
i
=
n
w
0
+
∑
x
i
1
w
1
+
.
.
.
+
∑
x
i
p
w
p
∑
x
i
1
y
i
=
∑
x
i
1
w
0
+
∑
x
i
1
2
w
1
+
.
.
.
+
∑
x
i
1
x
i
p
w
p
.
.
.
∑
x
i
p
y
i
=
∑
x
i
p
w
0
+
∑
x
i
p
x
i
1
w
1
+
.
.
.
+
∑
x
i
p
2
w
p
\left\{ \begin{array}{lr} \sum y_{i}=nw_{0}+ \sum x_{i1}w_{1}+...+\sum x_{ip}w_{p}\\ \sum x_{i1}y_{i} = \sum x_{i1}w_{0}+\sum x_{i1}^{2}w_{1}+...+\sum x_{i1}x_{ip}w_{p} \\ ...\\ \sum x_{ip}y_{i} = \sum x_{ip}w_{0}+\sum x_{ip}x_{i1}w_{1}+...+\sum x_{ip}^{2}w_{p} & \end{array} \right.
⎩⎪⎪⎨⎪⎪⎧∑yi=nw0+∑xi1w1+...+∑xipwp∑xi1yi=∑xi1w0+∑xi12w1+...+∑xi1xipwp...∑xipyi=∑xipw0+∑xipxi1w1+...+∑xip2wp
矩阵形式:
X
′
X
W
=
X
′
Y
X'XW=X'Y
X′XW=X′Y
W
=
(
X
′
X
)
−
1
X
′
Y
W = (X'X)^{-1}X'Y
W=(X′X)−1X′Y
这是一个通用的形式,管它几元都行。写成这样的形式,用numpy的mat计算就更方便了,代码就更简单了(前段时间的网易笔试题就让编多元最小二乘,哎,自己推半天,还错了,哈哈),数学真的太重要了!!!
(也可按照上面一元的去自己推,不过太麻烦了,三元的我就在草稿纸上写了好多。。。)
参考:1.百度百科