У тебя почти было это! Сначала убедитесь, что вы строите две гистограммы на одной и той же оси:
plt.hist(avg[0:])
и
plt.hist(s, 20, normed=True)
Чтобы вы могли построить нормальную плотность по гистограмме, вы правильно нормализовали второй график с аргументом 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))
Что дало мне следующий сюжет:
Редактировать
В комментариях вы спрашивали:
- Как я выбрал 1,5 и 5,5 в
np.linspace
- Можно ли построить нормальное ядро на ненормированной гистограмме?
По адресу 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))
Это дало мне следующий сюжет: