你差点就赢了!首先,请注意在同一轴上绘制两个柱状图:plt.hist(avg[0:])
以及
^{pr2}$
因此,您可以在直方图上绘制法线密度,您正确地用normed=True参数对第二个图进行了标准化。但是,您也忘记了将第一个直方图标准化(plt.hist(avg[0:]), normed=True)。在
我还建议,既然您已经导入了scipy.stats,那么不妨使用该模块中的正态分布,而不是自己编写pdf。在
把这些放在一起,我们有:import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
# 1000 simulations of die roll
n = 10000
avg = []
for i in range(1,n):
a = np.random.randint(1,7,10)
avg.append(np.average(a))
# CHANGED: normalise this histogram too
plt.hist(avg[0:], 20, normed=True)
zscore = stats.zscore(avg[0:])
mu, sigma = np.mean(avg), np.std(avg)
s = np.random.normal(mu, sigma, 10000)
# Create the bins and histogram
count, bins, ignored = plt.hist(s, 20, normed=True)
# Use scipy.stats implementation of the normal pdf
# Plot the distribution curve
x = np.linspace(1.5, 5.5, num=100)
plt.plot(x, stats.norm.pdf(x, mu, sigma))
这给了我以下的情节:
编辑
在你的评论中:我在np.linspace中如何选择1.5和5.5
是否可以在非标准化直方图上绘制正常核?在
去问q1。首先,我通过眼睛选择了1.5和5.5。在绘制柱状图之后,我看到柱状图的区域在1.5到5.5之间,所以这就是我们想要绘制正态分布的范围。在
选择这一范围的一种更具纲领性的方法是:x = np.linspace(bins.min(), bins.max(), num=100)
至于问题2,是的,我们可以达到你想要的。但是,你应该知道,我们根本就不会绘制概率密度函数。在
在绘制直方图时删除normed=True参数后:x = np.linspace(bins.min(), bins.max(), num=100)
# Find pdf of normal kernel at mu
max_density = stats.norm.pdf(mu, mu, sigma)
# Calculate how to scale pdf
scale = count.max() / max_density
plt.plot(x, scale * stats.norm.pdf(x, mu, sigma))
这给了我以下的情节: