如何在Spyder中绘制单条正态分布PDF曲线?代码问题排查
你的代码有三个关键问题,导致无法生成正确的PDF曲线
PDF公式系数错误
你定义的normal_dist函数里,正态分布概率密度函数的核心系数写错了。正确的正态分布PDF公式是:
$$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e{-\frac{(x-\mu)2}{2\sigma^2}}$$
你的代码里把系数写成了(np.pi*sd),这完全不符合公式,应该替换成1/(sd * np.sqrt(2*np.pi))。使用无序随机点绘图
你直接用np.random.normal生成的原始随机数组s作为x轴参数,这些数据点是无序的,plt.plot会按照数组的原始顺序连接每个点,必然会出现混乱的交叉线条。正确的做法是生成一组有序的x轴取值范围(比如覆盖μ±4σ的等间隔序列),再计算对应每个x的PDF值后绘图。可选优化:添加归一化直方图对比
为了直观验证PDF的正确性,可以同时绘制原始数据的归一化直方图,这样能清晰看到PDF曲线和数据分布的匹配程度。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt mu, sigma = 0, 1 N = 100000 s = np.random.normal(mu, sigma, N) def normal_dist(x, mean, sd): # 修正后的PDF公式 prob_density = 1/(sd * np.sqrt(2*np.pi)) * np.exp(-0.5*((x-mean)/sd)**2) return prob_density # 生成有序的x轴序列,覆盖数据主要分布区间 x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000) pdf = normal_dist(x, mu, sigma) plt.plot(x, pdf, color='red', label='Normal PDF') # 绘制归一化直方图,alpha设置透明度避免遮挡曲线 plt.hist(s, bins=50, density=True, alpha=0.3, label='Data Histogram') plt.xlabel('Data points') plt.ylabel('Probability Density') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者MaybeMaybeNot
相关产品推荐
相关产品推荐

