在 Python 中寻找不确定性,降低高斯拟合的卡方

Finding uncertainty, reduced chi-square for a gaussian fit in Python

我尝试计算我的数据点的标准误差以进行高斯拟合。我想知道如何计算误差并获得不确定性。我想计算减少(卡方)的值。任何建议都会有所帮助。任何关于纠正残差 (p,x,y) 的建议和帮助都会很有帮助。

import csv
import pandas as pd
import numpy as np
from scipy import optimize
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
#reading the x,y,z values from the respective csv files
xData = []
yData = []
path = r'C:\Users\angel\OneDrive\Documents\CSV_FILES_NV_LAB11 x 30.csv'
with open(path, "r") as f_in:
    reader = csv.reader(f_in)
    next(reader)  # skip headers

    for line in reader:
        try:
            float_1, float_2=float(line[0]),float(line[1])
            xData.append(float_1)
            yData.append(float_2)
        except ValueError:
            continue
#printing the columns of the csv files and storing as an array
print(xData)
print(yData)
#plot the data points
plt.plot(xData,yData,'bo',label='experimental_data')
plt.show()
#define the function we want to fit the plot into
# Define the Gaussian function
n = len(xData)
xData=np.array(xData)
yData=np.array(yData)
mean = sum(xData*yData)/sum(yData)
sigma = np.sqrt(sum(yData*(xData-mean)**2)/sum(yData))
def Gauss(x,I0,x0,sigma,Background):
    return I0*exp(-(x-x0)**2/(2*sigma**2))+Background

#popt,pcov = curve_fit(Gauss,xData,yData,p0=[1,mean,sigma, 0.0])
#calculating error methods

################################################################################
def residual(p,x,y):
    return Gaussian(x,*p)-y
initGuess=[1,1,1]
popt,pcov,infodict,mesg,ier=optimize.least_squares(residual,initGuess,args=[x,y],full_output=True)
s_sq = (infodict['fvec']**2).sum()/ (N-n)
#####################################################################################
print(popt)
plt.plot(xData,yData,'b+:',label='data')
plt.plot(xData,Gauss(xData,*popt),'ro:',label='fit')
plt.legend()
plt.title('Gaussian_Fit')
plt.xlabel('x-axis')
plt.ylabel('PL Intensity')
plt.show()

示例输入数据:

xData=[
    -7.66e-06, -7.6e-06, -7.53e-06, -7.46e-06, -7.4e-06,
    -7.33e-06, -7.26e-06, -7.19e-06
]
yData=[
    17763.0, 2853.0, 3694.0, 4203.0, 4614.0, 4984.0,
    5080.0, 7038.0, 6905.0
]

输出错误:

popt,pcov,infodict,mesg,ier=optimize.least_squares(
    residual,initGuess,args=[x,y],full_output=True
)
NameError: name 'x' is not defined.

可读代码总是有帮助的。比如,您得到的错误是

popt,pcov,infodict,mesg,ier=optimize.least_squares(residual,initGuess,args=[x,y],full_output=True) 
NameError: name 'x' is not defined.

几乎是在告诉您 'x' 未定义。也许你的意思是 'xData'?

我建议从更易于使用的 lmfit 开始。这样,CSV 文件中的高斯数据拟合可能如下所示:

from pandas import read_csv
from lmfit.models import GaussianModel
from matplotlib import pyplot as plt

dframe = read_csv('peak.csv')
xdata = dframe.to_numpy()[:, 0]
ydata = dframe.to_numpy()[:, 1]

model = GaussianModel()
params = model.guess(ydata, x=xdata)
result = model.fit(ydata, params, x=xdata)

print(f'Chi-square = {result.chisqr:.4f}, Reduced Chi-square = {result.redchi:.4f}')

print(result.fit_report())

plt.plot(xdata, ydata, label='data')
plt.plot(xdata, result.best_fit, label='best fit')
plt.legend()
plt.show()

print(result.fit_report()) 将打印出如下内容:

[[Model]]
    Model(gaussian)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 21
    # data points      = 101
    # variables        = 3
    chi-square         = 7.60712520
    reduced chi-square = 0.07762373
    Akaike info crit   = -255.189553
    Bayesian info crit = -247.344192
[[Variables]]
    amplitude:  30.5250840 +/- 0.31978873 (1.05%) (init = 40.626)
    center:     9.22348190 +/- 0.01498559 (0.16%) (init = 9.3)
    sigma:      1.23877032 +/- 0.01498552 (1.21%) (init = 1.3)
    fwhm:       2.91708114 +/- 0.03528820 (1.21%) == '2.3548200*sigma'
    height:     9.83051253 +/- 0.10298786 (1.05%) == '0.3989423*amplitude/max(1e-15, sigma)'
[[Correlations]] (unreported correlations are < 0.100)
    C(amplitude, sigma) =  0.577