Ziggurat algoritmi - Ziggurat algorithm

The ziggurat algoritmi bu algoritm uchun psevdo-tasodifiy raqamlarni tanlash. Sinfiga mansub rad etish namunasi algoritmlari, odatda a dan teng taqsimlangan tasodifiy sonlarning asosiy manbasiga asoslanadi psevdo-tasodifiy sonlar generatori, shuningdek oldindan hisoblangan jadvallar. Algoritm a dan qiymatlarni hosil qilish uchun ishlatiladi monotonik ravishda kamayadi ehtimollik taqsimoti. U ham qo'llanilishi mumkin nosimmetrik unimodal taqsimotlar kabi normal taqsimot, taqsimotning yarmidan qiymatini tanlab, so'ngra qiymatning qaysi yarmidan olingan deb tasodifiy tanlash orqali. U tomonidan ishlab chiqilgan Jorj Marsagliya va boshqalar 1960 yillarda.

Algoritm tomonidan ishlab chiqarilgan odatiy qiymat faqat bitta tasodifiy suzuvchi nuqta qiymati va bitta tasodifiy jadval indeksini yaratishni talab qiladi, so'ngra bitta jadvalni qidirish, bitta ko'paytirish operatsiyasi va bitta taqqoslash. Ba'zan (odatdagi holatlarda 2,5% vaqt) eksponensial taqsimot odatdagi stol o'lchamlarini ishlatganda)[iqtibos kerak ] ko'proq hisoblash talab etiladi. Shunga qaramay, algoritm hisoblashda odatdagidek taqsimlangan tasodifiy sonlarni yaratishning eng ko'p ishlatiladigan ikkita usulidan ancha tezroq Marsaglia qutbli usuli va Box-Myuller konvertatsiyasi, bu har bir hosil qilingan qiymatlar juftligi uchun kamida bitta logaritma va bitta kvadrat ildiz hisobini talab qiladi. Biroq, ziggurat algoritmi amalga oshirish uchun ancha murakkab bo'lganligi sababli, juda ko'p miqdordagi tasodifiy sonlar kerak bo'lganda yaxshi qo'llaniladi.

Atama ziggurat algoritmi 2000 yilda Marsagliyaning Вай Van Tsang bilan yozgan qog'ozidan olingan sanalar; u shunday nomlangan, chunki u kontseptual ravishda ehtimollikning taqsimlanishini kattalashgan tartibda to'plangan to'rtburchaklar bo'laklar bilan qoplashga asoslangan va natijada a ziggurat.

A bilan namuna qiymatlarini yaratish uchun ishlatiladigan Ziggurat algoritmi normal taqsimot. (Oddiylik uchun faqat ijobiy qiymatlar ko'rsatilgan.) Pushti nuqtalar dastlab bir tekis taqsimlangan tasodifiy sonlardir. Istalgan tarqatish funktsiyasi birinchi navbatda "A" teng maydonlarga bo'linadi. Bir qatlam men chapdagi bir xil manba tomonidan tasodifiy tanlanadi. Keyin yuqori manbadan tasodifiy qiymat tanlangan qatlamning kengligi bilan ko'paytiriladi va natija bo'ladi x 3 ta mumkin bo'lgan natijalar bilan tilimning qaysi mintaqasiga tushishini ko'rish uchun sinovdan o'tkazildi: 1) (chap, qattiq qora mintaqa) egri chiziq ostida aniq va to'g'ridan-to'g'ri chiqishga uzatiladi, 2) (o'ng, vertikal chiziqli mintaqa) namuna qiymati egri ostida yotishi mumkin va uni yana sinovdan o'tkazish kerak. Bunday holda, tasodifiy y tanlangan qatlam ichida qiymat hosil qilinadi va taqqoslanadi f (x). Agar kamroq bo'lsa, nuqta egri va qiymat ostida bo'ladi x chiqdi. Agar yo'q bo'lsa, (uchinchi holat), tanlangan nuqta x rad qilinadi va algoritm boshidanoq qayta boshlanadi.

Amaliyot nazariyasi

Ziggurat algoritmi - rad etish namunasi algoritmi; u tasodifiy kerakli taqsimotdan biroz kattaroq taqsimotda nuqta hosil qiladi, so'ngra hosil bo'lgan nuqta kerakli taqsimot ichida ekanligini tekshiradi. Agar yo'q bo'lsa, u yana urinib ko'radi. Ehtimollik zichligi egri chizig'i ostida tasodifiy nuqta berilgan bo'lsa, uning x koordinata - bu kerakli taqsimotga ega bo'lgan tasodifiy son.

Ziggurat algoritmi tanlagan taqsimotdan iborat n teng hududli hududlar; n - taqsimotning dumini o'z ichiga olgan to'rtburchaklar bo'lmagan poydevor ustiga, kerakli taqsimotning asosiy qismini qoplaydigan 1 to'rtburchaklar.

Monotonning kamayish ehtimoli zichligi funktsiyasi berilgan f(x), hamma uchun belgilangan x ≥ 0, zigguratning asosi taqsimot ichidagi va pastdagi barcha nuqtalar sifatida aniqlanadi y1 = f(x1). Bu (0, 0) dan (gacha) to'rtburchaklar mintaqadan iboratx1y1) va tarqatishning (odatda cheksiz) dumi, qaerda x > x1 (va y < y1).

Ushbu qatlam (uni 0 qavat deb nomlang) maydonga ega A. Buning ustiga to'rtburchaklar kenglikdagi qatlamni qo'shing x1 va balandlik A/x1, shuning uchun u ham maydonga ega A. Ushbu qatlamning yuqori qismi balandlikda y2 = y1 + A/x1va zichlik funktsiyasini bir nuqtada kesadi (x2y2), qaerda y2 = f(x2). Ushbu qatlam orasidagi zichlik funktsiyasining har bir nuqtasini o'z ichiga oladi y1 va y2, lekin (asosiy qatlamdan farqli o'laroq) (x1y2) kerakli taqsimotda bo'lmagan.

Keyinchalik, keyingi qatlamlar ustiga to'planadi. Oldindan hisoblangan jadval jadvalidan foydalanish uchun n (n = 256 odatiy), birini tanlaydi x1 shu kabi xn = 0, ya'ni yuqori quti, qatlam degan ma'noni anglatadi n - 1, taqsimotning eng yuqori nuqtasiga (0, f(0)) aniq.

Qatlam men dan vertikal ravishda uzayadi ymen ga ymen+1, va gorizontal ravishda ikkita mintaqaga bo'lish mumkin: (odatda katta) qism 0 dan xmen+1 to'liq kerakli taqsimotda joylashgan va (kichik) qismi xmen+1 ga xmen, bu faqat qisman mavjud.

Bir lahzaga 0 qatlam muammosiga e'tibor bermaslik va bir xil tasodifiy o'zgaruvchilar berilgan U0 va U1 ∈ [0,1), ziggurat algoritmini quyidagicha ta'riflash mumkin:

  1. 0 ≤ tasodifiy qatlamni tanlang men < n.
  2. Ruxsat bering x = U0xmen.
  3. Agar x < xmen+1, qaytish x.
  4. Ruxsat bering y = ymen + U1(ymen+1ymen).
  5. Hisoblash f(x). Agar y < f(x), qaytish x.
  6. Aks holda, yangi tasodifiy raqamlarni tanlang va 1-bosqichga qayting.

1-qadam past piksellar sonini tanlashga to'g'ri keladi y muvofiqlashtirish. Agar shunday bo'lsa, 3-qadam sinovlari x koordinata y koordinatasi haqida ko'proq ma'lumotga ega bo'lmasdan kerakli zichlik funktsiyasi ichida aniq. Agar u bo'lmasa, 4-qadam yuqori aniqlikdagi koordinatani tanlaydi va 5-qadam rad etish sinovini o'tkazadi.

Yaqindan joylashgan qatlamlar bilan algoritm 3-bosqichda vaqtning juda katta qismini tugatadi. Yuqori qatlam uchun n - 1, ammo, bu sinov har doim ham muvaffaqiyatsiz bo'ladi, chunki xn = 0.

0 qatlamni markaziy mintaqaga va chekkaga ajratish mumkin, ammo chekka cheksiz quyruqdir. Nuqta markaziy mintaqada ekanligini tekshirish uchun xuddi shu algoritmdan foydalanish uchun xayoliy so'zlar hosil qiling x0 = A/y1. Bu bilan ballar hosil bo'ladi x < x1 to'g'ri chastota bilan va kamdan-kam hollarda 0 qatlami tanlangan va xx1, quyruqdan tasodifiy nuqtani tanlash uchun maxsus orqaga qaytish algoritmidan foydalaning. Orqaga qaytish algoritmi mingdan bir martadan kam foydalanilganligi sababli tezlik muhim emas.

Shunday qilib, bir tomonlama tarqatish uchun to'liq ziggurat algoritmi:

  1. 0 ≤ tasodifiy qatlamni tanlang men < n.
  2. Ruxsat bering x = U0xmen
  3. Agar x < xmen+1, qaytish x.
  4. Agar men = 0, orqaga qaytish algoritmi yordamida quyruqdan nuqta hosil qiling.
  5. Ruxsat bering y = ymen + U1(ymen+1ymen).
  6. Hisoblash f(x). Agar y < f(x), qaytish x.
  7. Aks holda, yangi tasodifiy raqamlarni tanlang va 1-bosqichga qayting.

Ikki tomonlama taqsimot uchun, albatta, natijani 50% inkor qilish kerak. Bu ko'pincha tanlov orqali qulay tarzda amalga oshirilishi mumkin U0 ∈ (-1,1) va 3-bosqichda, agar | bo'lsa, sinovx| < xmen+1.

Quyruq uchun orqaga qaytish algoritmlari

Ziggurat algoritmi faqat ishlab chiqaradi eng juda tez chiqadi va har doim orqaga qaytish algoritmini talab qiladi x > x1, bu har doim to'g'ridan-to'g'ri amalga oshirilishdan ko'ra murakkabroq. Yiqilish algoritmi, albatta, tarqatishga bog'liq.

Ko'rsatkichli taqsimot uchun quyruq xuddi taqsimot tanasiga o'xshaydi. Buning bir usuli - eng oddiy algoritmga qaytish E = Ln (U1) va ruxsat bering x = x1 - ln (U1). Boshqasi - ziggurat algoritmini chaqirish rekursiv va qo'shing x1 natijaga.

Oddiy taqsimot uchun Marsaglia ixcham algoritmni taklif qiladi:

  1. Ruxsat bering x = Ln (U1)/x1.
  2. Ruxsat bering y = Ln (U2).
  3. Agar 2y > x2, qaytish x + x1.
  4. Aks holda, 1-bosqichga qayting.

Beri x1 Table Odatda jadval o'lchamlari uchun 3,5, 3-bosqichdagi sinov deyarli har doim muvaffaqiyatli bo'ladi.

Optimallashtirish

Algoritm oldindan hisoblangan jadvallar bilan samarali bajarilishi mumkin xmen va ymen = f(xmen), lekin uni yanada tezroq qilish uchun ba'zi o'zgartirishlar mavjud:

  • Ziggurat algoritmida hech narsa ehtimollarni taqsimlash funktsiyasining normallashishiga bog'liq emas (egri chiziq ostida integral 1 ga teng), olib tashlanadi konstantalarni normalizatsiya qilish hisoblashini tezlashtirishi mumkin f(x).
  • Ko'p sonli tasodifiy sonlar generatorlari [0, 2 oralig'ida butun sonni qaytaradigan butun sonli tasodifiy sonlar generatorlariga asoslangan32 - 1]. 2-jadval−32xmen to'g'ridan-to'g'ri bunday raqamlardan foydalanishga imkon beradi U0.
  • Ikki tomonlama yordamida ikki tomonlama taqsimotlarni hisoblashda U0 ilgari tasvirlanganidek, tasodifiy tamsay [−2 oralig'ida imzolangan raqam sifatida talqin qilinishi mumkin31, 231 - 1] va o'lchov koeffitsienti 2 ga teng−31 foydalanish mumkin.
  • Taqqoslashdan ko'ra U0xmen ga xmen+1 3-qadamda oldindan hisoblash mumkin xmen+1/xmen va taqqoslash U0 to'g'ridan-to'g'ri shu bilan. Agar U0 butun sonli tasodifiy son ishlab chiqaruvchisi, bu chegaralar 2 ga ko'paytirilishi mumkin32 (yoki 231, mos ravishda) shuning uchun butun sonli taqqoslash ishlatilishi mumkin.
  • Yuqoridagi ikkita o'zgarish bilan jadval o'zgartirilmagan xmen qiymatlar endi kerak emas va o'chirilishi mumkin.
  • Ishlab chiqarishda IEEE 754 faqat 24 bitli mantissaga ega bo'lgan bitta aniqlikdagi suzuvchi nuqta qiymatlari (1 ta yopiq etakchini o'z ichiga olgan holda), 32 bitli butun sonli tasodifiy sonning eng kam ahamiyatsiz qismlari ishlatilmaydi. Ushbu bitlar qatlam raqamini tanlash uchun ishlatilishi mumkin. (Buni batafsil muhokama qilish uchun quyidagi havolalarga qarang.)
  • Dastlabki uchta qadamni qo'yish mumkin ichki funktsiya, bu kamroq tez-tez talab qilinadigan qadamlarning tashqaridan amalga oshirilishini chaqirishi mumkin.

Jadvallarni yaratish

Jadvalni oldindan hisoblangan holda saqlash yoki faqat qiymatlarni kiritish mumkin n, y1, Ava amalga oshirish f −1(y) tasodifiy sonlar generatorini ishga tushirishda qolgan qiymatlarni hisoblang.

Avval aytib o'tilganidek, topishingiz mumkin xmen = f −1(ymen) va ymen+1ymen + A/xmen. Takrorlang n - ziggurat qatlamlari uchun 1 marta. Oxir-oqibat, sizda bo'lishi kerak yn = f(0). Albatta, bir oz bo'ladi yumaloq xato, lekin bu foydali aql-idrok testi uning maqbul darajada kichikligini ko'rish.

Haqiqatan ham jadval qiymatlarini to'ldirganda, shunchaki shunday deb taxmin qiling xn = 0 va yn = f(0) va qatlamdagi ozgina farqni qabul qiling n - 1 maydonini yaxlitlash xatosi sifatida.

Topish x1 va A

Boshlang'ich berilgan (taxmin qilish) x1, sizga maydonni hisoblash usuli kerak t buning uchun quyruq x > x1. Eksponent tarqatish uchun bu shunchaki ex1, normal taqsimot uchun, agar siz normalizatsiya qilinmagan foydalanayotgan bo'lsangiz f(x) = ex2/2, bu π/2erfc (x/2). Ko'proq noqulay tarqatish uchun, raqamli integratsiya talab qilinishi mumkin.

Bu qo'lda, dan x1, topishingiz mumkin y1 = f(x1), maydon t quyruqda va taglik qatlamining maydoni A = x1y1 + t.

Keyin seriyani hisoblang ymen va xmen yuqoridagi kabi. Agar ymen > f(0) har qanday kishi uchun men < n, keyin dastlabki taxmin x1 juda past maydon bo'lib, juda katta maydonga olib keldi A. Agar yn < f(0), keyin dastlabki taxmin x1 juda baland edi.

Buni hisobga olgan holda, a dan foydalaning ildiz topish algoritmi (masalan ikkiga bo'linish usuli ) qiymatini topish uchun x1 ishlab chiqaradi yn−1 kabi yaqin fIloji boricha (0). Shu bilan bir qatorda, eng yuqori qatlamning maydonini tashkil etadigan qiymatni qidiring, xn−1(f(0) − yn−1), kerakli qiymatga yaqin A iloji boricha. Bu bitta baholashni tejaydi f −1(x) va aslida eng katta qiziqish shartidir.

Adabiyotlar

  • Jorj Marsagliya; Вай Van Tsang (2000). "Tasodifiy o'zgaruvchilar yaratish uchun Ziggurat usuli". Statistik dasturiy ta'minot jurnali. 5 (8). Olingan 2007-06-20. Ushbu qog'oz qatlamlarni yuqori qismidan boshlab 1 dan boshlab, pastki qismidagi 0 qatlamini maxsus holatga aylantiradi, yuqoridagi izoh esa pastki qismdan 0 qatlamlarini raqamlaydi.
  • Oddiy zichlik funktsiyasi va eksponensial zichlik funktsiyasi uchun ziggurat usulini amalga oshirish, bu asosan qog'ozdagi kodning nusxasi. (Potentsial foydalanuvchilar ushbu C kodi 32 bitli tamsayılarni qabul qilishini bilishlari kerak.)
  • C # dasturi Ziggurat algoritmi va uslubiga umumiy nuqtai.
  • Yurgen A. Doornik (2005). "Oddiy tasodifiy namunalarni yaratish uchun takomillashtirilgan Ziggurat usuli" (PDF). Nuffield kolleji, Oksford. Olingan 2007-06-20. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering) Qatlam raqamini tanlash uchun butun sonli tasodifiy sonlar generatorining eng kichik bitlaridan foydalanish xavfini tavsiflaydi.
  • Oddiy xatti-harakatlar Kliv Moler tomonidan MathWorks, kiritilgan ziggurat algoritmini tavsiflaydi MATLAB 5-versiya, 2001 yil.
  • Ziggurat tasodifiy oddiy generatori MathWorks bloglari, Kliv Moler tomonidan joylashtirilgan, 2015 yil 18-may.
  • Devid B. Tomas; Filipp X. Leong; Ueyn Luk; Jon D. Villasenor (2007 yil oktyabr). "Gauss tasodifiy raqamlar generatorlari" (PDF). ACM hisoblash tadqiqotlari. 39 (4): 11:1–38. doi:10.1145/1287620.1287622. ISSN  0360-0300. S2CID  10948255. Olingan 2009-07-27. [W] juda yuqori statistik sifatni saqlash birinchi darajali vazifadir va ushbu cheklovga ko'ra tezlikni ham talab etiladi, ko'pincha Ziggurat usuli eng to'g'ri tanlov bo'ladi. Yaratish uchun bir nechta algoritmlarni taqqoslash Gauss tasodifiy raqamlar.
  • Nadler, Boaz (2006). "Ziggurat va Monty Python usullarini tatbiq etishdagi dizayndagi kamchiliklar (Va Matlab randnga oid ba'zi izohlar)". arXiv:matematik / 0603058.. Yagona psevdo-tasodifiy sonli generatorlar bilan bog'liq muammolarni va bu muammolar ziggurat algoritmining chiqishiga qanday ta'sir qilishini tasvirlaydi.
  • Edris, Xasan M.; Cheung, Brayan; Sandora, Makkullen; Nummey, Devid; Stefan, Deyan (2009 yil 13-16 iyul). Yuqori tezlikdagi Gauss tasodifiy sonli generatorlari uchun apparat-optimallashtirilgan Ziggurat algoritmi (PDF). Qayta sozlanadigan tizimlar va algoritmlar muhandisligi bo'yicha 2009 yilgi xalqaro konferentsiya. Las-Vegas.
  • Marsagliya, Jorj (1963 yil sentyabr). Oddiy taqsimotning dumidan o'zgaruvchini yaratish (Texnik hisobot). Boeing ilmiy tadqiqot laboratoriyalari. Matematik izoh № 322, DTIC qo'shilish raqami AD0423993 - orqali Mudofaa texnik ma'lumot markazi.