dlinyj: (Default)
[personal profile] dlinyj
Решил похвастаться получившимися результатами. Я не только реализовал это, но и ещё сделал полную проверку. Нет, конечно я лукавлю, по критерию Пирсона или я не проверял, но на глаз всё хорошо.


Гистограмма распределения и проверочная кривая экспоненты


На картинке приведена гистограмма распределения для 1000 000 сгенерированных таким образом случайных чисел.

Выражаю благодарность товарищу [livejournal.com profile] 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)

То-ло-ло?

Date: 2012-05-10 03:50 pm (UTC)
From: [identity profile] a-r-t-o.livejournal.com
А если, серьезно, то не понял в чем фича,- подтвердил известное известной функцией?!

Date: 2012-05-10 03:52 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Для отладки, чтобы не гонять прибор, мне нужен генератор случайных чисел с экспоненциальным распределением. Вот я его реализовал. Поглядел, удовлетворяет ли он моим требованиям.

Date: 2012-05-10 04:47 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Это еще ничего. Мне как-то в одной модели нужен был генератор случайных чисел с распределением сложной формы (моделирование процесса получения УФ-спектра на космическом спектрографе с МКП+КПА в качестве светоприемника). С месяц, наверное, голову ломал, как это победить. А решение оказалось простым донельзя.

P.S. На самом деле получающиеся при помощи drand48 распределения не совсем случайны. Есть небольшие отклонения в пределах 1..2% от желаемой функции (а все от того, что псевдослучайные числа, генерируемые компьютером, распределены-таки не совсем равномерно). В принципе, если каждые ~1000..10000 значений делать переинициализацию генератора с использованием /dev/random, получается лучше.

Date: 2012-05-10 05:07 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Если не секрет как? Ультралюбопытно!

За постскриптум спасибо, учту!

Date: 2012-05-10 05:47 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
> Если не секрет как?

Довольно грубо строилась зависимость численная F(x), из которой интерполяцией сплайнами и находилась обратная функция x(F). Модель делал в Octave, поэтому считалось очень долго: экспозиция в ~1 секунду для довольно яркой звезды обсчитывалась около суток. Если бы это перенести на CUDA, было бы намного быстрей. Но, к сожалению, я эту тему забросил — пока у меня и других забот хватает.

Date: 2012-05-16 12:10 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Сейчас читаю один диссер, там говорится о том, что это очень важная задача. И как я предполагаю наукоёмкая

Date: 2012-05-16 12:34 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Ну, обычная обратная задача.
С ними уже много лет борются - и будут бороться. Но, благодаря нарастающему развитию вычислительной техники, подозреваю, что теория решения обратных задач постепенно завянет, переметнувшись на численные методы.

Date: 2012-05-19 11:00 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Как раз прочитал эту тему, оказывается что не всё так просто:
При моделировании поведения какого-либо процесса или объекта, находяш;егося под воздействием случайных факторов, возникает задача получения случайных чисел, закон распределения которых совпадает с законом распределения, наблюдаемым в эксперименте
...
Один из подходов к решению указанной задачи заключается в нахождении некоторой аппроксимирующей функции, которая описывает экспериментальный закон распределения с требуемой точностью. На основе этой функции искомые случайные числа могут быть получены из равномерных случайных чисел методом обратной функции [7].
Несмотря на кажущуюся простоту такого подхода, при его практической реализации возникает ряд проблем, связанных, в первую очередь, с ограничениями, которые накладываются на функции,
аппроксимирующие плотность распределения и функцию распределения. К
ЭТИМ ограничениям относятся:. Кроме того,
возникают проблемы, связанные с низкой устойчивостью получаемых
решений.


Далее там рассматриваются решение с помощью полиномов Эрмита.

После чего я себе повскрывал мозг (не очень сложно, но муторно). Если, что, дисер Димаки, Андрей Викторович "Аппаратно-программный комплекс для моделирования и исследования стохастических процессов", 2006 г. . Купил в интернетах за 500 рублей. При большом желании могу поделиться :).

Date: 2012-05-19 12:10 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Все зависит от того, какая вам нужна точность. Если погрешности в 0.5..1% будет многовато, то действительно, придется выкручиваться через аппроксимацию полиномами и аналитическое решение.
Кстати, в диссертациях зачастую подборка библиографии бывает куда ценнее самого содержимого работы.

Date: 2012-05-19 12:42 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
>> Кстати, в диссертациях зачастую подборка библиографии бывает куда ценнее самого содержимого работы.

Ради библиографии и искал :)

Date: 2012-05-10 06:59 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Кстати, разве там не 1/λ?
В википедии пишут, что для экспоненциального распределения 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 - равномерное).

Date: 2012-05-10 08:40 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Не совсем верно:
F(x) = 1 - exp(-λx)

Отсюда

exp(-λx)=1-F(x) - здесь был недочёт

после получается

ln(1-F(x))=-λx

И после преобразований получилось

x=-ln(1-F(x))/λ

Согласен, что в формуле ошибка.

Date: 2012-05-11 04:06 am (UTC)
From: [identity profile] vladimirad.livejournal.com
Прикольно. Но теорийку надо почитать. Скачайте уж Вентцель, чтоли.
Главное не распределение, а период повторения, его проверить очень легко. Скорее всего на гистограмме получилась пара, а то и тройка периодов. Что в общем сводит оценку гистограммой к смешной картинке. Все бьются за большой период повторения, а распределение как-то само получается.

Date: 2012-05-11 05:10 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Вентцель настольная книга (точнее книги), но про период повторения не помню. Если не сложно напомните.

Date: 2012-05-11 05:52 am (UTC)
From: [identity profile] vladimirad.livejournal.com
Это не из Вентцель.
Но главное, все функции генерации случайных переодичные, период может быть большим, а может быть и не очень. Все псевдослучайные считаются слычайными только внутри периода. Потому и переходят к супердлинным числам высокой разрядности, чтобы удлинить интервал. Например Майкрософт бейсик лохматого года - период около 32000 (2 в 15 степени - 1). Пример, берем весь период и десяток чисел из второго, очевидно, что распределение нарушается.
Проверить легко, запоминаем n и n+1, крутим числа до повторения пары.
Вообще с псевдослучайными все общаются на ты, что неверно. Достаточно округлить их и получится последовательность с еще более коротким периодом или они перестануь быть псевдослучайными. И другие интересные приколы.

Date: 2012-05-11 06:44 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Я понял. Есть Алгоритм Л'Экюера, который обеспечивает длинну последовательности как 10^18: http://algorithm.narod.ru/random/uniform.html

Единственное, что я поленился раскурить как инициализировать разные стартовые значения.

Для использования drand48() товарищ [livejournal.com profile] eddy_em здесь в комментариях советует его реинициализировать каждые 1000-10000 значений.

Date: 2012-05-11 06:53 am (UTC)
From: [identity profile] vladimirad.livejournal.com
Любой можно реинициализировать, но будет ли эта штука псевдослучайной последовательностью?
Я еще не критиковал Миллион значений на гистограммк в 10 интервалов? Самое время.

Date: 2012-05-11 06:58 am (UTC)
From: [identity profile] dlinyj.livejournal.com
>>Любой можно реинициализировать, но будет ли эта штука псевдослучайной последовательностью?

Если реинициализировать другой псевдослучайной последовательностью (там идёт реинициализация файлов /dev/urandom, который представляет собой энтропию системы), то длинна последовательности увеличивается в разы. Для моих целей длинны последовательности в 10^10 хватит за глаза и за уши.

>>Я еще не критиковал Миллион значений на гистограммк в 10 интервалов? Самое время.

Быть может потыкаете носом, где почитать как выбрать количество интервалов относительно количества значений?

Date: 2012-05-11 07:00 am (UTC)
From: [identity profile] vladimirad.livejournal.com
Начните с проверки периода.

Date: 2012-05-11 07:19 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Не думаю что это важно.

Date: 2012-05-11 07:23 am (UTC)
From: [identity profile] vladimirad.livejournal.com
О чем тогда говорить. Миллион значений генерить не лень для картинки, а проверить саму последовательность нет времени и желания.
Вентцель не только полезная книга, но еще и хорошая подставка под шкаф.

Date: 2012-05-11 07:25 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Цитирую: При этом для современных компьютеров период генерируемой последовательности становится недостижимым (длина оценивается по порядку как 10^18).

Зачем проверять, если есть уже проверенное. Меня больше интересует, как выбирать количество интервалов.

Я вам могу хоть миллиард значений сгенерировать :)

Date: 2012-05-11 07:26 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Архисильно сомневаюсь, что вы сможете за сознательную жизнь замкнуть последовательность

Date: 2012-05-12 02:49 am (UTC)
From: [identity profile] vladimirad.livejournal.com
Реализация алгоритма очень много значит.

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 09:42 am
Powered by Dreamwidth Studios