Распределение Пуассона в Java (правильность?)

1

Я должен генерировать данные для распределения Пуассона. Мой диапазон составляет от 1000 до 100 К. Где n - количество элементов данных; k изменяется от 1 до n. В нем говорится использовать лямбда как n/2

Я никогда не брал статистику и понятия не имею, как получить правильную кривую здесь. Я могу накормить его лямбдой как n/2, но меняет K от 0-n? Я попробовал это (передавая k в качестве параметра), и когда я рисую данные, они растут, а не хвост рыбы. Что я делаю неправильно, или я делаю это правильно?

благодаря

У меня есть этот код в java от Кнута.

static double poissonRandomNumber(int lambda) {
    double L = Math.exp(-lambda);
    int k = 0;
    double p = 1;
    do {
        k = k + 1;
        double u = Math.random();
        p = p * u;
    } while (p > L);
    return k - 1;
}
  • 1
    Вам нужно знать, для чего предназначена функция распределения Пуассона: en.wikipedia.org/wiki/Poisson_distribution . Если вы можете использовать библиотеку, попробуйте Apache Commons Math: commons.apache.org/proper/commons-math/apidocs/org/apache/…
  • 0
    Функция была задана как f (K, лямбда) = Pr (k) = лямбда ^ ke ^ лямбда / k !; e = натуральный логарифм 2,71 ... Я не знаю, что с этим делать, я понятия не имею, что я здесь делаю. Я попытался вставить forumla в картинке, и это не взяло.
Показать ещё 9 комментариев
Теги:
curve
poisson

1 ответ

0
Лучший ответ

Одной из проблем, с которыми вы сталкиваетесь, является основное ограничение того, как компьютеры представляют и выполняют вычисления с числами с плавающей запятой.

Действительное число представлено на компьютере в форме, подобной научной нотации:

Значительные цифры × base ^ exponent

Для чисел с двойной точностью используется 11 бит, используемых для показателя, и 52 для части "значимых цифр". Поскольку числа с плавающей запятой нормированы, первое положительное число с плавающей запятой> 0.0 имеет значение около 10 ^ -320 (это определено как Double.MIN_VALUE в Java). См. IEEE Standard 754 Floating Point Numbers для хорошей записи по этому вопросу.

Рассмотрим строку кода:

double L = Math.exp(-lambda);

При лямбда 1000, e ^ -1000 (около 10 ^ -435) меньше Double.MIN_VALUE, и нет никакого способа, чтобы компьютер мог представлять e ^ -1000 любым другим, чем он может представлять e ^ -1000 00

Вы можете решить эту проблему, заметив, что лямбда является "скоростью прибытия", и вы можете рассчитать случайные выборки для более коротких интервалов и суммировать их. То есть

x = p(L);

может быть вычислено как

x = p(L/2) + p(L/2);

и более крупные цифры могут быть аппроксимированы:

x = 100 * p(L/100);

В статье Википедии о распределении Пуассона есть несколько хороших указателей на способы вычисления распределений Пуассона для больших значений лямбда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню