Ziggurat algoritmus

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. március 21-én felülvizsgált verziótól ; az ellenőrzések 4 szerkesztést igényelnek .

A Ziggurat algoritmus ( angol.  Ziggurat Algorithm , Ziggurat Method ) egy álvéletlen számok mintavételére szolgáló algoritmus . Mivel az eltéréssel rendelkező mintavételi algoritmusok osztályának képviselője, munkájában az egyenletes eloszlású véletlenszámok forrására támaszkodik - általában egy pszeudo-véletlenszám-generátorra vagy egy előre kiszámított táblázatra. Az algoritmus monoton csökkenő valószínűségi eloszláson alapuló értékek generálására szolgál . Alkalmazható egy szimmetrikus unimodális eloszlásra is, például a normál eloszlásra, ha az egyik feléből választunk értékeket, majd ha szükséges, az aritmetikai negációs művelettel szimmetrikus értékre váltunk. Az 1960-as években kidolgozott algoritmus egyik szerzője George Marsaglia .

A legegyszerűbb esetben az algoritmus által visszaadott érték kiszámításához csak egy lebegőpontos és egy véletlenszerű táblázatindex generálása szükséges, amelyet egy táblázatkeresés, egy szorzás és egy összehasonlítás követ. Néha (jóval kisebb számú esetben) bonyolultabb számításokra van szükség. Ez az algoritmus azonban számítási szempontból sokkal gyorsabb, mint a normál eloszlású véletlenszámok generálására leggyakrabban használt két módszer: a Marsaglia poláris módszer és a Box-Muller transzformáció , amelyekhez legalább egy logaritmus és egy négyzet kiszámítása szükséges. gyökér minden egyes generált értékpárhoz. Mivel azonban a Ziggurat algoritmus megvalósítása bonyolultabb, leggyakrabban olyan esetekben használják, amikor nagyszámú véletlenszámra van szükség.

Maga a "Ziggurat algoritmus" kifejezés Marsaglia és Wai Van Tsang 2000-es közös munkájában jelenik meg, és azért kapta ezt a nevet, mert elméletileg egy valószínűségi eloszláson alapul, ahol a téglalap alakú szegmensek egymásra vannak halmozva a méret csökkenésének sorrendjében (amikor alulról felfelé nézve), ami egy zikgurátra emlékeztető alakot eredményez .

Elméleti alap

A ziggurat algoritmus egy torzítási mintavételi algoritmus. Véletlenszerűen generál egy pontot, amely kissé eltér a kívánt eloszlástól, majd ellenőrzi, hogy a generált pont pontosan beleesik-e. Ha nem, az algoritmus újra próbálkozik. Ha a pont a valószínűségi sűrűségfüggvény görbéje alatt van, akkor annak x -koordinátája lesz a kívánt véletlenszám a kívánt eloszlással.

Az eloszlás, amelyből az algoritmus mintákat vesz , egyenlő területű régiókból áll; a téglalap lefedi a kívánt eloszlás fő részét, és "piramis" egy nem téglalap alakú alapon, amely magában foglalja az eloszlás maradékát vagy "végét".

Egy adott monotonan csökkenő valószínűségi sűrűségfüggvény esetén , amely mindegyikre van definiálva, a zikgurát alapja az eloszláson belüli és néhány alatti összes pont . Ez áll egy téglalap alakú részből -tól -ig , és egy (általában végtelen) eloszlás maradékából (farokból), ahol (és ).

Ennek a szintnek (nevezzük 0-s szintnek) a területe a . Adjunk hozzá egy új téglalap alakú szélességi és magassági szintet a tetejéhez , így a területe is egyenlő lesz . Ennek a szintnek a teteje a magasságban van , és abban a pontban metszi a sűrűségfüggvényt, ahol . Ez a szint tartalmazza az és közötti összes sűrűségfüggvény-pontot , de (az alapszinttől eltérően) más pontokat is tartalmaz, például , amelyek nem tartoznak a kívánt eloszláshoz.

Az összes következő szint ugyanúgy van egymásra rakva. Előre kiszámított ( nagyon gyakran használt) mérettáblázat használatához olyat kell választani , hogy , így a felső négyszögletes szint a számmal pontosan a pontban érje el az eloszlás csúcsát .

Egy szám magasságú szint től ig terjedő helyet foglal el , és szélességében két részre osztható: egy től ig (általában nagyobb), amely teljes egészében egy adott eloszláson belül van, és egy től ig (kisebbre), amelyet csak részben tartalmaz.

Egy pillanatra megfeledkezve a 0 szintű speciális eset kérdéséről, egyenletes eloszlású számokkal és az algoritmus a következőképpen írható le:

  1. Válasszon egy véletlenszerű szintet .
  2. Tedd .
  3. Ha vissza .
  4. Tedd .
  5. Számolja ki . Ha vissza .
  6. Ellenkező esetben válasszon új véletlen számokat, és térjen vissza az 1. lépéshez.

Az 1. lépés a szint véletlenszerű mintavétele. A 3. lépés azt ellenőrzi, hogy a koordináta jól esik-e az adott sűrűségfüggvényen belül, még akkor is, ha nincs információ a koordinátáról . Ha nem, a 4. lépés kiszámítja a koordinátát , az 5. lépés pedig ellenőrzi, hogy a kívánt területen belül van-e.

Ha elég nagy a szintek száma, és kicsi a magasságuk, akkor ugyanaz a "kockázati zóna", amelyet a 3. lépés után ellenőrizünk, nagyon kicsi, és az algoritmus az idő jelentős részében a 3. lépésnél megáll. Vegye figyelembe, hogy a felső szint azonban mindig megbukik ebben a tesztben, mert .

A 0. szint felosztható központi és határterületre is, de a határterület a függvény végtelen maradékát tartalmazza. Ha ugyanazt az algoritmust szeretnénk használni annak ellenőrzésére, hogy egy pont a központi területhez tartozik-e, érdemes egy dummyt generálni . A koordinátákkal rendelkező pontok kezelése egyszerűen történik, és abban a ritka esetben, amikor a 0 és a szintet választották , egy speciális tartalék algoritmussal kell véletlenszerűen kiválasztani egy pontot a függvény "farkából". Mivel egy ilyen tartalék algoritmust rendkívül ritkán fognak használni (a ritkaság relatív és a rétegződéstől függ), sebessége nem lesz jelentős hatással az általános teljesítményre.

Így a nem szimmetrikus eloszlás teljes Ziggurat algoritmusa a következő:

  1. Válasszon egy véletlenszerű szintet .
  2. Tedd .
  3. Ha vissza .
  4. Ha , állítson elő egy pontot a "farokból" a tartalék algoritmus segítségével.
  5. Tedd .
  6. Számolja ki . Ha vissza .
  7. Ellenkező esetben válasszon új véletlen számokat, és térjen vissza az 1. lépéshez.

Szimmetrikus eloszlás esetén az eredmény természetesen az esetek 50%-ában egyszerűen megfordítható. Gyakran kényelmes lehet a 3. lépésben generálni és tesztelni .

Tartalékalgoritmusok egy függvény végéhez

Mivel a Ziggurat algoritmus csak nagyon gyorsan generálja az értékek nagy részét , és esetenként tartalék algoritmust igényel , a dolgok bonyolultabbak, mint a közvetlen 6 lépéses megvalósítás. A tartalék algoritmus az adott eloszlástól függ.

Exponenciális eloszlás esetén a farok eloszlási test formájában van. Az egyik módja az, hogy visszatérünk a legelemibb algoritmushoz , és feltesszük . Egy másik módszer a Ziggurat algoritmus rekurzív meghívása, és hozzáadásával az eredményhez.

Normál eloszlás esetén a Marsaglia egy kompakt algoritmust javasol:

  1. Tedd .
  2. Tedd .
  3. Ha vissza .
  4. Ellenkező esetben térjen vissza az 1. lépéshez.

Mivel a táblázatok többé-kevésbé jellemző méretűek, a 3. lépésben végzett teszt szinte mindig sikeres.

Optimalizálások

Az algoritmus hatékonyan elvégezhető előre kiszámított és előre kiszámított táblák használatával , de van néhány módosítás, amely még jobban felgyorsítja:

Táblázat generálás

Lehetőség van arra, hogy a táblázat előre kiszámított és teljes legyen, vagy csak az értékeket , , , és a megvalósítást belefoglalja a forráskódba , és kiszámítja a fennmaradó értékeket a véletlenszám-generátor inicializálása során (attól függően, hogy mi az drágább számunkra: számítási idő vagy memória).

Megtalálhatja és . Ismételje meg a zikgurat minden szintjén. A végén sikerülnie kell .

A táblázat végső kitöltésekor a és -t kell beírni, elfogadva a kis inkonzisztenciákat (ha valóban kicsinek tűntek) kerekítési hibaként .

Keresés és

Ha van kezdeti érték (kiszámítva, ha nem pontosan, akkor hozzávetőlegesen), akkor csak a függvény farok részének területét kell kiszámítani, amelyre . Számíthat numerikus integrációs módszerekkel .

Továbbá a farokszakasz területéből kiolvasható az alapszint területe: .

Ezután a sorozat és a fentiek szerint kerül kiszámításra. Ha valamelyik esetén, akkor a kezdeti érték túl kicsi volt, ami nagy területet eredményezett . Ha , akkor a kezdeti érték túl nagy volt.

A fentiek alapján az egyenletek numerikus megoldásával (például a felezési módszerrel ) kereshet olyan értéket , amelynél az érték a lehető legközelebb van . Alternatív megoldásként megfontolhatja és megtalálhatja a legfelső szintű terület értékeit, a lehető legközelebb a kívánt értékhez .

Jegyzetek

  1. Jurgen A. Doornik. "An Improved Ziggurat Method Generate Normal Random Samples" (angol) // Nuffield College, Oxford. - 2005. Archiválva : 2016. március 7.

Irodalom

Linkek