Экспоненциальное распределение
May. 10th, 2012 07:29 pmРешил похвастаться получившимися результатами. Я не только реализовал это, но и ещё сделал полную проверку. Нет, конечно я лукавлю, по критерию Пирсона или
я не проверял, но на глаз всё хорошо.

Гистограмма распределения и проверочная кривая экспоненты
На картинке приведена гистограмма распределения для 1000 000 сгенерированных таким образом случайных чисел.
Выражаю благодарность товарищу
eddy_em за наводку на свой пост http://eddy-em.livejournal.com/2573.html и функцию drand48(). В общем-то за основу и была взята програма, там уже приляпал функцию построения гистограммы и проверки.
Свой быдлокод приводить не буду, скажу, что получить экспоненциальное распределение очень просто:
rand_number=-lambda*(log(drand48()));
Где lambda - это интенсивность потока (отсылаю к википедии http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5)
я не проверял, но на глаз всё хорошо.
Гистограмма распределения и проверочная кривая экспоненты
На картинке приведена гистограмма распределения для 1000 000 сгенерированных таким образом случайных чисел.
Выражаю благодарность товарищу
Свой быдлокод приводить не буду, скажу, что получить экспоненциальное распределение очень просто:
rand_number=-lambda*(log(drand48()));
Где lambda - это интенсивность потока (отсылаю к википедии http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5)
То-ло-ло?
Date: 2012-05-10 03:50 pm (UTC)no subject
Date: 2012-05-10 03:52 pm (UTC)no subject
Date: 2012-05-10 04:47 pm (UTC)P.S. На самом деле получающиеся при помощи drand48 распределения не совсем случайны. Есть небольшие отклонения в пределах 1..2% от желаемой функции (а все от того, что псевдослучайные числа, генерируемые компьютером, распределены-таки не совсем равномерно). В принципе, если каждые ~1000..10000 значений делать переинициализацию генератора с использованием /dev/random, получается лучше.
no subject
Date: 2012-05-10 05:07 pm (UTC)За постскриптум спасибо, учту!
no subject
Date: 2012-05-10 05:47 pm (UTC)Довольно грубо строилась зависимость численная F(x), из которой интерполяцией сплайнами и находилась обратная функция x(F). Модель делал в Octave, поэтому считалось очень долго: экспозиция в ~1 секунду для довольно яркой звезды обсчитывалась около суток. Если бы это перенести на CUDA, было бы намного быстрей. Но, к сожалению, я эту тему забросил — пока у меня и других забот хватает.
no subject
Date: 2012-05-16 12:10 pm (UTC)no subject
Date: 2012-05-16 12:34 pm (UTC)С ними уже много лет борются - и будут бороться. Но, благодаря нарастающему развитию вычислительной техники, подозреваю, что теория решения обратных задач постепенно завянет, переметнувшись на численные методы.
no subject
Date: 2012-05-19 11:00 am (UTC)При моделировании поведения какого-либо процесса или объекта, находяш;егося под воздействием случайных факторов, возникает задача получения случайных чисел, закон распределения которых совпадает с законом распределения, наблюдаемым в эксперименте
...
Один из подходов к решению указанной задачи заключается в нахождении некоторой аппроксимирующей функции, которая описывает экспериментальный закон распределения с требуемой точностью. На основе этой функции искомые случайные числа могут быть получены из равномерных случайных чисел методом обратной функции [7].
Несмотря на кажущуюся простоту такого подхода, при его практической реализации возникает ряд проблем, связанных, в первую очередь, с ограничениями, которые накладываются на функции,
аппроксимирующие плотность распределения и функцию распределения. К
ЭТИМ ограничениям относятся:
возникают проблемы, связанные с низкой устойчивостью получаемых
решений.
Далее там рассматриваются решение с помощью полиномов Эрмита.
После чего я себе повскрывал мозг (не очень сложно, но муторно). Если, что, дисер Димаки, Андрей Викторович "Аппаратно-программный комплекс для моделирования и исследования стохастических процессов", 2006 г. . Купил в интернетах за 500 рублей. При большом желании могу поделиться :).
no subject
Date: 2012-05-19 12:10 pm (UTC)Кстати, в диссертациях зачастую подборка библиографии бывает куда ценнее самого содержимого работы.
no subject
Date: 2012-05-19 12:42 pm (UTC)Ради библиографии и искал :)
no subject
Date: 2012-05-10 06:59 pm (UTC)В википедии пишут, что для экспоненциального распределения f(x) = λexp(-&lambda x); а F(x) = 1 - exp(-λx).
Чтобы из равномерного распределения получить распределение с заданной F(x), нам необходимо найти обратную функцию x(F) и вместо F подставлять случайные значения, распределенные равномерно, тогда мы получим x - величину, распределенную как нам нужно.
В данном случае имеем: log(F-1) = -λx → x = -1/λ·F (замена F ←→ [F-1] правомерна, т.к. распределение F - равномерное).
no subject
Date: 2012-05-10 08:40 pm (UTC)F(x) = 1 - exp(-λx)
Отсюда
exp(-λx)=1-F(x) - здесь был недочёт
после получается
ln(1-F(x))=-λx
И после преобразований получилось
x=-ln(1-F(x))/λ
Согласен, что в формуле ошибка.
no subject
Date: 2012-05-11 04:06 am (UTC)Главное не распределение, а период повторения, его проверить очень легко. Скорее всего на гистограмме получилась пара, а то и тройка периодов. Что в общем сводит оценку гистограммой к смешной картинке. Все бьются за большой период повторения, а распределение как-то само получается.
no subject
Date: 2012-05-11 05:10 am (UTC)no subject
Date: 2012-05-11 05:52 am (UTC)Но главное, все функции генерации случайных переодичные, период может быть большим, а может быть и не очень. Все псевдослучайные считаются слычайными только внутри периода. Потому и переходят к супердлинным числам высокой разрядности, чтобы удлинить интервал. Например Майкрософт бейсик лохматого года - период около 32000 (2 в 15 степени - 1). Пример, берем весь период и десяток чисел из второго, очевидно, что распределение нарушается.
Проверить легко, запоминаем n и n+1, крутим числа до повторения пары.
Вообще с псевдослучайными все общаются на ты, что неверно. Достаточно округлить их и получится последовательность с еще более коротким периодом или они перестануь быть псевдослучайными. И другие интересные приколы.
no subject
Date: 2012-05-11 06:44 am (UTC)Единственное, что я поленился раскурить как инициализировать разные стартовые значения.
Для использования drand48() товарищ
no subject
Date: 2012-05-11 06:53 am (UTC)Я еще не критиковал Миллион значений на гистограммк в 10 интервалов? Самое время.
no subject
Date: 2012-05-11 06:58 am (UTC)Если реинициализировать другой псевдослучайной последовательностью (там идёт реинициализация файлов /dev/urandom, который представляет собой энтропию системы), то длинна последовательности увеличивается в разы. Для моих целей длинны последовательности в 10^10 хватит за глаза и за уши.
>>Я еще не критиковал Миллион значений на гистограммк в 10 интервалов? Самое время.
Быть может потыкаете носом, где почитать как выбрать количество интервалов относительно количества значений?
no subject
Date: 2012-05-11 07:00 am (UTC)no subject
Date: 2012-05-11 07:19 am (UTC)no subject
Date: 2012-05-11 07:23 am (UTC)Вентцель не только полезная книга, но еще и хорошая подставка под шкаф.
no subject
Date: 2012-05-11 07:25 am (UTC)Зачем проверять, если есть уже проверенное. Меня больше интересует, как выбирать количество интервалов.
Я вам могу хоть миллиард значений сгенерировать :)
no subject
Date: 2012-05-11 07:26 am (UTC)no subject
Date: 2012-05-12 02:49 am (UTC)