我正在尝试使用Python绘制正态分布曲线。首先,我使用正态概率密度函数手动进行了此操作,然后发现stats模块下scipy中存在一个退出函数pdf
。但是,我得到的结果却大不相同。
下面是我尝试的示例:
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
mean = 5
std_dev = 2
num_dist = 50
# Draw random samples from a normal (Gaussion) distribution
normalDist_dataset = np.random.normal(mean, std_dev, num_dist)
# Sort these values.
normalDist_dataset = sorted(normalDist_dataset)
# Create the bins and histogram
plt.figure(figsize=(15,7))
count, bins, ignored = plt.hist(normalDist_dataset, num_dist, density=True)
new_mean = np.mean(normalDist_dataset)
new_std = np.std(normalDist_dataset)
normal_curve1 = stats.norm.pdf(normalDist_dataset, new_mean, new_std)
normal_curve2 = (1/(new_std *np.sqrt(2*np.pi))) * (np.exp(-(bins - new_mean)**2 / (2 * new_std**2)))
plt.plot(normalDist_dataset, normal_curve1, linewidth=4, linestyle='dashed')
plt.plot(bins, normal_curve2, linewidth=4, color='y')
结果表明,我得到的两条曲线之间有很大不同。
我的猜测是,它与bins
或pdf
的行为与通常的公式有所不同。我在两个图中都使用了相同和新的均值和标准差。那么,如何更改代码以匹配stats.norm.pdf
在做什么?
我还不知道哪条曲线是正确的。
答案 0 :(得分:2)
函数plot
仅将点与线段相连。您的垃圾箱没有足够的点来显示平滑的曲线。可能的解决方案:
....
normal_curve1 = stats.norm.pdf(normalDist_dataset, new_mean, new_std)
bins = normalDist_dataset # Add this line
normal_curve2 = (1/(new_std *np.sqrt(2*np.pi))) * (np.exp(-(bins - new_mean)**2 / (2 * new_std**2)))
....