Java функция для распределения Пуассона для получения квантиля - PullRequest
0 голосов
/ 04 сентября 2018

Задача для меня - использовать Java для получения квантиля распределения Пуассона (целое число).

Поскольку я новичок в Java, я много гуглял и писал какой-то код, не уверен, что это правильно или нет, может кто-нибудь помочь мне в этом?

Согласно pdf-функции распределения Пуассона Распределение Пуассона

(pr = k) = pow ((лямбда), k) * pow (e, (-lambda)) / k!

Где k - число случаев, а лямбда - среднее значение распределения (ожидаемое количество случаев).

Мой код:

// quantile function calculate pdf for each i, sum it until it hits probability threshold pr; finally output i as distribution quantile; it calls the second function which aims to obtain i!;

private int quantile(double pr, double mean){ 

    int n = (long) 3 * mean;  
    double prev = 0;

    for (int i = 0; i < n; i++) {

    double curr = math.pow(mean, i) * math.exp(-mean) / factorialLoop(i);

    prev = curr; 
    curr = prev + curr; 

    if (curr < pr) {
        continue;
    }

    else {
        break;
    }
    }

    return i;
}

// The following function will return result for i!;

private static long factorialLoop(int n) {

if (n < 0) {
    return -1;
    }

    if (n == 0) {
    return 1;
    }

long result = 1;
for (int i = n; i > 0; i--) {
    result *= i;
}

return result;
}

Будет ли код возвращать i (выход квантиля для распределения Пуассона)? Спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018
// Poisson Distribution Quantile function: pr and mean are two parameters. Aims to return i for the quantile function as output。
// pr and mean are two parameters; pr is probability threshold and mean is expected occurence. 

private int quantile(double pr, double mean){ 

    int n = (long) 3 * mean;  
    double prev = 0;

    for (int i = 0; i < n; i++) {

        double curr = math.pow(mean, i) * math.exp(-mean) / factorialRecursive(i);

        double summ = curr + prev;

        if (summ >= pr) {
            break;
        }

        prev = summ; 

        }

    return i;

}


private static long factorialRecursive(int n) {

    if (n < 0) {
        return -1;
    }

    if (n == 0) {
        return 1;
    }


    if (n < 2)
        return n * 1;

    return n * factorialRecursive(n - 1);
}

Согласно pdf-функции распределения Пуассона (p = k) = (лямбда) k * e (- лямбда) / k!

k - вхождение, а лямбда - среднее

...