【发布时间】:2014-02-28 07:24:12
【问题描述】:
另一个高斯拟合问题,虽然有很多有用的教程/答案,但似乎没有一个能完全解决我的问题。我正在尝试找到适合分箱数据的高斯拟合(从 70-150 运行,总共 100 个数据点)。我是新手,如有错误请见谅。
现在,代码对x_fit 和y_fit 抛出错误,我不知道为什么。
错误是“无效语法”错误,popt 和 pcov 上的括号似乎没有区别。
在我弄清楚之前似乎无法对其余代码进行故障排除,但如果有人对如何优化高斯拟合以适应分级数据有建议,那将非常有帮助。
谢谢!
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)
【问题讨论】:
-
你得到的错误是什么?在上面的代码中,
popt, pcov = ...行缺少括号 -
@deinonychusaur xfit/yfit 在 popt 上给出“无效语法”错误和括号,pcov 似乎没有区别
-
另外,在您的 gaus 方法中,curve_fit 可能会发送一个负 sigma,这(如果我的大脑不缺咖啡)应该是无效的。这可以通过在方法中添加
sigma = np.log(sigma)和在选择解决方案后添加popt[2] = np.power(np.e, popt[2])来解决。 -
您能否添加足以重现您的问题的示例数据?
-
你有两个数据
gadata和podata...不是你碰巧改了他们的名字吗?