You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()

关键细节说明:

  1. 初始参数猜测:curve_fit需要初始参数p0引导拟合方向,如果初始值偏离真实值过远,拟合可能失败。这里用数据的最大值、均值和经验标准差作为初始值,你可以根据自己的分布形态调整。
  2. 缩进修正:原代码中for循环内的计算语句未缩进,这会触发语法错误,已在代码中修正。
  3. 参数提取:curve_fit返回的params数组顺序与你定义的高斯函数参数顺序完全一致(振幅、均值、标准差)。

内容的提问来源于stack exchange,提问作者AXF567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:53:23