Exp (X) ~ Gamma ise hızlı bir şekilde X örneği nasıl alınır?


12

İç döngü gibi görünüyor basit bir örnekleme sorunu var:

v = sample_gamma(k, a)

burada sample_gammabir Dirichlet örneği oluşturmak için Gama dağılımından örnekler.

İyi çalışıyor, ancak k / a'nın bazı değerleri için bazı aşağı akış hesaplama akışları.

Günlük alanı değişkenlerini kullanmak için uyarladım:

v = log(sample_gamma(k, a))

Programın geri kalanının tümünü uyarladıktan sonra, doğru çalışır (en azından bana test senaryolarında aynı sonuçları verir). Ancak, öncekinden daha yavaştır.

gibi yavaş işlevleri kullanmadan ı doğrudan örneklemenin bir yolu var mı ? Bunun için googling yapmayı denedim, ancak bu dağıtımın ortak bir adı (log-gamma?) Olup olmadığını bile bilmiyorum.X,exp(X)Gammalog()


Tek yapmanız gereken her gamma değişkenini toplamlarına bölmektir. Öyleyse, taşma nasıl oluşur? Ve logaritmayı almak bu sorunu nasıl çözüyor (yine de tekrar üstlenmeden toplamı hesaplayamazsınız)?
whuber

@whuber Günlük alanında, toplamı hesaplar ve her öğeden çıkarırsınız . Böylece, bu ilk taşma noktasını önler. Bu dirichletler karışım bileşenleri olarak işlev gördüklerinde ve tekrar küçük sayılarla çarpıldıklarında biraz daha işlem yapılır.
luispedro

Günlükleri eklemek matematiksel olarak yanlıştır: gamaları eklemek yerine çoğaltmaya karşılık gelir . Evet, çalışma sonuçları alabilirsiniz, ancak kesinlikle Dirichlet dağılımı olmayacak! Yine, orijinal alt akışın doğası tam olarak nedir ve gerçekleştiğinde hangi hesaplamaları yapıyorsunuz? Üzerinde çalıştığınız gerçek değerler nelerdir?
whuber

@whuber Açıklamamda biraz fazla basitleştirilmiş olabilirim. Ben i {t = gamma (a, b) yapıyorum; toplam + = t; d [i] = log (t)}; logsum = log (toplam); forall i {d [i] - = logsum; }. Daha önce, a çok küçükse bu taştı.
luispedro

Anladım: yakınındaki 0 ​​için ne olursa olsun başınız belada olacak. İlginç bir sorun! α
whuber

Yanıtlar:


9

Küçük bir şekil parametresi düşünün gibi, 0'a yakın . 0 ve arasındaki aralıkta , yaklaşık , bu nedenle Gamma pdf'si yaklaşık . Bu yaklaşık bir CDF, entegre edilebilir . Tersine çevirirken, bir gücü görüyoruz : büyük bir üs. İçin (az bir çift hassas değeri bu Yetersizlik bir şans neden olur veya daha az). İşte temel on logaritmasının bir fonksiyonu olarak taşma şansının bir grafiğiα = 1 / -100 α E - α 1 x α - 1 d x / Γ ( α ) F α ( x ) = x ααα=1/100αeα1xα1dx/Γ(α) 1/αα=1/-10010-300αFα(x)=xααΓ(α)1/αα=1/10010300α :

resim açıklamasını buraya girin

Bir çözüm, log (Gamma) değişkenleri oluşturmak için bu yaklaşımdan yararlanmaktır: aslında, bir Gamma değişkeni üretmeye çalışın ve çok küçükse, logaritmasını bu yaklaşık güç dağılımından üretin (aşağıda gösterildiği gibi). (Günlük alt akış aralığı içinde olana kadar bunu tekrar tekrar yapın, böylece orijinal alt akış değişkeninin geçerli bir yedeğidir.) Dirichlet hesaplaması için, günlük değerlerinin her birinden maksimum tüm logaritmaların çıkarılması: bu dolaylı olarak tüm ölçeklendirilir Gama değişir, böylece Dirichlet değerlerini etkilemez. Çok küçük olan (örneğin, -100'den küçük) sonuçtaki günlükleri gerçek sıfırın günlüğü olarak kabul edin. Diğer günlükleri üsler. Artık taşma olmadan devam edebilirsiniz.

Bu öncekinden daha uzun sürecek, ama en azından işe yarayacak!

Yaklaşık günlük Gamma değişkenini şekil parametresiyle oluşturmak için önceden hesaplayın . Bu kolaydır, çünkü log Gamma değerlerini doğrudan hesaplamak için algoritmalar vardır . 0 ile 1 arasında tekdüze rastgele bir şamandıra oluşturun, logaritmasını alın, bölün ve ekleyin .αC=log(Γ(α))+log(α)αC

Scale parametresi yalnızca değişkeni yeniden ölçeklendirdiğinden, bu yordamlarda barındırılmasıyla ilgili bir sorun yoktur. Tüm ölçek parametreleri aynı ise buna bile ihtiyacınız yoktur.

Düzenle

Başka bir cevapta OP, tekdüze bir değişkenin ( varyasyonu) gücünün bir varyasyonu ile çarpıldığı bir yöntemi açıklar . Bu iki değişkenin ortak dağılımının pdf'sinin . Pdf bulmak için biz yerine Jakoben ile, bölme ve dışarı entegre . Yekpare şart aralığı için için , nereden1/αB(α)Γ(α+1)(αxα1)(yαeydy/Γ(α+1))z=xyyz/xxxz0y1

pdf(z)=αΓ(α+1)z(xα/x)ex(z/x)α1dxdz=1Γ(α)zα1ezdz,

dağılımının pdf .Γ(α)

Bütün mesele, , çizilen bir değerin taşma olasılığı düşüktür ve günlüğünü ve kez bağımsız bir üniforma günlüğünün toplamını değiştiririz. değişkeninin günlüğüne sahip olur . Günlüğün çok olumsuz olması muhtemeldir, ancak kayan nokta gösteriminde taşacak olan antilogunun yapısını atladık.0<α<1Γ(α+1)1/αΓ(α)


1
Düzenlemenizi biraz daha zarif hale getirmek için bir argüman, burada entegrasyona itiraz etmeniz gerekmez. Sadece artı . Bunlar hem beta hem de gama dağılımlarının standart özellikleridir. Ayrıca, olduğunda, kabaca sahibiz , bu benzetme ( ) genel rasgele değişkeninden daha hızlı olabilir. Γ(α)Γ(α)+Γ(1)Beta(α,1)Γ(α)+Γ(1)Γ(α+1)α0yexpo(1)log(u)Γ(α+1)
olasılık

7

Kendi sorumu cevaplıyorum, ama tam olarak anlamasam bile oldukça iyi bir çözüm buldum. GNU Bilimsel Kitaplığı'ndan kod baktığımızda, işte burada numuneler gama değişkenleri (nasıl rrasgele sayı üreteci olduğunu aolduğunu ve olan ):α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_gammasırasında (yukarıda böylece ardışık bir çağrı olduğu) bir gamma rasgele bir örnek geri fonksiyonu olan gsl_rng_uniform_posbir düzgün dağılmış numarası verir ( 0.0 döndürmez garantilidir olarak kesinlikle pozitif içindir).(0,1)_pos

Bu nedenle, son ifadenin günlüğünü alabilir ve kullanabilirim

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

İstediğimi elde etmek için. Şimdi iki log()çağrım var (ama bir tane daha az pow()), ama sonuç muhtemelen daha iyi. Daha önce, whuber'ın işaret ettiği gibi , potansiyel olarak çok sayıda gücüne yükseltilmiş bir şey vardı . Şimdi, günlük alanında, çarpıyorum . Bu nedenle, taşma olasılığı daha düşüktür.1 / a1/a1/a


Gsl_rng_uniform_pos ve gsl_ran_gamma'nın ne yaptığını açıklayabilir misiniz? İlk 0 ve r arasında tekdüze rastgele bir değer döndürür ve ikincisi bir Gamma (1 + a, b) değeri ile ilgili - sanırım eksik bir Gamma? Genel olarak bu önerdiğim yaklaşıma çok yakın görünüyor (hariç, gözden geçirme dışında, bölmeyi kısmına göre belirtmeyi unuttuğum açıktır !)α
Whuber

Cevabımı şimdi daha fazla ayrıntı içerecek şekilde düzenledim.
luispedro

Teşekkür ederim: ama "r" nedir? (Özyineleme sınırlıdır: en fazla bir özyinelemeli çağrı yapılacaktır, çünkü> 0, 1.0 + a> 1 anlamına gelir.)
whuber

r rastgele sayı üretecidir (rastgele sayıları nereden alırsınız).
luispedro

Ah, bu zekice: bir ve bağımsız bir değişkeninin ürünü değişkenidir. Cevabımı düzenledim, böylece çözümünüzü işaret ediyor ve neden çalıştığını açıklıyor. B ( α , 1 ) Γ ( α )Γ(α+1)B(α,1)Γ(α)
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.