1 曲线拟合的线性最小二乘法
1.1 线性最小二乘法
曲线拟合问题的提法是,已知一组(二维)数据,即平面上的
n
n
n个点
(
x
i
,
y
i
)
,
i
=
1
,
2
,
⋯
,
n
(x_{i},y_{i}),i = 1,2,\cdots,n
(xi,yi),i=1,2,⋯,n,x_{i}互不相同,寻求一个函数(曲线)
y
=
f
(
x
)
y=f(x)
y=f(x),使
f
(
x
)
f(x)
f(x),在某种准则下与所有的数据点最为接近,即曲线拟合得最好。
线性最小二乘法是解决曲线拟合最常用的方法,基本思路是,令
f
(
x
)
=
a
i
r
1
(
x
)
+
a
2
r
2
(
x
)
+
⋯
+
a
m
r
m
(
x
)
f(x) = a_{i}r_{1}(x)+a_{2}r_{2}(x)+\cdots+a_{m}r_{m}(x)
f(x)=air1(x)+a2r2(x)+⋯+amrm(x),其中
r
k
(
x
)
r_{k}(x)
rk(x)是实现选定的一组线性无关的函数,
a
k
a_{k}
ak是待定系数
(
k
=
1
,
2
,
⋯
,
m
,
m
<
n
)
(k=1,2,\cdots,m,m<n)
(k=1,2,⋯,m,m<n)。拟合准则是使
y
i
,
i
=
1
,
2
,
⋯
,
n
y_{i},i=1,2,\cdots,n
yi,i=1,2,⋯,n与
f
(
x
i
)
f(x_{i})
f(xi)的距离
δ
i
\delta _{i}
δi的平方和最小,称为最小二乘准则。
1.1.1 系数 a k a_{k} ak的确定
记
J
(
a
1
,
⋯
,
a
m
)
=
∑
i
=
1
n
δ
i
2
=
∑
i
=
1
n
[
f
(
x
i
)
−
y
i
]
2
J\left(a_{1}, \cdots, a_{m}\right)=\sum_{i=1}^{n} \delta_{i}^{2}=\sum_{i=1}^{n}\left[f\left(x_{i}\right)-y_{i}\right]^{2}
J(a1,⋯,am)=i=1∑nδi2=i=1∑n[f(xi)−yi]2为求
a
1
,
⋯
,
a
m
a_{1}, \cdots, a_{m}
a1,⋯,am使得
J
J
J达到最小,只需要利用极值的必要条件
∂
J
∂
a
j
=
0
(
j
=
1
,
⋯
,
m
)
\frac{\partial \boldsymbol{J}}{\partial \boldsymbol{a}_{j}}=\mathbf{0}(\boldsymbol{j}=\mathbf{1}, \cdots, \boldsymbol{m})
∂aj∂J=0(j=1,⋯,m),得到关于
a
1
,
⋯
,
a
m
a_{1}, \cdots, a_{m}
a1,⋯,am的线性方程式
∑
i
=
1
n
r
j
(
x
i
)
[
∑
k
=
1
m
a
k
r
k
(
x
i
)
−
y
i
]
=
0
,
(
j
=
1
,
⋯
,
m
)
,
\sum_{i=1}^{n} r_{j}\left(x_{i}\right)\left[\sum_{k=1}^{m} a_{k} r_{k}\left(x_{i}\right)-y_{i}\right]=0, \quad(j=1, \cdots, m),
i=1∑nrj(xi)[k=1∑makrk(xi)−yi]=0,(j=1,⋯,m),
记
R
=
[
r
1
(
x
1
)
⋯
r
m
(
x
1
)
⋮
⋮
⋮
r
1
(
x
n
)
⋯
r
m
(
x
n
)
]
n
×
m
,
A
=
[
a
1
,
⋯
,
a
m
]
T
,
Y
=
[
y
1
,
⋯
,
y
n
]
T
,
\begin{aligned} R &=\left[\begin{array}{ccc} r_{1}\left(x_{1}\right) & \cdots & r_{m}\left(x_{1}\right) \\ \vdots & \vdots & \vdots \\ r_{1}\left(x_{n}\right) & \cdots & r_{m}\left(x_{n}\right) \end{array}\right]_{n \times m}, \\ A &=\left[a_{1}, \cdots, a_{m}\right]^{T}, \quad Y=\left[y_{1}, \cdots, y_{n}\right]^{T}, \end{aligned}
RA=
r1(x1)⋮r1(xn)⋯⋮⋯rm(x1)⋮rm(xn)
n×m,=[a1,⋯,am]T,Y=[y1,⋯,yn]T,
上面的方程组可以表示为
R
T
R
A
=
R
T
Y
\boldsymbol{R}^{T} \boldsymbol{R} \boldsymbol{A}=\boldsymbol{R}^{T} \boldsymbol{Y}
RTRA=RTY
当
{
r
1
(
x
)
,
⋯
,
r
m
(
x
)
}
\left\{r_{1}(x), \cdots, r_{m}(x)\right\}
{r1(x),⋯,rm(x)}线性无关时,R列满秩,
R
T
R
R^{T} R
RTR可逆,于是上面的方程组有唯一解
A
=
(
R
T
R
)
−
1
R
T
Y
A=\left(R^{T} R\right)^{-1} R^{T} Y
A=(RTR)−1RTY
1.1.2 函数 r k ( x ) r_{k}(x) rk(x)的选取
面对一组数据
(
x
i
,
y
i
)
,
i
=
1
,
2
,
⋯
,
n
(x_{i},y_{i}),i=1,2,\cdots,n
(xi,yi),i=1,2,⋯,n,用线性最小二乘法做曲线拟合时,首要的也是关键的一步是恰当地选取
r
1
(
x
)
,
⋯
,
r
m
(
x
)
r_{1}(x), \cdots, r_{m}(x)
r1(x),⋯,rm(x)。如果通过机理分析,能够知道
y
y
y与
x
x
x之间应该有什么样的函数关系,则
r
1
(
x
)
,
⋯
,
r
m
(
x
)
r_{1}(x), \cdots, r_{m}(x)
r1(x),⋯,rm(x)容易确定。若无法知道
y
y
y和
x
x
x之间的关系,通常可以将数据
(
x
i
,
y
i
)
,
i
=
1
,
2
,
⋯
,
n
\left(x_{i}, y_{i}\right), i=1,2, \cdots, n
(xi,yi),i=1,2,⋯,n作图,直观地判断应该用什么样的曲线去作拟合。
人们常用的曲线有
(1) 直线
y
=
a
1
x
+
a
2
;
y=a_{1} x+a_{2} ;
y=a1x+a2;
(2) 多项式
y
=
a
1
x
m
+
⋯
+
a
m
x
+
a
m
+
1
(
一般
m
=
2
,
3
,
不宜太高)
;
y=a_{1} x^{m}+\cdots+a_{m} x+a_{m+1} (一般 m=2,3 , 不宜太高);
y=a1xm+⋯+amx+am+1(一般m=2,3,不宜太高);
(3) 双曲线 (一支)
y
=
a
1
x
+
a
2
;
y=\frac{a_{1}}{x}+a_{2} ;
y=xa1+a2;
(4) 指数曲线
y
=
a
1
e
a
2
x
y=a_{1} e^{a_{2} x}
y=a1ea2x。
对于指数曲线,拟合前需做变量代换,化为对
a
1
a_{1}
a1,
a
2
a_{2}
a2的线性函数。
已知一组数据,用什么样的曲线拟合最好,可以在直观判断的基础上,选几种曲线分别拟合,然后比较,看哪一条曲线的最小二乘指标
J
J
J最小。
2 最小二乘法的Matlab实现
2.1 解方程组方法
在上面的记号下,
J
(
a
1
,
⋯
,
a
m
)
=
∥
R
A
−
Y
∥
2
J\left(a_{1}, \cdots, a_{m}\right)=\|R A-Y\|^{2}
J(a1,⋯,am)=∥RA−Y∥2
Matlab中线性最小二乘的标准型为
Min
A
∥
R
A
−
Y
∥
2
2
\operatorname{Min}_{A}\|R A-Y\|_{2}^{2}
MinA∥RA−Y∥22
命令为
A
=
R
\
Y
A=R \backslash Y
A=R\Y
2.2 多项式拟合方法
如果取
{
r
1
(
x
)
,
⋯
,
r
m
+
1
(
x
)
}
=
{
1
,
x
,
⋯
,
x
m
}
\left\{r_{1}(x), \cdots, r_{m+1}(x)\right\}=\left\{1, x, \cdots, x^{m}\right\}
{r1(x),⋯,rm+1(x)}={1,x,⋯,xm},即用
m
m
m次多项式拟合给定数据,Matlab中有现成的函数
a
=
polyfit
(
x
0
,
y
0
,
m
)
a=\text { polyfit }(x 0, y 0, m)
a= polyfit (x0,y0,m)其中输入参数
x
0
,
y
0
x0,y0
x0,y0为要拟合的数据,
m
m
m为拟合多项式的次数,输出参数
a
a
a为拟合多项式
y
=
a
(
1
)
x
m
+
…
+
a
(
m
)
x
+
a
(
m
+
1
)
y=a(1) x^{m}+\ldots+a(m) x+a(m+1)
y=a(1)xm+…+a(m)x+a(m+1)的系数向量
a
=
[
a
(
1
)
,
…
,
a
(
m
)
,
a
(
m
+
1
)
]
a=[a(1), \ldots, a(m), a(m+1)]
a=[a(1),…,a(m),a(m+1)]。
多项式在
x
x
x处的值
y
y
y可用下面的函数计算
y
=
polyval
(
a
,
x
)
o
y=\text { polyval }(a, x)_{\text {o }}
y= polyval (a,x)o
2.3 最小二乘优化
在无约束最优化问题中,有些重要的特殊情形,比如目标函数有若干个函数的平方和构成。这一类函数一般可以写成
F
(
x
)
=
∑
i
=
1
m
f
i
2
(
x
)
,
x
∈
R
n
F(x)=\sum_{i=1}^{m} f_{i}^{2}(x), x \in R^{n}
F(x)=i=1∑mfi2(x),x∈Rn
其中
x
=
[
x
1
,
⋯
,
x
n
]
T
x=\left[x_{1}, \cdots, x_{n}\right]^{T}
x=[x1,⋯,xn]T,一般假设
m
≥
n
m\ge n
m≥n。把极小化这类函数的问题
min
F
(
x
)
=
∑
i
=
1
m
f
i
2
(
x
)
\min F(x)=\sum_{i=1}^{m} f_{i}^{2}(x)
minF(x)=i=1∑mfi2(x)
称为最小二乘化问题。
最小二乘化是一类比较特殊的优化问题,在处理这类问题时,Matlab也提供了一些强大的函数。在Matlab优化工具箱中,由于求解最小二乘化优化问题的函数有lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg,下面介绍这些函数的用法。
2.3.1 lsqcurvefit函数
给定输入输出数列xdata,ydata,求参量x,使得
min
x
∥
F
(
x
,
x
d
a
t
a
)
−
y
d
a
t
a
∥
2
2
=
∑
i
(
F
(
x
,
x
d
a
t
a
i
)
−
y
d
a
a
i
)
2
\min _{x}\|F(x, x d a t a)-y d a t a\|_{2}^{2}=\sum_{i}\left(F\left(x, x d a t a_{i}\right)-y d a a_{i}\right)^{2}
xmin∥F(x,xdata)−ydata∥22=i∑(F(x,xdatai)−ydaai)2
Matlab中的函数为
x
=
lsqcurvefit(fun,
x
0
,
x
d
a
t
a
,
y
d
a
t
a
,
l
b
,
u
b
,
o
p
t
i
o
n
s
)
x=\text { lsqcurvefit(fun, } x 0, x d a t a, y d a t a, l b, u b, o p t i o n s)
x= lsqcurvefit(fun, x0,xdata,ydata,lb,ub,options)
其中
f
u
n
fun
fun是定义函数
F
(
x
,
x
d
a
t
a
)
F(x,xdata)
F(x,xdata)的M文件。
2.3.2 lsqnonlin 函数
已知函数向量
F
(
x
)
=
[
f
1
,
⋯
,
f
k
]
T
F(x)=\left [ f_{1} ,\cdots,f_{k}\right ]^{T}
F(x)=[f1,⋯,fk]T,求x使得
m
i
n
∥
F
(
x
)
∥
2
2
min\left \| F(x) \right \|_{2}^{2}
min∥F(x)∥22
Matlab中的函数为
x
=
l
s
q
n
o
n
l
i
n
(
f
u
n
,
x
0
,
l
b
,
u
b
,
o
p
t
i
o
n
s
)
x=lsqnonlin(fun,x0,lb,ub,options)
x=lsqnonlin(fun,x0,lb,ub,options)
其中
f
u
n
fun
fun是定义向量函数
F
(
x
)
F(x)
F(x)的
M
M
M文件。
2.3.3 lsqnonneg 函数
求解非负的 x x x,使得满足 m i n ∥ C x − d ∥ 2 2 min\left\| Cx-d \right\|_{2}^{2} min∥Cx−d∥22,Matlab中此函数的基本调用格式为 x = l s q n o n n e g ( C , d ) x=lsqnonneg(C,d) x=lsqnonneg(C,d)。