从零开始的数模学习(8):拟合方法(预测模型)

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 yii=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=1nδi2=i=1n[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}) ajJ=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=1nrj(xi)[k=1makrk(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)=RAY2
Matlab中线性最小二乘的标准型为 Min ⁡ A ∥ R A − Y ∥ 2 2 \operatorname{Min}_{A}\|R A-Y\|_{2}^{2} MinARAY22
命令为 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)

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=1mfi2(x),xRn
其中 x = [ x 1 , ⋯   , x n ] T x=\left[x_{1}, \cdots, x_{n}\right]^{T} x=[x1,,xn]T,一般假设 m ≥ n m\ge n mn。把极小化这类函数的问题 min ⁡ F ( x ) = ∑ i = 1 m f i 2 ( x ) \min F(x)=\sum_{i=1}^{m} f_{i}^{2}(x) minF(x)=i=1mfi2(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} xminF(x,xdata)ydata22=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} minF(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} minCxd22,Matlab中此函数的基本调用格式为 x = l s q n o n n e g ( C , d ) x=lsqnonneg(C,d) x=lsqnonneg(C,d)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值