Кумулятивная функция вероятности Пуассона в python возвращает близкое, но не истинное значение! Зачем?
Я относительно новичок в Python и учу себя. Я поставил перед собой задачу улучшить свое мастерство; написать пуассоновский калькулятор вероятностей.
Я написал 3 функции в общей сложности. 1-й: вероятность Пуассона одной дискретной переменной. 2-е: кумулятивная вероятность Пуассона от 0. 3-е: кумулятивная вероятность Пуассона в замкнутом интервале.
Каким-то образом первые две функции работают отлично, но последняя (которая вызывает вторую) очень близка, но не соответствует действительности.
Я использовал следующую математику:
Распределение Пуассона:
Кумулятивное распределение Пуассона:
Интервал Вероятность:
А вот мой исходный код:
from math import exp, factorial
def poissonpdf(mean, discvar):
"""Returns Poisson probability based on mean and a discreet random variable.
:param mean: float
:param discvar: positive integer or 0
:return: float between 0 and 1
"""
usage = 'Usage: poisson(mean, discreet random variable)'
# if type(discvar) != int or discvar < 0:
# print 'ERR: discreet random variable value invalid.'
# print usage
# return None
# if type(mean) != int or float:
# print 'ERR: mean value invalid.'
# print usage
# return None
probability = (mean**discvar * exp(-mean)) / float(factorial(discvar))
return probability
def poissoncdf(mean, k):
"""Returns cumulative Poisson probability until k.
:param mean: float
:param k: integer
:return: float between 0 and 1
"""
cumulative = 0.0
i = 0
while i <= k:
cumulative += (mean ** i) / float(factorial(i))
i += 1
cumulative *= exp(-mean)
return cumulative
def poissoncdfinterval(mean, lower, upper):
"""Returns cumulative Poisson probability based on mean and a range of discreet random variables.
Including lower bound and excluding upper.
:param mean: float
:param lower: positive integer or 0
:param upper: positive integer or 0
:return: float between 0 and 1
"""
usage = 'Usage: poisson(mean, discreet random variable, number of iterations)'
# if type(mean) != float or type(mean) != int:
# print 'ERR: mean value invalid.'
# print usage
# return None
# if type(lower) != int or lower < 0 or type(upper) != int or upper < 0:
# print 'ERR: invalid interval.'
# print usage
# return None
probability = poissoncdf(mean, upper) - poissoncdf(mean, lower)
return probability
print 'PoissonPdf mean=4, X=2:', poissonpdf(4, 2) #works
print
print 'PoisoonCdf mean=4, from 0 to 2:', poissoncdf(4, 2) #works
print
print 'PosiionCdf on interval from 2,4 with mean 4:', poissoncdfinterval(4, 2, 4) #close...
Я знаю, что третья функция не включает верхнюю границу.
Любые исправления в моем использовании PEP и любые способы улучшения моего синтаксиса приветствуются.
1 ответ
Оказывается, моя функция была правильной. Я не осознавал, что включаю верхнюю границу и исключаю нижнюю, а не наоборот.
Я изменил эту строку:
probability = poissoncdf(mean, upper) - poissoncdf(mean, lower)
К этому:
probability = poissoncdf(mean, upper) - poissoncdf(mean, (lower-1))
и теперь оба связаны должны быть включены.
Да, это так.