如何使用Python的scipy.curve_fit获取高斯拟合的质量?
用scipy.optimize.curve_fit拟合高斯函数后的拟合质量评估方法
以下是几种常用的拟合质量评估方法,直接基于curve_fit的输出和原始数据计算:
1. 决定系数(R²)
R²衡量拟合模型对数据变异的解释程度,取值范围0到1,越接近1说明拟合效果越好。
计算步骤:
- 用拟合得到的参数生成拟合值
y_fit - 计算总平方和(TSS):观测值与均值的偏差平方和
- 计算残差平方和(RSS):观测值与拟合值的偏差平方和
- R² = 1 - (RSS / TSS)
示例代码:
import numpy as np from scipy.optimize import curve_fit # 定义高斯函数 def gaussian(x, amp, mean, std): return amp * np.exp(-(x - mean)**2 / (2 * std**2)) # 原始数据示例 x_data = np.linspace(-5, 5, 100) y_data = gaussian(x_data, 3, 0, 1) + np.random.normal(0, 0.2, 100) # 执行拟合 params, cov = curve_fit(gaussian, x_data, y_data) y_fit = gaussian(x_data, *params) # 计算R² y_mean = np.mean(y_data) tss = np.sum((y_data - y_mean)**2) rss = np.sum((y_data - y_fit)**2) r_squared = 1 - (rss / tss) print(f"R²值: {r_squared:.4f}")
2. 残差分析
残差是y_data - y_fit,通过观察残差的分布可以判断拟合是否合理:
- 残差应随机分布在0附近,无明显趋势(如递增、递减、周期性)
- 残差的方差应大致均匀
示例代码(绘制残差图):
import matplotlib.pyplot as plt residuals = y_data - y_fit plt.scatter(x_data, residuals) plt.axhline(y=0, color='r', linestyle='--') plt.xlabel('x') plt.ylabel('Residuals') plt.title('Residual Plot') plt.show()
3. 卡方(χ²)检验
如果你的数据带有测量误差(即每个数据点的标准差sigma已知),可以计算卡方值:
χ² = Σ[(y_obs - y_fit)² / sigma²]
拟合良好时,χ²值应接近自由度(自由度=数据点数量-拟合参数数量),或者χ²/自由度接近1。
示例代码:
# 假设每个数据点的测量标准差已知 sigma = np.full_like(y_data, 0.2) chi_squared = np.sum((y_data - y_fit)**2 / sigma**2) degrees_of_freedom = len(y_data) - len(params) chi_squared_per_dof = chi_squared / degrees_of_freedom print(f"χ²值: {chi_squared:.4f}, χ²/自由度: {chi_squared_per_dof:.4f}")
4. 均方根误差(RMSE)
RMSE衡量拟合值与观测值之间的平均偏差,数值越小说明拟合精度越高。
计算代码:
rmse = np.sqrt(np.mean((y_data - y_fit)**2)) print(f"RMSE值: {rmse:.4f}")
内容的提问来源于stack exchange,提问作者Captain Nikon
相关产品推荐
相关产品推荐

