這就是我所做的。我保留xobs
和yobs
:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
xobs=np.linspace(0,10,100)
yl=np.random.rand(50); yr=np.random.rand(50)+100
yobs=np.concatenate((yl,yr),axis=0)
現在,必須生成Heaviside函數。爲了給你這個功能的概述,認爲Heaviside函數的半最大約定:
![Heaviside](https://i.imgur.com/ZFsvuGN.png)
在Python,這相當於:def f(x): return 0.5 * (np.sign(x) + 1)
樣本情節是:
xval = sorted(np.concatenate([np.linspace(-5,5,100),[0]])) # includes x = 0
yval = f(xval)
plt.plot(xval,yval,'ko-')
plt.ylim(-0.1,1.1)
plt.xlabel('x',size=18)
plt.ylabel('H(x)',size=20)
![Heaviside2](https://i.imgur.com/DuIhTOZ.png)
現在,繪製xobs
和yobs
給出:
plt.plot(xobs,yobs,'ko-')
plt.ylim(-10,110)
plt.xlabel('xobs',size=18)
plt.ylabel('yobs',size=20)
![xobs_yobs](https://i.imgur.com/5EPdYCX.png)
注意,比較這兩個圖中,第二曲線是由5個單位和最大偏移增加爲1.0〜100。我推斷爲第二曲線的函數可以是表示如下:
![Hfit](https://i.imgur.com/myMBA2a.png)
或在Python:(0.5 * (np.sign(x-5) + 1) * 100 = 50 * (np.sign(x-5) + 1)
個結合的田塊產量(其中Fit
表示上述擬合函數)
![Heaviside_combined](https://i.imgur.com/uFKV4oa.png)
的情節證實我的猜測是正確的。現在,假設您不知道這個正確的擬合函數是如何產生的,則會創建一個廣義擬合函數:def f(x,a,b,c): return a * (np.sign(x-b) + c)
,理論上,其中a = 50
,b = 5
和c = 1
。
繼續進行估算:
popt,pcov=curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2]))
。
現在,bounds = ([lower bound of each parameter (a,b,c)],[upper bound of each parameter])
。從技術上講,這意味着49 < a
< 50,4.75 < b
< 5和0 < c
< 2。
下面是我給popt
和pcov
結果: ![Results](https://i.imgur.com/ui79ZJy.png)
pcov
表示POPT的估計的協方差。對角線提供了參數估計值[Source]的方差。
結果顯示參數估計值pcov
接近理論值。
基本上,廣義Heaviside函數可以表示爲:a * (np.sign(x-b) + c)
這裏是將產生參數估計和對應的協方差的代碼:
import numpy as np
from scipy.optimize import curve_fit
xobs = np.linspace(0,10,100)
yl = np.random.rand(50); yr=np.random.rand(50)+100
yobs = np.concatenate((yl,yr),axis=0)
def f(x,a,b,c): return a * (np.sign(x-b) + c) # Heaviside fitting function
popt, pcov = curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2]))
print 'popt = %s' % popt
print 'pcov = \n %s' % pcov
最後,注意的popt
的估計和pcov
各不相同。
pythonscipy
也許'jobs' - >'yobs'? – MMF
'[40.,0.,100。]'代表什麼? – MMF
在模型函數中,比較器(x