एक्स (एक्स) ~ गामा अगर एक्स का जल्दी से नमूना कैसे लें?


12

मेरे पास एक साधारण नमूना समस्या है, जहां मेरा आंतरिक लूप दिखता है:

v = sample_gamma(k, a)

जहां sample_gammaगामा वितरण से नमूने एक डिरिचलेट नमूना बनाने के लिए।

यह अच्छी तरह से काम करता है, लेकिन k / a के कुछ मूल्यों के लिए, बहाव के कुछ संगणना को कम करता है।

मैंने इसे लॉग स्पेस चर का उपयोग करने के लिए अनुकूलित किया:

v = log(sample_gamma(k, a))

कार्यक्रम के बाकी हिस्सों को अपनाने के बाद, यह सही तरीके से काम करता है (कम से कम यह मुझे परीक्षण के मामलों पर समान सटीक परिणाम देता है)। हालांकि, यह पहले की तुलना में धीमा है।

वहाँ सीधे नमूना को धीमा कार्य जैसे का उपयोग करने का कोई तरीका है ? मैंने इसके लिए googling की कोशिश की, लेकिन मुझे यह भी नहीं पता कि इस वितरण का एक सामान्य नाम (लॉग-गामा?) है या नहीं।X,exp(X)Gammalog()


आपको बस प्रत्येक गामा संस्करण को उनकी राशि से विभाजित करना है। कैसे, तब, अंडरफ्लो होता है? और लॉगरिदम लेने से इस समस्या का समाधान कैसे हो जाता है (आप किसी भी तरह फिर से एक्सपेक्ट किए बिना योग की गणना नहीं कर सकते हैं)?
whuber

@whuber लॉग स्पेस में, आप योग की गणना करते हैं और फिर इसे प्रत्येक तत्व से घटाते हैं । तो, यह अंडरफ्लो के पहले बिंदु से बचा जाता है। आगे की प्रक्रिया थोड़ी होती है जब ये dirichlets मिश्रण घटकों के रूप में काम करते हैं और फिर से छोटी संख्याओं से गुणा हो जाते हैं।
19 अगस्त को luispedro

लॉग जोड़ना गणितीय रूप से गलत है: यह उन्हें जोड़ने के बजाय गामा को गुणा करने से मेल खाता है । हां, आपको काम करने के परिणाम मिल सकते हैं, लेकिन वे निश्चित रूप से एक डिरिचलेट वितरण नहीं करेंगे! फिर, मूल अंतर्प्रवाह की प्रकृति वास्तव में क्या है और ऐसा होने पर आप क्या गणना कर रहे हैं? आप किन वास्तविक मूल्यों के साथ काम कर रहे हैं?
whuber

@ जब मैंने अपने विवरण में थोड़ा बहुत सरलीकरण किया होगा। मैं forall i {t = gamma (a, b); योग + = टी; d [i] = लॉग (टी)}; logum = log (राशि); forall i {d [i] - = logum; }। इससे पहले, अगर यह बहुत छोटा था, तो यह कम हो गया।
luispedro

मिल गया: 0 के पास लिए आप मुसीबत में होने जा रहे हैं कोई फर्क नहीं पड़ता कि क्या। दिलचस्प समस्या! α
whuber

जवाबों:


9

एक छोटे आकार पैरामीटर पर विचार करें 0 के पास, इस तरह के रूप α = 1 / 100 । 0 और बीच की श्रेणी में α , - α लगभग है 1 , तो गामा पीडीएफ लगभग है x α - 1 डी एक्स / Γ ( α ) । यह एक अनुमानित CDF, F α ( x ) = x α से एकीकृत किया जा सकता हैαα=1/100αeα1xα1dx/Γ(α) । इसे पलटते हुए, हम एक1/αशक्तिदेखते हैं: एक विशाल घातांक। के लिएα=1/100इस अधःप्रवाह के कुछ मौका (एक डबल परिशुद्धता मूल्य से कम का कारण बनता है10-300, कम या ज्यादा)। यहाँαके बेस-दस लघुगणक के कार्य के रूप में अंडरफ्लो होने की संभावना का एक प्लॉट है:Fα(x)=xααΓ(α)1/αα=1/10010300α

यहाँ छवि विवरण दर्ज करें

लॉग (गामा) चर उत्पन्न करने के लिए इस सन्निकटन का उपयोग करने के लिए एक समाधान है: वास्तव में, एक गामा संस्करण उत्पन्न करने का प्रयास करें और यदि यह बहुत छोटा है, तो इस अनुमानित बिजली वितरण से अपना लघुगणक उत्पन्न करें (जैसा कि नीचे दिखाया गया है)। (इसे तब तक बार-बार करें जब तक कि लॉग अंडरफ्लो रेंज के भीतर न हो, ताकि यह मूल अंडरफ्लोिंग वैरिएबल के लिए एक वैध विकल्प हो।) डिर्चिलेट गणना के लिए, लॉग के प्रत्येक मान से सभी लॉगरिथम की अधिकतम घटाएं - यह सभी को स्पष्ट रूप से बचाता है। गामा परिवर्तन करता है इसलिए यह डिरिचलेट मूल्यों को प्रभावित नहीं करेगा। किसी भी परिणामी लॉग को समझो जो कि बहुत छोटा है (कहते हैं, -100 से कम) एक सच्चे शून्य के लॉग होने के रूप में। अन्य लॉग का घातांक करें। अब आप अंडरफ्लो के बिना आगे बढ़ सकते हैं।

यह पहले की तुलना में अधिक समय लेने वाला है, लेकिन कम से कम यह काम करेगा!

आकृति पैरामीटर साथ एक अनुमानित लॉग गामा संस्करण उत्पन्न करने के लिए , C = log ( Γ ( α ) ) + लॉग ( α ) पूर्ववर्ती करें । यह आसान है, क्योंकि लॉग गामा के मूल्यों को सीधे गणना करने के लिए एल्गोरिदम हैं । 0 और 1 के बीच एक समान यादृच्छिक फ्लोट उत्पन्न करें, इसका लघुगणक लें, α द्वारा विभाजित करें , और इसमें C जोड़ें ।αC=log(Γ(α))+log(α)αC

क्योंकि स्केल पैरामीटर केवल वैरिएबल को बचाता है, इन प्रक्रियाओं में इसे समायोजित करने में कोई समस्या नहीं है। यदि सभी स्केल पैरामीटर समान हों तो भी आपको इसकी आवश्यकता नहीं है।

संपादित करें

एक अन्य उत्तर में ओपी एक विधि का वर्णन करता है जिसमें की एक समान चर (एक बी ( α ) चर) की शक्ति को एक Γ ( α + 1 ) चर से गुणा किया जाता है । यह काम करता है क्योंकि इन दो वेरिएंट के संयुक्त वितरण का पीडीएफ ( α x α - 1 ) ( y α e - y d y / Γ ( α + 1 ) ) हैZ = x y का pdf खोजने के लिए1/αB(α)Γ(α+1)(αxα1)(yαeydy/Γ(α+1))z=xyहम स्थानापन्न करते हैं, याकूब x द्वारा विभाजित करते हैं , और x को एकीकृत करते हैं । अभिन्न को z से तक होना चाहिए क्योंकि 0 y wh 1 , whenceyz/xxxz0y1

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

जो एक वितरण की पीडीएफ है ।Γ(α)

पूरे मुद्दे यह है कि जब , से तैयार एक मूल्य के Γ ( α + 1 ) underflow की संभावना नहीं है और है अपने लॉग और संक्षेप द्वारा 1 / α एक की लॉग बार एक स्वतंत्र वर्दी variate का लॉग हम होगा Γ ( α ) variate। लॉग बहुत नकारात्मक होने की संभावना है, लेकिन हमने इसके एंटीलॉग के निर्माण को दरकिनार कर दिया है, जो कि अस्थायी फ्लोटिंग प्रतिनिधित्व में बह जाएगा।0<α<1Γ(α+1)1/αΓ(α)


1
अपने एडिट को थोड़ा और सुरुचिपूर्ण बनाने के लिए, आपको यहाँ एकीकरण के लिए अपील करने की ज़रूरत नहीं है। बस इस तथ्य का उपयोग करें कि , प्लस किΓ(α)+Γ(1)~Γ(α+1)। ये दोनों बीटा और गामा वितरण के मानक गुण हैं। इसके अलावा, जबअल्फा0हम मोटे तौर परy~एक्सपी(1)Γ(α)Γ(α)+Γ(1)Beta(α,1)Γ(α)+Γ(1)Γ(α+1)α0yexpo(1), तेज हो सकता है अनुकरण करने के लिए ( ) एक सामान्य की तुलना में Γ ( α + 1 ) यादृच्छिक चर। log(u)Γ(α+1)
probabilityislogic

7

मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं, लेकिन मुझे बहुत अच्छा समाधान मिला, भले ही मुझे यह पूरी तरह से समझ में न आए। जीएनयू वैज्ञानिक लाइब्रेरी से कोड को देखते हुए, यहाँ है कि यह कैसे नमूने गामा चर ( rहै यादृच्छिक संख्या जनरेटर, aहै और है β ):α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/a1/a


α

मैंने अब अधिक विवरण शामिल करने के लिए अपने उत्तर को संपादित किया।
लिवपोपेड्रो

धन्यवाद: लेकिन "r" क्या है? (ध्यान दें कि प्रत्यावर्तन घिरा है: सबसे एक पुनरावर्ती कॉल पर किया जाएगा, क्योंकि एक> 0 तात्पर्य 1.0 + एक> 1.)
whuber

r यादृच्छिक संख्या जनरेटर है (जहां आप यादृच्छिक संख्या प्राप्त कर रहे हैं)।
luispedro

Γ(α+1)B(α,1)Γ(α)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.