1. 程式人生 > >python3-多項式最小二乘法擬合

python3-多項式最小二乘法擬合

class numpy.poly1d(c_or_r, r=False, variable=None)[source]
引數:
c_or_r:array_like
多項式的係數,或者如果第二個引數的值是True,多項式的根(值多項式的求值結果為0)。
例如,poly1d([1, 2, 3])返回一個物件,代表:
x ^ 2 + 2 + 3,
而poly1d((1、2、3),真正的)返回一個物件,代表:
(x - 1) (x - 2) (3) = x ^ 3 - 6 x ^ 2 + 11 * 6。
r: bool,可選
如果為真,c_or_r指定多項式的根;預設值為False。
variable:str,可選
將列印p時使用的變數從x改為變數

python3-多項式最小二乘法擬合

import numpy as np
import scipy as sp
import pylab as pl
from scipy.optimize import leastsq#最小二乘法函式

n=9#多項式次數

#目標函式
def real_func(x):
    return np.pi*(np.sin(x)+np.cos(x))#pi*(sinx+cosx)
#多項式函式
def fit_func(p,x):
    f=np.poly1d(p)
    return f(x)
#殘差函式
def residuals_func(p,y,x):
    ret=fit_func(p,x)-y
    return ret

x=np.linspace(0,1,20)#隨機選擇20個點作為x
y_=real_func(x)
y=[np.random.normal(0,0.1)+y for y in y_]#人為增加噪聲

x_=np.linspace(0,1,1000)

p_init=np.random.randn(n)#初始引數值
plsq=leastsq(residuals_func,p_init,args=(y,x))#最小二乘法
print("引數:",plsq[0])
pl.plot(x_,real_func(x_),label="real")
pl.plot(x_,fit_func(plsq[0],x_),label="fitted curve")
pl.plot(x,y,'bo',label='with noise')
pl.legend()
pl.show()

引數: [ 5.66429153e+02 -2.31267133e+03 3.74497872e+03 -3.05872688e+03
1.32282723e+03 -2.91138157e+02 2.74425970e+01 1.90086912e+00
3.15467158e+00]

python3-多項式最小二乘法擬合