Функция плотности вероятности в SciPy ведет себя иначе, чем ожидалось

#python #numpy #scipy #statistics #normal-distribution

#python #numpy #scipy #Статистика #нормальное распределение

Вопрос:

Я пытаюсь построить кривую нормального распределения, используя Python. Сначала я сделал это вручную, используя обычную функцию плотности вероятности, а затем я обнаружил, что в scipy есть функция выхода pdf в модуле stats. Однако результаты, которые я получаю, сильно отличаются.

Ниже приведен пример, который я пробовал:

 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 делает?

Я пока не знаю, какая кривая правильная.

Комментарии:

1. Попробуйте, например, num_dist = 50000 и измените bins аргумент plt.hist с num_dist на bins=100 .

Ответ №1:

Функция 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)))
....