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

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

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

Спасибо

У меня есть этот код на java от Knuth.

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;
}

person Dixon Steel    schedule 25.09.2014    source источник
comment
Вам необходимо знать, какая функция для распределения Пуассона должна запускаться: en.wikipedia.org/wiki/Poisson_distribution. Если вы можете использовать библиотеку, попробуйте Apache Commons Math: commons.apache.org/proper/commons-math/apidocs/org/apache/   -  person duffymo    schedule 25.09.2014
comment
Функция была задана как f (K, lambda) = Pr (k) = lambda ^ k e ^ lambda / k !; e = натуральный логарифм 2,71 ... Я не знаю, что с этим делать, я понятия не имею, что я здесь делаю. Пытался вставить форумла на картинке и не вышло.   -  person Dixon Steel    schedule 26.09.2014
comment
Это согласуется с опубликованной мной ссылкой.   -  person duffymo    schedule 26.09.2014
comment
Общая математика или вики? Даже если он согласен, что я здесь делаю не так, что данные не соответствуют кривой?   -  person Dixon Steel    schedule 26.09.2014
comment
Почему возвращаемый тип double вместо int? stackoverflow.com/ questions / 1241555 /   -  person Ravi Yenugu    schedule 26.09.2014
comment
Поскольку казалось, что все данные Пуассона, на которые я смотрел, были двойными, я действительно не уверен, как это работает.   -  person Dixon Steel    schedule 26.09.2014
comment
Должно быть двойным - это то, что вернет функция exp ().   -  person duffymo    schedule 26.09.2014
comment
Итак, как мне правильно сгенерировать свои числа?   -  person Dixon Steel    schedule 26.09.2014
comment
Что ты имеешь в виду? Как выглядит ваш график?   -  person Jay Elston    schedule 26.09.2014
comment
Также обратите внимание, что эта формула не подходит для больших значений лямбда. exp (-1000) ~ = 10 ^ - 435. Вы можете получить некоторые идеи из ответов на этот вопрос: stackoverflow.com/questions/5657861/   -  person Jay Elston    schedule 26.09.2014
comment
Мой график начинается с 1 и продолжает расти по мере того, как n становится больше и становится очень неровным. Мне нужно сгенерировать эти данные, чтобы проверить код.   -  person Dixon Steel    schedule 26.09.2014


Ответы (1)


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

Действительное число отображается на компьютере в форме, аналогичной научной записи:

Значащие цифры × основание ^ экспонента

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

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

double L = Math.exp(-lambda);

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

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

x = p(L);

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

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

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

x = 100 * p(L/100);

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

person Jay Elston    schedule 01.10.2014