Кумулятивное биномиальное распределение для больших чисел

У меня есть следующая функция, реализованная в python:

# Calculation of cumulative binomial distribution
def PDP(p, N, min):
    pdp=0
    for k in range(min, N+1):
        pdp += (float(factorial(N))/(factorial(k)*factorial(N-k)))*(p**k)*((1-p)**(N-k))
    return pdp

Однако расчеты дают слишком большие значения при большом n (до 255). Я искал приближения к этим значениям, но безрезультатно. Как бы вы это сделали?


person Helder Esteves    schedule 24.01.2018    source источник
comment
числа становятся очень большими с высоким n, это не вопрос, скорее факт.   -  person Mitch Wheat    schedule 24.01.2018
comment
Да, я отредактировал.   -  person Helder Esteves    schedule 24.01.2018
comment
правда не лучше...   -  person Mitch Wheat    schedule 24.01.2018


Ответы (2)


Предположим, что X следует биномиальному распределению,

и вы хотите вычислить P (X >= m), я бы сначала сделал поправку на непрерывность, приближенную к P (X >= m-0,5), а затем я бы аппроксимировал ее, используя нормальное приближение.

P((X - np)/ sqrt(np(1-p)) >= (m-0.5-np)/sqrt(np(1-p)) 

что является приближением

P(Z >= (m-0.5-np)/sqrt(np(1-p)) 

где Z — стандартное нормальное распределение.

Ссылки для такого приближения.

person Siong Thye Goh    schedule 24.01.2018
comment
Ссылка битая, не могли бы вы написать название сайта или газеты? - person borgr; 27.01.2020
comment
Привет, я меняю ссылку на страницу исправления непрерывности в Википедии. Спасибо, что предупредили меня о битой ссылке. - person Siong Thye Goh; 27.01.2020
comment
Почему это лучше, чем аппроксимировать его с помощью центральной предельной теоремы? например, dummies.com/education/math/statistics/ - person borgr; 27.01.2020
comment
Мы используем центральную предельную теорему, но вносим поправку на то, что используем непрерывное распределение для аппроксимации дискретного распределения, вот пример, когда использование исправления улучшает результат. - person Siong Thye Goh; 27.01.2020

Основываясь на ответе Сионга, я придумал следующее решение:

import math

# Cumulative distribution function
def CDF(x):
    return (1.0 + math.erf(x/math.sqrt(2.0)))/2.0

# Approximation of binomial cdf with continuity correction for large n
# n: trials, p: success prob, m: starting successes
def BCDF(p, n, m):
    return 1-CDF((m-0.5-(n*p))/math.sqrt(n*p*(1-p)))
person Helder Esteves    schedule 24.01.2018