Як швидко взяти вибірку X, якщо exp (X) ~ Gamma?


12

У мене проста проблема вибірки, де виглядає моя внутрішня петля:

v = sample_gamma(k, a)

де sample_gammaзразки з розподілу Гамми утворюють зразок Діріхле.

Це працює добре, але для деяких значень k / a деякі з обчислень нижче за течією підпадають.

Я адаптував його до використання змінних простору журналу:

v = log(sample_gamma(k, a))

Після адаптації всіх решти програми вона працює коректно (принаймні, це дає мені ті ж точні результати на тестових випадках). Однак це повільніше, ніж раніше.

Чи є спосіб безпосередньо вибірки без використання повільних функцій, таких як ? Я для цього спробував googling, але навіть не знаю, чи має цей розподіл загальну назву (log-gamma?).журнал ( )X,exp(X)Gammalog()


Все, що вам потрібно зробити, - розділити кожну гамма-змінну на їх суму. Як же тоді відбувається підтікання? І як прийняття логарифму вирішує цю проблему (ви не можете обчислити суму, не повторивши повторного повернення)?
whuber

@whuber У просторі журналу ви обчислюєте суму, а потім віднімаєте її від кожного елемента. Отже, це дозволяє уникнути першої точки підтоплення. Трохи в подальшій обробці, коли ці диріхлети служать компонентами суміші і знову помножуються на невеликі числа.
luispedro

Додавання журналів математично неправильно: це відповідає множенню гам, а не їх додаванню. Так, ви можете отримати робочі результати, але вони точно не матимуть дирихлетського розподілу! Знову ж таки, яка саме природа оригінального підтоку та які розрахунки ви робите, коли це відбувається? З якими фактичними значеннями ви працюєте?
whuber

@whuber Я, можливо, трохи спростив своє опис. Я роблю для i {t = gamma (a, b); сума + = t; d [i] = log (t)}; logsum = журнал (сума); forall i {d [i] - = logsum; }. Раніше це перетікало, якщо а було дуже мало.
luispedro

Зрозумів: для біля 0 ти будеш неприємно, незважаючи ні на що. Цікава проблема! α
whuber

Відповіді:


9

Розглянемо невеликий параметр фігури поблизу 0, наприклад . В діапазоні між 0 і , приблизно , так що гамма PDF приблизно . Це може бути інтегровано до приблизного CDF, . Перевернувши його, ми бачимо потужність : величезний показник. Для це спричиняє певний шанс підливу (подвійне значення точності менше , більше або менше). Ось сюжет шансу отримати підтік як функцію базового десяти логарифму& alpha ; = 1 / 100 & alpha ; е - & alpha ; 1 х & alpha ; - 1 г х / Γ ( & alpha ; ) F & alpha ; ( х ) = х & alpha ;αα=1/100αeα1xα1dx/Γ(α) 1/& alpha& alpha=1/10010-300& alphaFα(x)=xααΓ(α)1/αα=1/10010300α :

введіть тут опис зображення

Одне рішення - використовувати це наближення для генерації змінних журналу (Gamma): насправді, спробуйте створити змінну Gamma, і якщо вона занадто мала, генеруйте її логарифм із цього приблизного розподілу потужності (як показано нижче). (Робіть це неодноразово, поки журнал не буде в межах підтоку, щоб він був дійсною заміною оригінальній змінній підтікання.) Для обчислення Діріхле віднімайте максимум усіх логарифмів від кожного з значень журналу: це неявно змінює масштаби всіх змінних Gamma, так що це не вплине на значення Діріхле. Розглядайте будь-який результуючий журнал, який є занадто малим (скажімо, менше -100) як логом справжнього нуля. Розкрийте інші журнали. Тепер ви можете продовжувати без переливу.

Це займе навіть більше часу, ніж раніше, але принаймні це спрацює!

Для створення приблизного журналу змінної Gamma з параметром форми , попередньо обчисліть . Це легко, адже існують алгоритми для обчислення значень журналу Gamma безпосередньо . Генерація рівномірного випадкового поплавка між 0 і 1, взяти її логарифм, розділіть , і додайте до нього.C = log ( Γ ( α ) ) + log ( α ) α CαC=log(Γ(α))+log(α)αC

Оскільки параметр масштабу просто масштабує змінну, немає проблем з її розміщенням у цих процедурах. Вам це навіть не потрібно, якщо всі параметри шкали однакові.

Редагувати

В іншій відповіді ОП описує метод, в якому потужність однорідної змінної ( змінної) множиться на змінну . Це працює, тому що pdf спільного розподілу цих двох змінних дорівнює . Щоб знайти pdf підставляємо , ділимо на якобійський і інтегруємо x . Інтеграл повинен бути від z до ∞, оскільки 0 y 1 , звідсиB ( α ) Γ ( α + 1 ) ( α x α - 1 ) ( y α e - y d y / Γ ( α + 1 ) ) z = x y y z / x x1/αB(α)Γ(α+1)(αxα1)(yαeydy/Γ(α+1))z=xyyz/xxxz0y1

pdf(z)=αΓ(α+1)z(хα/х)е-х(z/х)α-1гхгz=1Γ(α)zα-1е-zгz,

що є pdf розподілу .Γ(α)

Вся суть у тому, що коли , значення, отримане з Γ ( α + 1 ) , навряд чи переллється, і шляхом підсумовування його журналу і в 1 / α рази більше журналу незалежної рівномірної змінної ми матимемо журнал a Varia ( α ) змінна. Журнал, ймовірно, буде дуже негативним, але ми обійшли конструкцію його антилога, який переллється в подання з плаваючою комою.0<α<1Γ(α+1)1/αΓ(α)


1
Γ(α)Γ(α)+Γ(1)Бета(α,1)Γ(α)+Γ(1)Γ(α+1)α0уехpо(1)-журнал(у)Γ(α+1)

7

raαbβ

  if (a < 1)
    {
      double u = gsl_rng_uniform_pos (r);
      return gsl_ran_gamma (r, 1.0 + a, b) * pow (u, 1.0 / a);
   }

gsl_ran_gammagsl_rng_uniform_pos(0,1)_pos

Тому я можу взяти журнал останнього виразу та використовувати

return log(gsl_ran_gamma(r, 1.0 + a, b)) + log(u)/a;

log()pow()1/а1/а


α

Я відредагував свою відповідь, щоб зараз включити більше деталей.
luispedro

Дякую: але що таке "r"? (Зверніть увагу, що рекурсія обмежена: максимум один рекурсивний дзвінок буде здійснено, оскільки a> 0 означає 1,0 + a> 1.)
whuber

r - генератор випадкових чисел (звідки ви отримуєте випадкові числа).
luispedro

Γ(α+1)Б(α,1)Γ(α)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.