Normal dağılımı simüle etmek için Box-Muller'ın ters CDF yöntemine göre avantajları?


15

Bir dizi muntazam değişkenten normal bir dağılımı simüle etmek için birkaç teknik vardır:

  1. Biri iki bağımsız üniforma örneği (0,1) değişen ve bunları iki bağımsız standart normal dağılıma dönüştüren Box-Muller algoritması :

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. CDF yöntemi , burada normal cdf'yi (F(Z)) bir Tekdüzen değişkenine eşitleyebilir :

    F(Z)=U
    ve Z = F - 1 ( U ) türetme
    Z=F1(U)

Sorum şu: hangisi hesaplama açısından daha verimli? İkinci yöntem olduğunu düşünürdüm - ama okuduğum makalelerin çoğu Box-Muller kullanıyor - neden?

Ek bilgi:

Normal CDF'nin tersi bilinir ve verilir:

F1(Z)=2erf1(2Z1),Z(0,1).

Bu nedenle:

Z=F1(U)=2erf1(2U1),U(0,1).

1
Normal CDF'nin tersi nedir? Analitik olarak hesaplanamaz, sadece orijinal CDF parçalı doğrusal işlevle yaklaşık olarak ayarlanmışsa.
Artem Sobolev

İkisi birbiriyle yakından ilişkili değil mi? Box Muller, 2 değişkenlik nesil için özel bir durum olduğuna inanıyorum.
ttnphns

Merhaba Barmaley, yukarıda biraz daha bilgi ekledim. Ters CDF'nin bir ifadesi vardır - ancak hesaplamalı olarak hesaplanmalıdır - bu yüzden kutu Muller'ın tercih edilmesinin nedeni bu olabilir mi? Ben erf 1 , günah ve kosinüs değerleri gibi, arama tablolarında hesaplanacağını varsaydım ? Dolayısıyla çok daha pahalı bir hesaplama değil mi? Ancak yanılmış olabilirim. erf1erf1sincosine
user2350366

2
Günahsız ve kosinüs içermeyen Box-Muller versiyonları vardır.
Xi'an

2
@Dilip Bilgisayar grafikleri, sinüs ve kosinüs gibi çok düşük hassasiyetli uygulamalar için gerçekten uygun arama tabloları kullanılarak optimize edilebilir. Ancak istatistiksel uygulamalar için böyle bir optimizasyon asla kullanılmaz. Sonuçta bu hesaplama için herhangi zor gerçekten değil den günlüğüne veya sqrt ama modern bilgisayar sistemleri üzerinde temel işlevleri ile ilgili exp trigonometrik fonksiyonlar --including - optimize edilmesi eğilimi ( cos ve günlük Intel temel talimatlar yolu geri vardı 8087 yongası!), Ancak erf kullanılamaz veya daha yüksek (= daha yavaş) bir seviyede kodlanmıştır. erf1logsqrtexpcoslog
whuber

Yanıtlar:


16

Tamamen olasılıklı bir bakış açısından, her iki yaklaşım da doğru ve dolayısıyla eşdeğerdir. Algoritmik bir bakış açısından, karşılaştırma hem hassasiyeti hem de hesaplama maliyetini dikkate almalıdır.

Box-Muller tek tip bir jeneratöre dayanır ve bu tek tip jeneratörle yaklaşık aynı maliyete sahiptir. Yorumumda belirtildiği gibi, logaritma olmadan olmasa da, sinüs veya kosinüs çağrıları olmadan uzaklaşabilirsiniz:

  • S = U 2 1 + U 2 21 olana kadar üretir
    U1,U2iidU(1,1)
    S=U12+U221
  • almak veX1=ZU1'itanımlayınZ=2log(S)/S
    X1=ZU1, X2=ZU2

Genel tersine çevirme algoritması, örneğin ters normal cdf'ye çağrı yapılmasını gerektirir. qnorm(runif(N)) R'de, yukarıdakilerden daha pahalıya mal olabilen ve daha önemlisi, kantil fonksiyon iyi kodlanmadığı sürece, kuyruk bakımından hassasiyet açısından başarısız olabilen .

Whuber tarafından yapılan yorumları takip etmek için , her ikisi de yürütme zamanında ters cdf'nin karşılaştırması rnorm(N)ve qnorm(runif(N))avantajı vardır:

> system.time(qnorm(runif(10^8)))
sutilisateur     système      écoulé
 10.137           0.120      10.251 
> system.time(rnorm(10^8))
utilisateur     système      écoulé
 13.417           0.060      13.472` `

ve kuyruğa uyum açısından: resim açıklamasını buraya girin

Blogumda Radford Neal'un bir yorumunu takiben rnorm, R'deki varsayılanın inversiyon yöntemini kullandığını, dolayısıyla yukarıdaki karşılaştırmanın simülasyon yönteminin kendisini değil, arayüzü yansıttığını belirtmek istiyorum! RNG ile ilgili R belgelerini alıntılamak için:

‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
 Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
 ‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
 (For inversion, see the reference in ‘qnorm’.)  The
 Kinderman-Ramage generator used in versions prior to 1.7.1 (now
 called ‘"Buggy"’) had several approximation errors and should only
 be used for reproduction of old results.  The ‘"Box-Muller"’
 generator is stateful as pairs of normals are generated and
 returned sequentially.  The state is reset whenever it is selected
 (even if it is the current normal generator) and when ‘kind’ is
 changed.

3
(1) ve logΦ1Φ1X1X2Ui1101

2
R 3.0.2rowSumsSqnorm(runif(N))InverseCDF[NormalDistribution[], #] &

1
Kabul ediyorum, qnorm(runif(N))% 20 daha hızlırnorm(N)
Xi'an

3
Φ1sincos

1
Karşılaştırma için, kullanan bir i7-3740QM @ 2.7GHz ve R 3.12, aşağıdaki aramalar için: RNGkind(kind = NULL, normal.kind = 'Inversion');At <- microbenchmark(A <- rnorm(1e5, 0, 1), times = 100L);RNGkind(kind = NULL, normal.kind = 'Box-Muller');Bt <- microbenchmark(B <- rnorm(1e5, 0, 1), times = 100L)Elde mean 11.38363 median 11.18718evirtiminin ve mean 13.00401 median 12.48802Box-Muller
Avraham
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.