使用Python及Matplotlib为概率分布拟合高斯分布并求解标准差
如何用Python拟合高斯分布并计算标准差
首先,你需要先定义高斯分布的函数形式,这是curve_fit拟合的核心基础。标准高斯函数的形式如下:
def gaussian(x, amplitude, mean, stddev): return amplitude * np.exp(-((x - mean) ** 2) / (2 * stddev ** 2))
其中:
amplitude:曲线的峰值(振幅)mean:高斯分布的均值(对应曲线的中心位置)stddev:你需要求解的标准差
接下来结合你的现有代码,完成拟合的完整流程,同时修正原代码里的缩进错误(循环内代码未缩进会触发语法错误):
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 定义高斯拟合函数 def gaussian(x, amplitude, mean, stddev): return amplitude * np.exp(-((x - mean) ** 2) / (2 * stddev ** 2)) # 原参数与热力学量计算 q = 4000 qA = np.arange(0.000001, q+1, 1.0) qB = q - qA N = 2000 NA = 1000 NB = N - NA # 斯特林近似计算熵项 ASA = (qA + NA -1)*np.log(qA + NA -1) - qA*np.log(qA) - (NA -1)*np.log(NA -1) ASB = (qB + NB -1)*np.log(qB + NB -1) - qB*np.log(qB) - (NB -1)*np.log(NB -1) # 修正循环缩进:计算温度相关列表 TATA_list=[] for i in range(1, len(qA)-1): TATE = (qA[i+1] - qA[i-1]) / (ASA[i+1] - ASA[i-1]) TATA_list.append(TATE) TBTA_list=[] for i in range(1, len(qA)-1): TBTE = (qB[i+1] - qB[i-1]) / (ASB[i+1] - ASB[i-1]) TBTA_list.append(TBTE) # 计算归一化概率分布 AStot = (q + N -1)*np.log(q + N -1) - q*np.log(q) - (N-1)*np.log(N-1) Paprox = np.exp(ASA + ASB - AStot) SUMPX = sum(Paprox[:-1]) NormPAprox = Paprox/SUMPX # 准备拟合数据 x_data = qA / q y_data = NormPAprox # 设定拟合初始参数猜测(关键,直接影响拟合成功率) # 振幅取y的最大值,均值取x的中间值,标准差先设为0.1(可根据分布调整) initial_guess = [np.max(y_data), np.mean(x_data), 0.1] # 执行拟合 params, covariance = curve_fit(gaussian, x_data, y_data, p0=initial_guess) # 提取拟合结果 fit_amplitude, fit_mean, fit_stddev = params # 打印结果 print(f"拟合高斯分布均值:{fit_mean:.4f}") print(f"拟合高斯分布标准差:{fit_stddev:.4f}") # 生成拟合曲线数据 y_fit = gaussian(x_data, fit_amplitude, fit_mean, fit_stddev) # 绘制原分布与拟合曲线对比 plt.figure(figsize=(10,6)) plt.plot(x_data, y_data, label='原分布', alpha=0.6) plt.plot(x_data, y_fit, label=f'拟合高斯分布\n标准差={fit_stddev:.4f}', linestyle='--', color='red') plt.xlabel('qA/q') plt.ylabel('归一化概率') plt.legend() plt.show()
关键细节说明:
- 初始参数猜测:
curve_fit需要初始参数p0引导拟合方向,如果初始值偏离真实值过远,拟合可能失败。这里用数据的最大值、均值和经验标准差作为初始值,你可以根据自己的分布形态调整。 - 缩进修正:原代码中
for循环内的计算语句未缩进,这会触发语法错误,已在代码中修正。 - 参数提取:
curve_fit返回的params数组顺序与你定义的高斯函数参数顺序完全一致(振幅、均值、标准差)。
内容的提问来源于stack exchange,提问作者AXF567
相关产品推荐
相关产品推荐

