曲线拟合:一种函数近似,不要求通过数据点,合理反应数据的基本趋势。
1. 最小二乘法拟合函数
φ
(
x
i
)
varphi(x_i)
φ(xi)与原始数据点
푦
푖
푦_푖
yi的偏差为:
δ
i
=
φ
(
x
i
)
−
y
i
(
i
=
0
,
1
,
2
,
⋯
,
n
)
delta_{i}=varphileft(x_{i}right)-y_{i} quad(i=0,1,2, cdots, n)
δi=φ(xi)−yi(i=0,1,2,⋯,n)
最小二乘法:
min
(
∑
i
=
1
n
δ
i
2
)
min left(sum_{i=1}^{n} delta_{i}^{2}right)
min(∑i=1nδi2)
考虑数据误差时:
min
(
∑
i
=
1
n
ω
i
δ
i
2
)
min left(sum_{i=1}^{n} omega_idelta_{i}^{2}right)
min(∑i=1nωiδi2)
- 用푚次插值多项式
푃
푚
(
푥
)
푃_푚(푥)
Pm(x)来拟合푛个数据点(푚 < 푛):
P m ( x ) = a 0 + a 1 x + ⋯ + a m x m = ∑ j = 0 m a j x j P_{m}(x)=a_{0}+a_{1} x+cdots+a_{m} x^{m}=sum_{j=0}^{m} a_{j} x^{j} Pm(x)=a0+a1x+⋯+amxm=∑j=0majxj - 选取多项式系数
푎
푗
푎_푗
aj使
∑ i = 1 n δ i 2 = ∑ i = 1 n [ y i − P m ( x i ) ] 2 = F ( a 0 , a 1 , ⋯ , a n ) sum_{i=1}^{n} delta_{i}^{2}=sum_{i=1}^{n}left[y_{i}-P_{m}left(x_{i}right)right]^{2}\=Fleft(a_{0}, a_{1}, cdots, a_{n}right) ∑i=1nδi2=∑i=1n[yi−Pm(xi)]2=F(a0,a1,⋯,an)
最小, 由多元函数的极值条件得方程组
∂ F ∂ a j = − 2 ∑ i = 1 n [ y i − ∑ k = 0 m a k x i k ] x i j = 0 frac{partial F}{partial a_{j}}=-2 sum_{i=1}^{n}left[y_{i}-sum_{k=0}^{m} a_{k} x_{i}^{k}right] x_{i}^{j}=0 ∂aj∂F=−2∑i=1n[yi−∑k=0makxik]xij=0
移项得:
∑ k = 0 m a k ( ∑ i = 1 n x i k + j ) = ∑ i = 1 n y i x i j sum_{k=0}^{m} a_{k}left(sum_{i=1}^{n} x_{i}^{k+j}right)=sum_{i=1}^{n} y_{i} x_{i}^{j} ∑k=0mak(∑i=1nxik+j)=∑i=1nyixij
写成方程组得:
{ n a 0 + a 1 ∑ i = 1 n x i + a 2 ∑ i = 1 n x i 2 + ⋯ + a m ∑ i = 1 n x i m = ∑ i = 1 n y i a 0 ∑ i = 1 n x i + a 1 ∑ i = 1 n x i 2 + ⋯ + a m ∑ i = 1 n x i m + 1 = ∑ i = 1 n y i x i a 0 ∑ i = 1 n x i m + a 1 ∑ i = 1 n x i m + 1 + ⋯ + a m ∑ i = 1 n x i 2 m = ∑ i = 1 n y i x i m left{begin{aligned} n a_{0}+a_{1} sum_{i=1}^{n} x_{i}+a_{2} sum_{i=1}^{n} x_{i}^{2}+cdots+a_{m} sum_{i=1}^{n} x_{i}^{m}=sum_{i=1}^{n} y_{i} \ a_{0} sum_{i=1}^{n} x_{i}+a_{1} sum_{i=1}^{n} x_{i}^{2}+cdots+a_{m} sum_{i=1}^{n} x_{i}^{m+1}=sum_{i=1}^{n} y_{i} x_{i} \ a_{0} sum_{i=1}^{n} x_{i}^{m}+a_{1} sum_{i=1}^{n} x_{i}^{m+1}+cdots+a_{m} sum_{i=1}^{n} x_{i}^{2 m}=sum_{i=1}^{n} y_{i} x_{i}^{m} end{aligned}right. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧na0+a1i=1∑nxi+a2i=1∑nxi2+⋯+ami=1∑nxim=i=1∑nyia0i=1∑nxi+a1i=1∑nxi2+⋯+ami=1∑nxim+1=i=1∑nyixia0i=1∑nxim+a1i=1∑nxim+1+⋯+ami=1∑nxi2m=i=1∑nyixim
当最高幂次
푚
=
1
푚 = 1
m=1时,拟合的是直线,方程组化简为
{
n
a
0
+
a
1
∑
i
=
1
n
x
i
=
∑
i
=
1
n
y
i
a
0
∑
i
=
1
n
x
i
+
a
1
∑
i
=
1
n
x
i
2
=
∑
i
=
1
n
y
i
x
i
left{begin{array}{c} n a_{0}+a_{1} sum_{i=1}^{n} x_{i}=sum_{i=1}^{n} y_{i} \ a_{0} sum_{i=1}^{n} x_{i}+a_{1} sum_{i=1}^{n} x_{i}^{2}=sum_{i=1}^{n} y_{i} x_{i} end{array}right.
{na0+a1∑i=1nxi=∑i=1nyia0∑i=1nxi+a1∑i=1nxi2=∑i=1nyixi
解线性方程组,即可求得 푎 0 , 푎 1 푎_0, 푎_1 a0,a1.
- 令
X
=
[
1
x
1
⋮
⋮
1
x
n
]
,
β
=
[
a
0
a
1
]
,
Y
=
[
y
1
⋮
y
n
]
X=left[begin{array}{cc} 1 & x_{1} \ vdots & vdots \ 1 & x_{n} end{array}right], beta=left[begin{array}{c} a_{0} \ a_{1} end{array}right], \Y=left[begin{array}{c} y_{1} \ vdots \ y_{n} end{array}right]
X=⎣⎢⎡1⋮1x1⋮xn⎦⎥⎤,β=[a0a1],Y=⎣⎢⎡y1⋮yn⎦⎥⎤
方程组可记为 X T X β = X T Y X^{T} X beta=X^{T} Y XTXβ=XTY - 线性方程组的法方程
X T X β ⃗ = X T y ⃗ X^{T} X vec{beta}=X^{T} vec{y} XTXβ =XTy
X T X = [ 1 1 ⋯ 1 x 1 x 2 ⋯ x n ] [ 1 x 1 1 x 2 ⋮ ⋮ 1 x n ] = [ n ∑ i = 1 n x i ∑ i = 1 n x i ∑ i = 1 n x i 2 ] X^{T} X=left[begin{array}{lllr} 1 & 1 & cdots & 1 \ x_{1} & x_{2} & cdots & x_{n} end{array}right]left[begin{array}{cc} 1 & x_{1} \ 1 & x_{2} \ vdots & vdots \ 1 & x_{n} end{array}right]\=left[begin{array}{cc} n & sum_{i=1}^{n} x_{i} \ sum_{i=1}^{n} x_{i} & sum_{i=1}^{n} x_{i}^{2} end{array}right] XTX=[1x11x2⋯⋯1xn]⎣⎢⎢⎢⎡11⋮1x1x2⋮xn⎦⎥⎥⎥⎤=[n∑i=1nxi∑i=1nxi∑i=1nxi2]
X T y ⃗ = [ 1 1 ⋯ 1 x 1 x 2 ⋯ x n ] [ y 1 y 2 ⋮ y n ] = [ ∑ i = 1 n y i ∑ i = 1 n x i y i ] X^{T} vec{y}=left[begin{array}{cccc} 1 & 1 & cdots & 1 \ x_{1} & x_{2} & cdots & x_{n} end{array}right]left[begin{array}{c} y_{1} \ y_{2} \ vdots \ y_{n} end{array}right]\=left[begin{array}{l} sum_{i=1}^{n} y_{i} \ sum_{i=1}^{n} x_{i} y_{i} end{array}right] XTy =[1x11x2⋯⋯1xn]⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤=[∑i=1nyi∑i=1nxiyi]
法方程化为
[
n
∑
i
=
1
n
x
i
∑
i
=
1
n
x
i
∑
i
=
1
n
x
i
2
]
[
[
β
0
β
1
]
=
[
∑
i
=
1
n
y
i
∑
i
=
1
n
x
i
y
i
]
left[begin{array}{cc} n & sum_{i=1}^{n} x_{i} \ sum_{i=1}^{n} x_{i} & sum_{i=1}^{n} x_{i}^{2} end{array}right]left[begin{array}{c} {left[begin{array}{c} beta_{0} \ beta_{1} end{array}right]=left[begin{array}{c} sum_{i=1}^{n} y_{i} \ sum_{i=1}^{n} x_{i} y_{i} end{array}right]} end{array}right.
[n∑i=1nxi∑i=1nxi∑i=1nxi2][[β0β1]=[∑i=1nyi∑i=1nxiyi]
即:
{
n
β
0
+
β
1
∑
i
=
1
n
x
i
=
∑
i
=
1
n
y
i
β
0
∑
i
=
1
n
x
i
+
β
1
∑
i
=
1
n
x
i
2
=
∑
i
=
1
n
y
i
x
i
left{begin{array}{c} n beta_{0}+beta_{1} sum_{i=1}^{n} x_{i}=sum_{i=1}^{n} y_{i} \ beta_{0} sum_{i=1}^{n} x_{i}+beta_{1} sum_{i=1}^{n} x_{i}^{2}=sum_{i=1}^{n} y_{i} x_{i} end{array}right.
{nβ0+β1∑i=1nxi=∑i=1nyiβ0∑i=1nxi+β1∑i=1nxi2=∑i=1nyixi
np.polyfit
实例代码:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d t = np.ogrid[0:5.5:0.5] s = t+ 0.2*t**2 s1 = np.array([0.5,-0.18,-0.01,0.13,0.1,0.31,-0.22,-0.31,0.2,0.4,-0.14]) # 假设误差 ss = s+s1 P = np.polyfit(t,ss,2) # 二次曲线拟合 y = np.polyval(P,t) # 利用参数拟合函数值 plt.plot(t,ss,"r*",t,y,"g",lw=4,ms=10)
结果:



