【问题标题】:Gaussian fit in Python plotPython图中的高斯拟合
【发布时间】:2018-08-07 14:06:37
【问题描述】:

我正在尝试将高斯函数拟合到我的 Python 图。我在这里附上了代码。任何更正将不胜感激!

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
import random
from numpy import genfromtxt

data= genfromtxt ('PVC_Cs137.txt')
plt.xlim(0,2500)
plt.ylim(0,30000)
plt.xlabel("Channel number")
plt.ylabel("Counts")

x = data[:,0]
y = data[:,1]

n = len(x)                          
mean = sum(x*y)/n                   
sigma = sum(y*(x-mean)**2)/n    

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

popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])

plt.plot(x,gaus(x,*popt))
plt.show()

这是我的文件的链接: https://www.dropbox.com/s/hrqjr2jgfsjs55x/PVC_Cs137.txt?dl=0

【问题讨论】:

  • 怎么了?实际和预期的结果是什么?
  • 我无法适应。我想绘制给定文本文件中的数据,并用高斯函数拟合图形。
  • 在拟合之前,使用“plt.plot(x,y)”检查原始数据的散点图,并且不设置 xlim 或 ylim - 这在我看来不是高斯分布。此外,您可以直接对“y = 0 if x > 7200”进行建模而无需拟合。

标签: python matplotlib scipy curve-fitting


【解决方案1】:

您的方法存在两个问题。一是与编程有关。 gauss fit 函数必须与 numpy 数组一起使用。 math functions can't provide this functionality, they work with scalars. 因此你的拟合函数应该是这样的

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

这会通过正确的均值/西格玛组合产生这样的高斯曲线

现在我们看看文件中值的分布:

这甚至看起来都不像高斯曲线。难怪fit函数不收敛。

其实还有第三个问题,你的mean/sigma计算是错误的,但是由于你的数据不能符合高斯分布,我们暂时可以忽略这个问题。

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 2017-08-30
    • 2018-12-10
    • 2020-10-25
    • 2014-01-03
    • 2021-09-15
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多