栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python-曲线拟合(一)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python-曲线拟合(一)

曲线拟合:一种函数近似,不要求通过数据点,合理反应数据的基本趋势。

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​)

2. 多项式拟合 2.1 理论基础
  1. 用푚次插值多项式 푃 푚 ( 푥 ) 푃_푚(푥) 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​+a1​x+⋯+am​xm=∑j=0m​aj​xj
  2. 选取多项式系数 푎 푗 푎_푗 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=0m​ak​xik​]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=0m​ak​(∑i=1n​xik+j​)=∑i=1n​yi​xij​
    写成方程组得:
    { 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​+a1​i=1∑n​xi​+a2​i=1∑n​xi2​+⋯+am​i=1∑n​xim​=i=1∑n​yi​a0​i=1∑n​xi​+a1​i=1∑n​xi2​+⋯+am​i=1∑n​xim+1​=i=1∑n​yi​xi​a0​i=1∑n​xim​+a1​i=1∑n​xim+1​+⋯+am​i=1∑n​xi2m​=i=1∑n​yi​xim​​

当最高幂次 푚 = 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=1n​xi​=∑i=1n​yi​a0​∑i=1n​xi​+a1​∑i=1n​xi2​=∑i=1n​yi​xi​​

解线性方程组,即可求得 푎 0 , 푎 1 푎_0, 푎_1 a0​,a1​.

  1. 令 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⋮1​x1​⋮xn​​⎦⎥⎤​,β=[a0​a1​​],Y=⎣⎢⎡​y1​⋮yn​​⎦⎥⎤​
    方程组可记为 X T X β = X T Y X^{T} X beta=X^{T} Y XTXβ=XTY
  2. 线性方程组的法方程
    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=[1x1​​1x2​​⋯⋯​1xn​​]⎣⎢⎢⎢⎡​11⋮1​x1​x2​⋮xn​​⎦⎥⎥⎥⎤​=[n∑i=1n​xi​​∑i=1n​xi​∑i=1n​xi2​​]

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 ​=[1x1​​1x2​​⋯⋯​1xn​​]⎣⎢⎢⎢⎡​y1​y2​⋮yn​​⎦⎥⎥⎥⎤​=[∑i=1n​yi​∑i=1n​xi​yi​​]

法方程化为
[ 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=1n​xi​​∑i=1n​xi​∑i=1n​xi2​​][[β0​β1​​]=[∑i=1n​yi​∑i=1n​xi​yi​​]​

即:
{ 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=1n​xi​=∑i=1n​yi​β0​∑i=1n​xi​+β1​∑i=1n​xi2​=∑i=1n​yi​xi​​

2.2 Python中的多项式拟合

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)

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/321701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号