在scipy.optimize中用chi squared作拟合参数不确定度及.format用法咨询
关于scipy.optimize.curve_fit的卡方值与参数不确定度问题
1. 卡方值与参数不确定度的关联逻辑
curve_fit返回的perr(参数不确定度)是基于协方差矩阵计算的标准误差,和卡方值的对应关系如下:
- 当
absolute_sigma=False(默认):协方差矩阵会除以约化卡方(reduced chi²),此时perr是参数标准误差乘以√(reduced chi²) - 当
absolute_sigma=True:协方差矩阵直接用输入的sigma计算,不除以约化卡方,此时perr是参数的原始标准误差
若要把卡方值作为参数不确定度的补充展示,需手动计算卡方值再结合perr标注:
- 卡方值计算:
chi2 = np.sum(((y - func(x, *popt))/sigma)**2) - 约化卡方计算:
reduced_chi2 = chi2 / (len(y) - len(popt))
绘图时可通过plt.text()或图例,将卡方值、参数值、不确定度一起展示。
2. 代码示例调整建议
以线性拟合为例,调整后的代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 模拟数据 x = np.linspace(0, 10, 50) y = 2*x + 3 + np.random.normal(0, 1, size=len(x)) sigma = np.ones_like(y) # 假设每个数据点标准差为1 # 拟合函数 def linear_func(x, a, b): return a * x + b # 执行拟合 popt, pcov = curve_fit(linear_func, x, y, sigma=sigma, absolute_sigma=True) perr = np.sqrt(np.diag(pcov)) # 计算卡方和约化卡方 residuals = y - linear_func(x, *popt) chi2 = np.sum((residuals / sigma)**2) reduced_chi2 = chi2 / (len(y) - len(popt)) # 绘图展示 plt.scatter(x, y, label='原始数据') plt.plot(x, linear_func(x, *popt), 'r-', label=f'拟合结果: a={popt[0]:.2f}±{perr[0]:.2f}, b={popt[1]:.2f}±{perr[1]:.2f}\n卡方值={chi2:.2f}, 约化卡方={reduced_chi2:.2f}') plt.legend() plt.show()
3. .format(popt[0], perr[0], popt[1], perr[1])解析
这是Python的字符串格式化方法,作用是把括号内的数值依次替换到字符串的占位符中:
popt[0]:拟合得到的第一个参数(如线性拟合的斜率)perr[0]:第一个参数的标准误差popt[1]:拟合得到的第二个参数(如线性拟合的截距)perr[1]:第二个参数的标准误差
比如若popt = [2.01, 3.05]、perr = [0.08, 0.12],格式化后会生成字符串拟合结果: a=2.01±0.08, b=3.05±0.12,方便将拟合结果直观展示在图例或文本中。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

