尝试使用curve_fit用高斯拟合直方图(分箱数据)以获取优化的均值和标准差

0 投票
1 回答
1874 浏览
提问于 2025-04-17 20:21

这是另一个关于高斯拟合的问题,虽然有很多有用的教程和回答,但似乎没有一个能解决我的问题。我正在尝试对分组数据进行高斯拟合,这些数据的范围是70到150,总共有100个数据点。我对这个领域还很陌生,所以如果有任何错误请多包涵。

现在,代码在处理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)

1 个回答

0

根据定义,把数据用高斯函数(也就是钟形曲线)进行最小二乘拟合,其实就是在计算你数据的平均值和标准差。这在任何维度下都是成立的。所以你可以省去曲线拟合或者其他任何拟合方法。

撰写回答