如何使用Scipy生成并绘制正态分布N[5,3²]的概率密度函数PDF
Scipy绘制正态分布N(5, 3²)概率密度函数的实现方案
你当前的代码存在两个问题:
stats.norm.rvs()的作用是生成符合指定正态分布的随机抽样值,无法直接输出概率密度函数(PDF)的计算结果用于绘图stats.norm系列方法的第二个位置参数是标准差,你需要的分布标准差是3,如果传入3**2(也就是9),实际对应的是N(5, 9²)的分布,和你的需求不符。
完整实现步骤
- 导入所需依赖:除了scipy.stats外,还需要matplotlib用于绘图、numpy用于生成连续的横轴数值
- 定义正态分布参数:均值
mu=5、标准差sigma=3 - 生成横轴连续区间:一般取均值上下4倍标准差的范围即可覆盖99.99%的分布区间,生成1000个以上连续点可保证曲线平滑
- 调用
stats.norm.pdf()方法计算对应横轴点的PDF数值 - 绘图展示
可直接运行的完整代码如下:
import numpy as np from scipy import stats import matplotlib.pyplot as plt # 定义分布参数 mu = 5 sigma = 3 # 生成横轴数据 x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000) # 计算对应点的PDF值 pdf = stats.norm.pdf(x, loc=mu, scale=sigma) # 绘制PDF曲线 plt.plot(x, pdf, 'b-', linewidth=2, label=f'N({mu}, {sigma}²) 概率密度函数') # 配置图表样式 plt.xlabel('数值') plt.ylabel('概率密度') plt.legend() # 展示图表 plt.show()
可选拓展:叠加随机样本直方图验证
如果需要和你之前通过rvs生成的随机样本的分布做对比,可以在上述代码的plt.plot和plt.legend之间加入以下代码,叠加归一化后的直方图:
# 生成10000个符合N(5,3²)的随机样本 sample = stats.norm.rvs(loc=mu, scale=sigma, size=10000) # 绘制归一化直方图,alpha调整透明度避免遮挡PDF曲线 plt.hist(sample, bins=30, density=True, alpha=0.3, color='gray', label='随机样本分布直方图')
内容的提问来源于stack exchange,提问作者teddy
相关产品推荐
相关产品推荐

