python 擬合曲線並求參


需要對數據進行函數擬合,首先畫一下二維散點圖,目測一下大概的分布,

所謂正態分布,就是高斯分布,正態曲線是一種特殊的高斯曲線。

python的scipy.optimize包里的curve_fit函數來擬合曲線,當然還可以擬合很多類型的曲線。scipy.optimize提供了函數最小值(標量或多維)、曲線擬合和尋找等式的根的有用算法。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
#單個高斯模型,如果曲線有多個波峰,可以分段擬合
def func(x, a,u, sig):
return a*np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (sig * math.sqrt(2 * math.pi))
#混合高斯模型,多個高斯函數相加
def func3(x, a1, a2, a3, m1, m2, m3, s1, s2, s3):
return a1 * np.exp(-((x - m1) / s1) ** 2) + a2 * np.exp(-((x - m2) / s2) ** 2) + a3 * np.exp(-((x - m3) / s3) ** 2)

#正弦函數擬合
#def fmax(x,a,b,c):
#    return a*np.sin(x*np.pi/6+b)+c
#fita,fitb=optimize.curve_fit(fmax,x,ymax,[1,1,1])
#非線性最小二乘法擬合
#def func(x, a, b,c):
#    return a*np.sqrt(x)*(b*np.square(x)+c)
#用3次多項式擬合,可推廣到n次多項式,數學上可以證明,任意函數都可以表示為多項式形式
#f1 = np.polyfit(x, y, 3)
#p1 = np.poly1d(f1)
#yvals = p1(x)  #擬合y值
#也可使用yvals=np.polyval(f1, x)

擬合,並對參數進行限制,bounds里面代表參數上下限,p0是初始范圍,默認是[1,1,1]
x=np.arange(1,206,1)
num = []<-自己的y值
numhunt = []<-自己的y值
y = np.array(num)
yhunt = np.array(numhunt)
popt, pcov = curve_fit(func3, x, y)
popthunt, pcovhunt = curve_fit(func, x, yhunt,p0=[2,2,2]) 
ahunt = popthunt[0]
uhunt = popthunt[1]
sighunt = popthunt[2]
a1 = popt[0]
u1 = popt[1]
sig1 = popt[2]
a2 = popt[3]
u2 = popt[4]
sig2 = popt[5]
a3 = popt[6]
u3 = popt[7]
sig3 = popt[8]
yvals = func3(x,a1,u1,sig1,a2,u2,sig2,a3,u3,sig3) #擬合y值
yhuntvals = func(x,ahunt,uhunt,sighunt) #擬合y值
print(u'系數ahunt:', ahunt)
print(u'系數uhunt:', uhunt)
print(u'系數sighunt:', sighunt)
#繪圖
plot1 = plt.plot(x, y, 's',label='insect original values')
plot2 = plt.plot(x, yvals, 'r',label='insect polyfit values')
plot3 = plt.plot(x, yhunt, 's',label='predator original values')
plot4 = plt.plot(x, yhuntvals, 'g',label='predator polyfit values')
plt.xlabel('date')
plt.ylabel('Nightly catches log10(N+1)')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('insect/predator')
plt.show()

下圖是單個和多個高斯擬合圖像

 



下圖是多項式擬合圖像

 

圖例的位置可以自定義設置

lower left
upper center
lower right
center
upper left
center left
upper right
lower center
best
center right
right

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM