2014-02-28 28 views
0

另一個高斯擬合的問題,雖然有很多有用的教程/答案,但沒有一個似乎解決我的問題。我試圖找到適合裝箱的數據(從70-150,100個總數據點運行)。我對此很感興趣,所以如果有任何錯誤,請致歉。試圖使用curve_fit來擬合直方圖(裝倉數據)與高斯來得到優化的意思,std

現在,代碼爲x_fity_fit發出錯誤,我不知道爲什麼。

錯誤是一個「無效的語法」錯誤,並且poptpcov上的括號似乎沒有什麼區別。

似乎無法解決其餘的代碼,直到我弄清楚爲止,但如果任何人有如何優化高斯擬合分檔數據的建議,這將是非常有用的。

謝謝!

import pylab as py 
import matplotlib.pyplot as plt 
import numpy as np 
from scipy.optimize import curve_fit 

#grabs data from csv - just a list of numbers 
#gadata=np.genfromtxt('gaussian-lab1.csv', autostrip=True) 

#grabs initial mean/std values from data 
m1 = gadata.mean() 
s1 = gadata.std() 

def gaus(x, a, x0, sigma): 
    return a * np.exp(-(x - x0) ** 2/(2 * sigma ** 2)) 

data = py.hist(gadata, bins=10) 
histx = [0.5 * data[1][i] + data[1][i + 1] for i in xrange(10)] 
histy = data[0] 

popt, pcov = curve_fit(gaus, histx, histy, p0=(1, m1, s1,)) 
x_fit = py.linspace(histx[0], histx[-1], 10) 
y_fit = gaus(x_fit, *popt) 
plt.plot(x_fit, y_fit, color='r') 

#plots histogram 
plt.hist(gadata, 10, normed=True) 

#plots a gaussian with mean/std that matches data.. but want optimized 
#fit1 = ss.norm(loc=m1, scale=s1) 
#plt.plot(x1, histo.pdf(x1), 'r-', lw=2) 
+0

你得到的錯誤是什麼?在上面的代碼中,缺少對'popt,pcov = ...'行的括號 – deinonychusaur

+0

@deinonychusaur xfit/yfit給出了一個「無效語法」的錯誤和對popt的括號,pcov似乎沒有區別 – EHC

+0

也,在你的gaus方法中,curve_fit可能會發出一個負面的西格瑪,如果我的大腦不缺咖啡,它應該是無效的。這可以通過在方法中添加'sigma = np.log(sigma)'並在解決方案被加入之後使用'popt [2] = np.power(np.e,popt [2])'來解決。 – deinonychusaur

回答

0

根據定義,數據與高斯函數的最小最小二乘擬合與計算數據的平均值和標準偏差相同。在任何方面都是如此。因此,您可以節省自己的曲線擬合或任何其他擬合方法。

+0

在我的數據集中,由於數據採集錯誤,我有時會有一兩個數據點是極端異常值。他們可以嚴重扭曲均值和標準差。但是,我相當肯定,如果我製作一個直方圖並對其進行擬合,則離羣點對我所擬合的高斯的均值和標準偏差的影響要小得多。你是說這是錯誤的嗎? – lnmaurer

+0

您可以在計算均值和標準差時使用您的異常值排除。 –