2016-02-29 71 views
0

我想要得到直方圖的高斯擬合的擬合誤差。我使用scipy.optimize.curve_fit下面的代碼:高斯直方圖曲線擬合使用scipy.curve_fit()的錯誤

import matplotlib.pylab as plt 
from pylab import exp 
import numpy as np 
from scipy import optimize 
from math import sqrt 

# Fit functions 
def Gaussian(x,a,b,c): 
    return a * exp(-(x - b)**2.0/(2 * c**2)) 

# Generate data from random Guassian distribution 
npix = 10200 
nbins = int(sqrt(npix)) 
data = np.random.standard_normal(npix) 
print('\n Length of y: %s' % len(data)) 
n,bins,patches = plt.hist(data,bins=nbins) 

# Generate data from bins as a set of points 
bin_size = abs(bins[1]-bins[0]) 
x =np.linspace(start=bins[0]+bin_size/2.0,stop=bins[-2]+bin_size/2.0,\ 
num=nbins,endpoint=True) 
print min(x),max(x),len(x), np.mean(x) 
y = n 
y[y==0]= 1e-8 


popt, pcov = optimize.curve_fit(Gaussian,x,y) 

# Curve-fit error method 
error = [] 
for i in range(len(popt)): 
    try: 
     error.append(np.absolute(pcov[i][i])**0.5) 
    except: 
     error.append(0.00) 
pfit_curvefit = popt 
perr_curvefit = np.array(error) 
print('\n Curve-fit Curve fit: %s' % pfit_curvefit) 
print('\n Curve-fit Fit errors: %s' % perr_curvefit) 

# Plot the fit 
x_fit = np.linspace(x[0], x[-1], nbins) 
y_gauss = Gaussian(x_fit, *popt) 
# y_boot = Gaussian(x_fit, *pfit_bootstrap) 
yerr=Gaussian(x_fit,*perr_curvefit) 

plt.plot(x_fit, y_gauss,linestyle='--',linewidth=2,\ 
color='red',label='Gaussian') 



plt.xlabel('Pixel Values') 
plt.ylabel('Frequency') 
plt.title('Npix = %s, Nbins = %s'% (npix,nbins)) 
plt.legend() 
plt.show() 

enter image description here

正如你看到的,我可以讓Python來充分地擬合直方圖數據沒有問題。問題出現時,我嘗試計算擬合誤差

yerr =高斯(x_fit,* perr_curvefit)

這似乎是它會做正確的事情,但是當我看到錯誤的這份名單是看上去無意義的:

...
0.0
0.0
0.0
0.0
0.0
2.60905702842e-265
2.27384038589e-155
1.02313435685e-74
2.37684931814e-23
0.285080112094
1.76534048255e-08
5.64399121475e-45
9.31623567809e-111
7.93945868459e-206
0.0
0.0
0.0
0.0
0.0
個 ...

我的問題是:1。 是在正確計算的擬合誤差,如果沒有,什麼是計算它們的正確方法。 2.我需要擬閤中的誤差來計算減小的卡方值。是否還有另一種方法可以計算卡方而不必知道每個點處的誤差?

預先感謝您!

+0

計算的好辦法錯誤是yerr =(高斯(x_fit,* po pt)-y)。 –

回答

1

您的主要錯誤是計算錯誤值。您的數組error是函數Gaussian中係數a,b,c的標準偏差的漸近估計值。您不能輸入值x和不確定度+/- a,+/- b,+/- c並獲得有意義的結果,因爲誤差大約是a的平均值,即高斯(x, +/- delta a等)

如果您不是使用optimize.curve_fit()並且會使用optimize.leastsq(),您需要的信息隨時可用。
看到這個question

更換

popt, pcov = optimize.curve_fit(Gaussian,x,y) 

def residual(p, x, y): 
    return Gaussian(x, *p) - y 

initGuess = [1,1,1] # or whatever you want the search to start at 
popt, pcov, infodict, mesg, ier = optimize.least_squares(residual,initGuess, args=[x,y], full_output=True) 

,然後按照該解決方案的說明,找到減少卡方

s_sq = (infodict['fvec']**2).sum()/ (N-n)