寻找不确定性,在 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_LAB\1111 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,p0=[1,mean,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,'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,ier=optimize.least_squares(
    residual,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
 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...