График плотности распределения Пуассона

Мне нужно нарисовать график плотности распределения Пуассона и гистограмму выборки, но возникает заданная ошибка, которую я понятия не имею, как решить.

import numpy as np
import matplotlib.pyplot as plt

lam = 3  # Параметр распределения Пуассона (лямбда)
x = np.arange(0, 20)

# Вычисление значений плотности распределения Пуассона
y = np.exp(-lam) * (lam ** x) / np.math.factorial(x)

# Построение графика
plt.plot(x, y, 'bo', ms=8)  # 'bo' - голубые круглые маркеры

plt.xlabel("Значение СВ")
plt.ylabel("Плотность")

plt.title("Распределение Пуассона")
plt.show()

Я пробовал заменить x на np.array(x), но это ни к чему не привело

Чего вы ожидаете от np.math.factorial([0, 1, ...., 19])?

sudden_appearance 27.09.2023 14:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вместо

y = np.exp(-lam) * (lam ** x) / np.math.factorial(x)

вам следует перебирать значения x, поэтому попробуйте следующее:

y = [np.exp(-lam) * (lam ** i) / np.math.factorial(i) for i in x]

Остальное то же самое.

Добавляя к ответу Угура, вам нужно векторизовать функцию факториала (очень необычно внутри пакета numpy). Также для барного сюжета необходимо использовать plt.bar:

import matplotlib.pylab as plt
import numpy as np

lam = 3  # Параметр распределения Пуассона (лямбда)
x = np.arange(0, 20)

# Вычисление значений плотности распределения Пуассона
y = np.exp(-lam) * (lam ** x) / np.vectorize(np.math.factorial)(x)

# Построение графика
plt.bar(x, y)  # 'bo' - голубые круглые маркеры

plt.xlabel("Значение СВ")
plt.ylabel("Плотность")

plt.title("Распределение Пуассона")
plt.show()

Согласно этот ответ , np.math.factorial и scipy.math.factorial являются просто псевдонимами math.factorial, который не работает с массивами numpy. Вместо этого используйте scipy.special.factorial, который может работать с массивами numpy.

from scipy.special import factorial

x = np.arange(0, 20)

# other code here

y = np.exp(-lam)*(lam**x)/factorial(x)

# plotting code here

Другие вопросы по теме