Кумулятивная функция вероятности Пуассона в 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))

и теперь оба связаны должны быть включены.

Да, это так.

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