最小二乘法函数拟合原理及matlab实现—数学笔记
最小二乘法函数拟合原理及matlab实现——数学笔记提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录最小二乘法函数拟合原理及matlab实现前言一、拟合标准1.使偏差向量满足111-范数2.使偏差向量满足∞\infty∞-范数3.使偏差向量满足222-范数二、最小二乘法原理1.最小二乘法 拟合 多项式(常用)2.最小二乘法的一般形式三、最小二乘法应用(matlab)1.自行
最小二乘法函数拟合原理及matlab实现
——数值分析数学笔记
如有纰漏,欢迎指正
前言
对大量实验数据
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi) 如何寻找一个合适的函数
y
=
f
(
x
)
y=f(x)
y=f(x) 来近似的描述呢?
所谓 “合适” :要求
y
=
f
(
x
)
y=f(x)
y=f(x) 最能反应数据点的总体趋势
Tips: 第一节和第二节皆是数学推导,可跳过直接看第三节的应用。
以下为正文
既然是分析实验数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi) ,那么数据有什么特点及要求呢?
- 实验数据并不是准确无误,存在误差。
- 实验数据较多甚至很多。
- 数据的采样基本能够反应 x x x 与 y y y 的对应关系。
对于第一个特点,假设我们构造出了一个函数,结果发现很多甚至所有的实验数据都不在函数图像上?这合适吗?这很合适!因为带有误差的实验数据落在了函数曲线上,那就说明我们的曲线是存在误差的。如果我们得到的数据(一定不是实验的数据,可能是经过计算得到的数据)能够保证准确无误。那么应该优先考虑通过插值的方法构造函数。
对于第二个特点,若是实验数据很少,我们能否强行构造函数呢?能,但构造出的函数是没有意义的,它不能体现总体水平。因此我们需要大量的实验数据。
对于第三个特点,如果
x
x
x 与
y
y
y 本就毫无关系,又何谈“构造函数来近似描述”呢?
假设我们的实验数据具备以上特征,要如何才能构造出了一个函数 最能反应数据点的总体趋势“ 呢?什么叫最能? 你画 一条拟合函数,我画一条拟合函数都可以说是“最能”,因此我们需要确定一个标准。
一、拟合标准
实验值: y i y_i yi
拟合值: y i ∗ y_i^* yi∗
偏差(拟合值与实验值之差): r i = y i − y i ∗ ( i = 1 , 2 , 3 , . . . , m ) r_i=y_i-y_i^*\quad( i=1,2,3,...,m) ri=yi−yi∗(i=1,2,3,...,m) 注意在数理统计中,偏差又称残差,不是误差!
记偏差向量: r = ( r 1 , r 2 , . . . , r m ) \boldsymbol{r}=(r_1,r_2,...,r_m) r=(r1,r2,...,rm) (这能记录每个数据点的偏差,即总体)
1.使偏差向量满足 1 1 1 - 范数
数学表达式: ∑ i = 1 m ∣ r i ∣ = ∣ r 1 ∣ + ∣ r 2 ∣ + . . . + ∣ r m ∣ = m i n \sum_{i=1}^m|\boldsymbol{r_i}|=|r_1|+|r_2|+...+|r_m|=min i=1∑m∣ri∣=∣r1∣+∣r2∣+...+∣rm∣=min
通俗的讲就是:要求每个实验数据的偏差绝对值之和最小。 这个标准很容易想到,也很合适,但在导出拟合函数的过程中,运算很麻烦,暂且抛弃该标准。
2.使偏差向量满足 ∞ \infty ∞ - 范数
数学表达式: m a x ∣ r i ∣ = m i n max|\boldsymbol{r_i}|=min max∣ri∣=min
通俗的讲就是:在所有的实验数据 ( r 1 , r 2 , . . . , r n ) (r_1,r_2,...,r_n) (r1,r2,...,rn) 中找到最大的 r m a x r_{max} rmax ,要求这个 r m a x r_{max} rmax 最小,即最大的偏差都最小。 既然最大的偏差都最小了,这个标准非常合适。这种拟合方式称之为最佳一致逼近。(但不是本文的内容,也暂不讨论)
3.使偏差向量满足 2 2 2 - 范数
数学表达式: ∑ i = 1 m r i 2 = r 1 2 + r 2 2 + . . . + r m 2 = m i n \sqrt{\sum_{i=1}^m\boldsymbol{r_i^2}}=\sqrt{r_1^2+r_2^2+...+r_m^2}=min i=1∑mri2=r12+r22+...+rm2=min
通俗的讲就是:先把每个实验数据的偏差求平方,然后要求这些偏差平方的和最小。 这个标准通过平方把偏差放大,又要求偏差的平方之和开根号最小,因此很合适。而且该法在之后导出拟合函数的过程中,运算也不麻烦。这种拟合方式称之为最佳平方逼近。也称曲线拟合的最小二乘法
自此我们确立了三个拟合的标准。下面就曲线拟合的最小二乘法导出拟合的公式。
二、最小二乘法原理
1.最小二乘法 多项式拟合(常用)
要构造函数,首先确定函数类别。几个基本的函数类:多项式函数、三角函数、指数函数…这里我们选择多项式函数。
在众多函数类中,为什么选择多项式函数?因为多项式函数的好处多多:运算简便,次数越高拟合结果越好(注意不能过高)
1.1最小二乘法的多项式拟合公式 推导。
假设 n 次多项式函数 P n ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n Pn(x)=a0+a1x+a2x2+...+anxn 就是想要的拟合函数,那么每个数据的偏差 r i r_i ri 可以表示为:
r i = ( P n ( x i ) − y i ) ( i = 1 , 2 , 3 , . . . , m ) r_i=(P_n(x_i)-y_i)\quad\quad(i=1,2,3,...,m) ri=(Pn(xi)−yi)(i=1,2,3,...,m)
且满足最小二乘(最佳平方逼近)的拟合标准,则有:
∑ i = 1 m ( P n ( x i ) − y i ) 2 = m i n ( i = 1 , 2 , 3 , . . . , m ) \sqrt{\sum_{i=1}^m(P_n(x_i)-y_i)^2}=min\quad\quad(i=1,2,3,...,m) i=1∑m(Pn(xi)−yi)2=min(i=1,2,3,...,m)
(这表示m个数据点的偏差平方的和最小
令 F ( a 0 , a 1 , . . . , a n ) = ∑ i = 1 m ( P n ( x i ) − y i ) 2 F(a_0,a_1,...,a_n)=\sum_{i=1}^m(P_n(x_i)-y_i)^2 F(a0,a1,...,an)=∑i=1m(Pn(xi)−yi)2 注意这里对于函数 F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an),未知量是 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an。上述拟合标准等效于:
当 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an 取的何值时, F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an) 取得最小值。
至此,问题转化为了求多元函数极值点了,首先对多元函数
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
F(a_0,a_1,...,a_n)
F(a0,a1,...,an) 求偏导并令导数值为0,求出驻点:
{
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
0
=
0
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
1
=
0
⋮
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
n
=
0
\begin{cases} \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_0}=0\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_1}=0\\ &&&&\vdots\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_n}=0& \end{cases}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂a0∂F(a0,a1,...,an)=0∂a1∂F(a0,a1,...,an)=0∂an∂F(a0,a1,...,an)=0⋮
可导出如下n元线性方程组(省略繁杂的过程)
⇒
\Rightarrow
⇒
{
m
a
0
+
(
∑
i
=
1
m
x
i
)
a
1
+
(
∑
i
=
1
m
x
i
2
)
a
2
+
.
.
.
+
(
∑
i
=
1
m
x
i
n
)
a
n
=
∑
i
=
1
m
y
i
(
∑
i
=
1
m
x
i
)
a
0
+
(
∑
i
=
1
m
x
i
2
)
a
1
+
(
∑
i
=
1
m
x
i
3
)
a
2
+
.
.
.
+
(
∑
i
=
1
m
x
i
(
n
+
1
)
a
n
=
∑
i
=
1
m
x
i
y
i
(
∑
i
=
1
m
x
i
2
)
a
0
+
(
∑
i
=
1
m
x
i
3
)
a
1
+
(
∑
i
=
1
m
x
i
4
)
a
2
+
.
.
.
+
(
∑
i
=
1
m
x
i
(
n
+
2
)
a
n
=
∑
i
=
1
m
x
i
2
y
i
⋮
(
∑
i
=
1
m
x
i
n
)
a
0
+
(
∑
i
=
1
m
x
i
n
+
1
)
a
1
+
(
∑
i
=
1
m
x
i
n
+
2
)
a
2
+
.
.
.
+
(
∑
i
=
1
m
x
i
(
n
+
n
)
a
n
=
∑
i
=
1
m
x
i
n
y
i
\begin{cases} ma_0+(\sum_{i=1}^mx_i)a_1+(\sum_{i=1}^mx_i^2)a_2+...+(\sum_{i=1}^mx_i^n)a_n=\sum_{i=1}^my_i\\ (\sum_{i=1}^mx_i)a_0+(\sum_{i=1}^mx_i^2)a_1+(\sum_{i=1}^mx_i^3)a_2+...+(\sum_{i=1}^mx_i^{(n+1)}a_n=\sum_{i=1}^mx_iy_i\\ (\sum_{i=1}^mx_i^2)a_0+(\sum_{i=1}^mx_i^3)a_1+(\sum_{i=1}^mx_i^4)a_2+...+(\sum_{i=1}^mx_i^{(n+2)}a_n=\sum_{i=1}^mx_i^2y_i\\ &&&&\vdots\\ (\sum_{i=1}^mx_i^n)a_0+(\sum_{i=1}^mx_i^{n+1})a_1+(\sum_{i=1}^mx_i^{n+2})a_2+...+(\sum_{i=1}^mx_i^{(n+n)}a_n=\sum_{i=1}^mx_i^ny_i\\ \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧ma0+(∑i=1mxi)a1+(∑i=1mxi2)a2+...+(∑i=1mxin)an=∑i=1myi(∑i=1mxi)a0+(∑i=1mxi2)a1+(∑i=1mxi3)a2+...+(∑i=1mxi(n+1)an=∑i=1mxiyi(∑i=1mxi2)a0+(∑i=1mxi3)a1+(∑i=1mxi4)a2+...+(∑i=1mxi(n+2)an=∑i=1mxi2yi(∑i=1mxin)a0+(∑i=1mxin+1)a1+(∑i=1mxin+2)a2+...+(∑i=1mxi(n+n)an=∑i=1mxinyi⋮
这个方程组称之为法方程组,注意到
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
F(a_0,a_1,...,a_n)
F(a0,a1,...,an) 是二次非负函数没有最大值,故驻点必为极小值点。解该法方程组就能得到多项式函数的系数
a
0
,
a
1
,
.
.
.
,
a
n
a_0,a_1,...,a_n
a0,a1,...,an ,从而得到拟合函数
P
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
x
n
P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n
Pn(x)=a0+a1x+a2x2+...+anxn
1.2 结论:
由此,我们得到了多项式函数拟合的一般方法:
构造
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
F(a_0,a_1,...,a_n)
F(a0,a1,...,an)
⟶
\longrightarrow
⟶求偏导
⟶
\longrightarrow
⟶ 解法方程组
⟶
\longrightarrow
⟶ 得
a
0
,
a
1
,
.
.
.
,
a
n
a_0,a_1,...,a_n
a0,a1,...,an
⟶
\longrightarrow
⟶ 作为多项式
P
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
x
n
P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n
Pn(x)=a0+a1x+a2x2+...+anxn 对应系数。
1.3 案例1:
求下面数据表的最小二乘二次拟合多项式:
x i x_i xi | y i y_i yi |
---|---|
-1 | -0.2209 |
-0.75 | 0.3295 |
-0.5 | 0.8826 |
-0.25 | 1.4392 |
0 | 2.0003 |
0.25 | 2.5645 |
0.5 | 3.1334 |
0.75 | 3.7601 |
1 | 4.2836 |
设多项式函数为:
P
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
P_n(x)=a_0+a_1x+a_2x^2
Pn(x)=a0+a1x+a2x2
将数据点带入法方程组:
{
9
a
0
+
0
1
+
3.75
a
2
=
18.1723
0
+
3.75
a
1
+
0
=
8.4842
3.75
a
0
+
0
+
2.7656
a
2
=
7.1673
\begin{cases} 9a_0+0_1+3.75a_2=18.1723\\ 0+3.75a_1+0=8.4842\\ 3.75a_0+0+2.7656a_2=7.1673\\ \end{cases}
⎩⎪⎨⎪⎧9a0+01+3.75a2=18.17230+3.75a1+0=8.48423.75a0+0+2.7656a2=7.1673
解得:
a
0
=
2.0034
,
a
1
=
2.2625
,
a
2
=
0.0378
a_0=2.0034, a_1=2.2625, a_2=0.0378
a0=2.0034,a1=2.2625,a2=0.0378 故多项式拟合函数为:
P
n
(
x
)
=
2.0034
+
2.2625
x
+
0.0378
x
2
P_n(x)=2.0034+2.2625x+0.0378x^2
Pn(x)=2.0034+2.2625x+0.0378x2
2.最小二乘法的一般形式(线性)(非重点)
有些时候,我们就偏不要用多项式函数拟合,又该怎么办呢?可以仿照上述步骤推导,那样的话,当又换了一个函数类,岂不是又得重新推导,实在麻烦!
因此,这里给出最小二乘法的一般形式。
2.1 线性最小二乘法的一般形式推导
设给定数据
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi) ,又
{
φ
k
(
x
)
}
\left\{\varphi_k(x)\right\}
{φk(x)} 为点集
{
x
i
}
i
=
1
m
{\left\{x_i\right\}}^m_{i=1}
{xi}i=1m上的线性无关族,选取函数
φ
∈
ϕ
=
s
p
a
n
{
ϕ
0
,
ϕ
1
,
.
.
.
,
ϕ
n
}
\varphi \in \boldsymbol\phi = span\left\{\phi_0,\phi_1,...,\phi_n\right\}
φ∈ϕ=span{ϕ0,ϕ1,...,ϕn}满足:
∑
i
=
1
m
(
y
i
−
φ
(
x
i
)
)
2
=
m
i
n
h
∈
ϕ
∑
i
=
1
m
(
y
i
−
h
(
x
i
)
)
2
\sqrt{\sum_{i=1}^m(y_i-\varphi(x_i))^2}=\sqrt{\underset {h \in \phi}{min}\sum_{i=1}^m(y_i-h(x_i))^2}
i=1∑m(yi−φ(xi))2=h∈ϕmini=1∑m(yi−h(xi))2
其中
h
(
x
i
)
h(x_i)
h(xi) 可由
{
ϕ
0
,
ϕ
1
,
.
.
.
,
ϕ
n
}
\left\{\phi_0,\phi_1,...,\phi_n\right\}
{ϕ0,ϕ1,...,ϕn}线性组合得到,即
h
x
=
a
0
ϕ
0
+
a
1
ϕ
1
+
.
.
.
+
a
0
ϕ
n
h_x=a_0\phi_0+a_1\phi_1+...+a_0\phi_n
hx=a0ϕ0+a1ϕ1+...+a0ϕn
因此:
如上章所述解法,令 F ( a 0 , a 1 , . . . , a n ) = ∑ i = 1 m ( y i − h ( x i ) ) 2 = ∑ i = 1 m ( y i − ∑ k = 0 n a k φ k ( x i ) ) 2 F(a_0,a_1,...,a_n)=\sum_{i=1}^m(y_i-h(x_i))^2=\sum_{i=1}^m(y_i-\sum_{k=0}^na_k\varphi_k(x_i))^2 F(a0,a1,...,an)=∑i=1m(yi−h(xi))2=∑i=1m(yi−∑k=0nakφk(xi))2 求偏导令导数值为零:
{
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
0
=
0
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
1
=
0
⋮
∂
F
(
a
0
,
a
1
,
.
.
.
,
a
n
)
∂
a
n
=
0
\begin{cases} \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_0}=0\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_1}=0\\ &\vdots\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_n}=0& \end{cases}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂a0∂F(a0,a1,...,an)=0∂a1∂F(a0,a1,...,an)=0∂an∂F(a0,a1,...,an)=0⋮
如 二.1.1 导出法方程组
⇒
\Rightarrow
⇒
{
∑
k
=
0
n
(
∑
i
=
1
m
φ
k
(
x
i
)
φ
0
(
x
i
)
)
a
k
=
∑
i
=
1
m
y
i
φ
0
(
x
i
)
∑
k
=
0
n
(
∑
i
=
1
m
φ
k
(
x
i
)
φ
1
(
x
i
)
)
a
k
=
∑
i
=
1
m
y
i
φ
1
(
x
i
)
∑
k
=
0
n
(
∑
i
=
1
m
φ
k
(
x
i
)
φ
2
(
x
i
)
)
a
k
=
∑
i
=
1
m
y
i
φ
2
(
x
i
)
⋮
∑
k
=
0
n
(
∑
i
=
1
m
φ
k
(
x
i
)
φ
n
(
x
i
)
)
a
k
=
∑
i
=
1
m
y
i
φ
n
(
x
i
)
\begin{cases} \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_0(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_0(x_i)\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_1(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_1(x_i)\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_2(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_2(x_i)\\ &&&&\vdots\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_n(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_n(x_i)\\ \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∑k=0n(∑i=1mφk(xi)φ0(xi))ak=∑i=1myiφ0(xi)∑k=0n(∑i=1mφk(xi)φ1(xi))ak=∑i=1myiφ1(xi)∑k=0n(∑i=1mφk(xi)φ2(xi))ak=∑i=1myiφ2(xi)∑k=0n(∑i=1mφk(xi)φn(xi))ak=∑i=1myiφn(xi)⋮
为方便记忆和表示,由向量的运算法则,我们记:
φ
j
⃗
=
(
φ
j
(
x
1
)
,
φ
j
(
x
2
)
,
φ
j
(
x
3
)
,
.
.
.
,
φ
j
(
x
m
)
)
\vec{\varphi_j}=\big(\varphi_j(x_1),\varphi_j(x_2),\varphi_j(x_3),...,\varphi_j(x_m)\big)
φj=(φj(x1),φj(x2),φj(x3),...,φj(xm))
j
=
0
,
1
,
2
,
.
.
.
,
n
j=0,1,2,...,n
j=0,1,2,...,n
a ⃗ = ( a 0 , a 1 , . . . , a n ) T \vec{a} =(a_0,a_1,...,a_n)^T a=(a0,a1,...,an)T
y ⃗ = ( y 0 , y 1 , . . . , y n ) T \vec{y} =(y_0,y_1,...,y_n)^T y=(y0,y1,...,yn)T
G \boldsymbol G G 矩阵:
G = ( φ 0 ( x 0 ) φ 1 ( x 0 ) . . . φ n ( x 0 ) φ 0 ( x 1 ) φ 1 ( x 1 ) . . . φ n ( x 1 ) ⋮ φ 0 ( x m ) φ 1 ( x m ) . . . φ n ( x m ) ) G=\left(\begin{array}{ccccc} \varphi_0(x_0) & \varphi_1(x_0) & ... & \varphi_n(x_0)\\ \varphi_0(x_1) & \varphi_1(x_1) & ... & \varphi_n(x_1)\\ \varvdots\\ \varphi_0(x_m) & \varphi_1(x_m) & ... & \varphi_n(x_m)\\ \end{array}\right) G=⎝⎜⎜⎛φ0(x0)φ0(x1)⋮φ0(xm)φ1(x0)φ1(x1)φ1(xm).........φn(x0)φn(x1)φn(xm)⎠⎟⎟⎞
可以验证(过程繁琐) 法方程组 即表示为:
G
T
G
a
⃗
=
G
T
y
⃗
\boldsymbol G^T \boldsymbol G \vec{a}=\boldsymbol G^T \vec{y}
GTGa=GTy
同样的解该法方程组就能得到函数的系数
a
0
,
a
1
,
.
.
.
,
a
n
a_0,a_1,...,a_n
a0,a1,...,an 从而构造出一般的拟合函数
h
x
=
a
0
ϕ
0
+
a
1
ϕ
1
+
.
.
.
+
a
0
ϕ
n
h_x=a_0\phi_0+a_1\phi_1+...+a_0\phi_n
hx=a0ϕ0+a1ϕ1+...+a0ϕn
2.2 结论
由此,我们得到了一般函数拟合的一般方法:构造拟合函数的G矩阵---->解法方程组 G T G a ⃗ = G T y ⃗ G^TG\vec{a}=G^T\vec{y} GTGa=GTy----->解得a
2.3 案例2
求下面数据表的最小二乘指数拟合:
目标拟合函数为:
y
(
x
)
=
a
0
+
a
1
e
x
+
a
2
e
−
x
y(x)=a_0+a_1e^x+a_2e^{-x}
y(x)=a0+a1ex+a2e−x
x i x_i xi | y i y_i yi |
---|---|
0 | 2 |
0.1 | 2.20254 |
0.2 | 2.40715 |
0.3 | 2.61592 |
0.4 | 2.83096 |
0.5 | 3.06448 |
0.6 | 3.28876 |
解:
① 由题意:
φ
0
(
x
)
=
1
,
φ
1
(
x
)
=
e
x
,
φ
2
(
x
)
=
e
−
x
\varphi_0(x)=1,\varphi_1(x)=e^x,\varphi_2(x)=e^{-x}
φ0(x)=1,φ1(x)=ex,φ2(x)=e−x
② 先构造G矩阵:
G
=
(
φ
0
(
x
0
)
φ
1
(
x
0
)
φ
2
(
x
0
)
φ
0
(
x
1
)
φ
1
(
x
1
)
φ
2
(
x
1
)
φ
0
(
x
2
)
φ
1
(
x
2
)
φ
2
(
x
2
)
φ
0
(
x
3
)
φ
1
(
x
3
)
φ
2
(
x
3
)
φ
0
(
x
4
)
φ
1
(
x
4
)
φ
2
(
x
4
)
φ
0
(
x
5
)
φ
1
(
x
5
)
φ
2
(
x
5
)
φ
0
(
x
6
)
φ
1
(
x
6
)
φ
2
(
x
6
)
)
=
(
1
1
1
1
1.10517
0.90484
1
1.22140
0.81873
1
1.34986
0.74082
1
1.49182
0.67032
1
1.64872
0.60653
1
1.82212
0.54881
)
G=\left(\begin{array}{ccccc} \varphi_0(x_0) & \varphi_1(x_0) & \varphi_2(x_0)\\ \varphi_0(x_1) & \varphi_1(x_1) & \varphi_2(x_1)\\ \varphi_0(x_2) & \varphi_1(x_2) & \varphi_2(x_2)\\ \varphi_0(x_3) & \varphi_1(x_3) & \varphi_2(x_3)\\ \varphi_0(x_4) & \varphi_1(x_4) & \varphi_2(x_4)\\ \varphi_0(x_5) & \varphi_1(x_5) & \varphi_2(x_5)\\ \varphi_0(x_6) & \varphi_1(x_6) & \varphi_2(x_6)\\ \end{array}\right)=\left(\begin{array}{ccccc} 1 & 1 & 1\\ 1 & 1.10517 & 0.90484\\ 1 & 1.22140 & 0.81873\\ 1 & 1.34986 & 0.74082\\ 1 & 1.49182 & 0.67032\\ 1 & 1.64872 & 0.60653\\ 1 & 1.82212 & 0.54881\\ \end{array}\right)
G=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛φ0(x0)φ0(x1)φ0(x2)φ0(x3)φ0(x4)φ0(x5)φ0(x6)φ1(x0)φ1(x1)φ1(x2)φ1(x3)φ1(x4)φ1(x5)φ1(x6)φ2(x0)φ2(x1)φ2(x2)φ2(x3)φ2(x4)φ2(x5)φ2(x6)⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛111111111.105171.221401.349861.491821.648721.8221210.904840.818730.740820.670320.606530.54881⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
③ 写出
y
⃗
\vec{y}
y 向量:
y
⃗
=
(
2
2.20254
2.40715
2.61592
2.83096
3.05448
3.28876
)
\vec{y}=\left(\begin{array}{ccccc} 2\\ 2.20254\\ 2.40715\\ 2.61592\\ 2.83096\\ 3.05448\\ 3.28876\\ \end{array}\right)
y=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛22.202542.407152.615922.830963.054483.28876⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
④ 解法方程组:
G
T
G
a
⃗
=
G
T
y
⃗
G^TG\vec{a}=G^T\vec{y}
GTGa=GTy
得到:
a
0
=
1.98614
a
1
=
1.01700
a
2
=
−
1.00304
a_0=1.98614\quad{a_1}=1.01700\quad{a_2}=-1.00304
a0=1.98614a1=1.01700a2=−1.00304 故所求的拟合函数为:
y
=
1.98614
+
1.01700
e
x
−
1.00304
e
x
y=1.98614+1.01700e^x-1.00304e^x
y=1.98614+1.01700ex−1.00304ex
三、最小二乘法应用(matlab)
1. 自行编写代码实现
拟合函数:三项偶次多项式
P
n
(
x
)
=
a
0
+
a
2
x
2
+
a
3
x
4
P_n(x)=a_0+a_2x^2+a_3x^4
Pn(x)=a0+a2x2+a3x4
matlab代码如下:
%x,y为待拟合得数据,返回值p为拟合函数的系数(按x的升幂排列)
function [p]=polyfit_2(x,y)
if length(x) ~= length(y)
warning('输入矩阵维度有误');
end
m=length(x);
A=[m sum(x.^2) sum(x.^4) ; sum(x.^2) sum(x.^4) sum(x.^6) ; sum(x.^4) sum(x.^6) sum(x.^8)]; %法方程组系数矩阵
b=[sum(y) ; sum(y.*(x.^2)) ; sum(y.*(x.^4))];
p=A\b; %求解法方程组
end
采用一般形式的最小二乘法 代码更为简洁!:
%x,y为待拟合得数据,返回值p为拟合函数的系数(按x的升幂排列)
function [p]=polyfit_22(x,y)
if length(x) ~= length(y)
warning('输入矩阵维度有误');
end
g0=x.^0;
g1=x.^2;
g2=x.^4;
G=[g0 g1 g2]; %G矩阵构造
%=====normal equation
A=G'*G; %法方程组的系数矩阵
b=G'*y;
p=A\b; %求解法方程组
end
(掌握了原理,任何编程语言都可以实现拟合方法,甚至还可以自己写一个属于自己的拟合工具箱!!)
2. 利用Curving Fitting Tools工具箱
自行编写代码还是太麻烦?其实matlab早为我们考虑了这个问题!利用Curving Fitting Tools帮助我们快速实现拟合。Curving Fitting Tools参考文档:https://www.mathworks.com/help/curvefit/curve-fitting.html?searchHighlight=curving fit&s_tid=srchtitle
2.1 命令行输入cftool即可打开工具箱
- 在命令框中输入 cftool 即可打开工具箱
- 选定拟合的对象
- 选定拟合函数类
例如选择多项式拟合:
- 工具箱中个参数的含义
SSE(Sum Squared Residual):残差平方和,越接近0,表示与数据拟合的越好,但是要小心过拟合;
R-Square:确定系数,
R
−
S
q
u
a
r
e
=
∑
i
=
1
n
(
y
−
y
i
)
2
/
∑
i
=
1
n
(
y
−
y
i
)
2
R-Square={\sum_{i=1}^n(y-y_i)^2}/{\sum_{i=1}^n(y-y_i)^2}
R−Square=∑i=1n(y−yi)2/∑i=1n(y−yi)2,趋近于1较好
DFE:误差项自由度
RMSE(Root Mean Squared Error):均方根误差
#Coeff:模型的系数数量(非自定义模型时出现),相近拟合效果选择数量少的,防止过拟合。
2.2 拟合结果的调用
2.2.1生成代码(Generate Code)
有些时候我们不仅需要拟合的图像,还需要拟合的结果。利用Curving Fitting Tools 得到的拟合模型可以直接生成代码非常方便!
点击窗口左上角:文件(Files)—> Generate Code
自动生成的函数保存下来,就可以直接调用了
2.2.2调用函数
创建脚本test 测试自动生成的函数
matlab默认为我们绘制了一幅图,同时返回了两个对象:fitresult 和 gof
2.2.3返回值fitresult 和 gof 的调用
① 直接将fitresult作为函数,可按照拟合公式返回数值解。
② fitresult.相关参数,返回相关拟合参数。
如有问题,欢迎讨论
更多推荐
所有评论(0)