এক্স কীভাবে এক্স এক্স নমুনা পাবেন (এক্স) am গামা?


12

আমার স্যাম্পলিংয়ের একটি সহজ সমস্যা রয়েছে, যেখানে আমার অভ্যন্তরীণ লুপটি দেখতে দেখতে:

v = sample_gamma(k, a)

যেখানে sample_gammaগামা বিতরণ থেকে নমুনাগুলি একটি ডিরিচলেট নমুনা গঠন করে।

এটি ভালভাবে কাজ করে, তবে কে / এ এর ​​কয়েকটি মানগুলির জন্য, কিছু প্রবাহিত গণনা আন্ডারফ্লো হয়।

আমি এটিকে লগ স্পেস ভেরিয়েবলগুলি ব্যবহার করার জন্য গ্রহণ করেছি:

v = log(sample_gamma(k, a))

প্রোগ্রামটির বাকি সমস্তটি মানিয়ে নেওয়ার পরে, এটি সঠিকভাবে কাজ করে (কমপক্ষে এটি আমাকে পরীক্ষার ক্ষেত্রে একই একই ফলাফল দেয়)। তবে এটি আগের তুলনায় ধীর।

মতো ধীর ফাংশন ব্যবহার না করে সরাসরি sample নমুনার উপায় আছে কি ? আমি এটির জন্য গুগল করার চেষ্টা করেছি, তবে এই বিতরণটির একটি সাধারণ নাম আছে কিনা তা আমি জানি না (লগ-গামা?)।লগ ( )X,exp(X)Gammalog()


আপনাকে যা করতে হবে তা হ'ল প্রতিটি গামা বিভিন্নকে তাদের যোগফল দিয়ে ভাগ করতে হবে। কিভাবে, তাহলে, আন্ডারফ্লো কিভাবে ঘটে? এবং লগারিদম গ্রহণ করা কীভাবে এই সমস্যার সমাধান করে (আপনি আর কোনওভাবেই ঘটা করে না দিয়ে যোগফলটি গণনা করতে পারবেন না)?
শুক্র

@ ভুবার লগ স্পেসে আপনি যোগফলটি গণনা করুন এবং তারপরে প্রতিটি উপাদান থেকে এটি বিয়োগ করুন । সুতরাং, এটি আন্ডারফ্লো প্রথম পয়েন্ট এড়ানো। এই dirichlet মিশ্রণ উপাদান হিসাবে পরিবেশন করা হয় এবং আবার অল্প সংখ্যায় আবার গুণিত হয় যখন আরও কিছু প্রক্রিয়াজাতকরণ আছে।
লুইস্প্রেডো

লগ যোগ করার পদ্ধতি গাণিতিকভাবে ভুল: এটা অনুরূপ গুন gammas বদলে তাদের যোগ। হ্যাঁ, আপনি কার্যকর ফলাফল পেতে পারেন, তবে তাদের অবশ্যই একটি ডিরিচলেট বিতরণ হবে না! আবার, মূল ভূগর্ভের প্রকৃতিটি ঠিক কী এবং যখন ঘটে তখন আপনি কী গণনা করেন? আপনি যে প্রকৃত মান নিয়ে কাজ করছেন তা কী?
whuber

@ হুবুহু আমার বিবরণে আমি কিছুটা আরও সরল করে তুলতে পারি। আমি ফোরাল করি I {t = গামা (ক, খ); যোগ + = টি; d [i] = লগ (টি)}; লগসাম = লগ (যোগফল); forall i {d [i] - = লগসাম; }। পূর্বে, যদি এটি খুব ছোট ছিল তবে এটি নিমজ্জিত হয়েছিল।
লুইস্প্রেডো

এটি পেয়েছেন: 0 এর জন্য 0 আপনি যে কোনও কারণেই সমস্যায় চলেছেন। আকর্ষণীয় সমস্যা! α
whuber

উত্তর:


9

একটি ছোট আকৃতির মাপদণ্ড বিবেচনা করুন 0 কাছাকাছি যেমন α = 1 / 100 । 0 এবং মধ্যবর্তী সীমার মধ্যে α , - α আনুমানিক 1 , তাই গামা পিডিএফ আনুমানিক এক্স α - 1এক্স / Γ ( α ) । এটি আনুমানিক সিডিএফ, এফ α ( এক্স ) = x α এর সাথে সংহত করা যায় ααα=1/100αeα1xα1dx/Γ(α) । এটিকে উল্টিয়ে দিয়ে আমরা একটি1/αশক্তিদেখতে পাই: বিশাল ব্যয়কারী। জন্যα=1/100এই underflow কিছু সুযোগ (ক ডবল স্পষ্টতা মানের চেয়ে কম ঘটায়10-300, বেশী বা কম)। এখানেαএর বেস-টেন লোগারিদমের ফাংশন হিসাবে আন্ডারফ্লো হওয়ার সম্ভাবনার একটি প্লট রয়েছে:Fα(x)=xααΓ(α)1/αα=1/10010300α

এখানে চিত্র বর্ণনা লিখুন

এর একটি সমাধান হ'ল লগ (গামা) বৈচিত্রগুলি উত্পন্ন করার জন্য এই আনুমানিকতাটি কাজে লাগানো: বাস্তবে, গামা ভেরিয়েট উত্পন্ন করার চেষ্টা করুন এবং যদি এটি খুব সামান্য হয় তবে আনুমানিক বিদ্যুত বিতরণ (নীচে দেখানো হয়েছে) থেকে এর লোগারিদম উত্পন্ন করুন। (লগটি ভূগর্ভস্থ সীমার মধ্যে না হওয়া পর্যন্ত এটি বারবার করুন, যাতে এটি মূল আধারপ্রবাহের বৈকল্পিকের বৈধ বিকল্প হয়)) ডিরিচলেট গণনার জন্য, লগ মানগুলির প্রতিটি থেকে সর্বোচ্চ সমস্ত লগারিদম বিয়োগ করুন: এটি স্পষ্টতই সমস্ত পুনরায় পুনঃনির্ধারণ করে গামা পরিবর্তিত হয় তাই এটি ডিরিচলেট মানগুলিকে প্রভাবিত করে না। সত্যিকারের শূন্যের লগ হিসাবে যে কোনও ফলাফলের লগ খুব ছোট (যেমন -100 এর চেয়ে কম) ব্যবহার করুন। অন্যান্য লগগুলি ব্যাখ্যা করুন। এখন আপনি আন্ডারফ্লো ছাড়াই এগিয়ে যেতে পারেন।

এটি আগের তুলনায় আরও বেশি সময় নিতে চলেছে, তবে কমপক্ষে এটি কার্যকর হবে!

একটি আনুমানিক লগ গামা variate উৎপন্ন করার জন্য আকৃতির মাপদণ্ড সঙ্গে , precompute সি = লগ ( Γ ( α ) ) + + লগ ( α ) । এটি সহজ, কারণ লগ গামার মানগুলি সরাসরি গণনা করার জন্য অ্যালগরিদম রয়েছে । 0 এবং 1 এর মধ্যে অভিন্ন র্যান্ডম ফ্ল্যাট তৈরি করুন, এর লোগারিদম নিন, α দ্বারা ভাগ করুন এবং এতে সি যুক্ত করুন ।αC=log(Γ(α))+log(α)αC

স্কেল প্যারামিটারটি কেবলমাত্র বৈচিত্রটিকে পুনরায় আকার দেয় তাই এই পদ্ধতিগুলিতে এটির সমন্বয় করতে কোনও সমস্যা নেই। সমস্ত স্কেল প্যারামিটার একই হলে আপনার এটির প্রয়োজনও নেই।

সম্পাদন করা

1/αB(α)Γ(α+1)(αxα1)(yαeydy/Γ(α+1))z=xyyz/xxxz0y1

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

Γ(α)

0<α<1Γ(α+1)1/αΓ(α)


1
Γ(α)Γ(α)+Γ(1)Beta(α,1)Γ(α)+Γ(1)Γ(α+1)α0yexpo(1)log(u)Γ(α+1)

7

raα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


α

আমি আরও উত্তর অন্তর্ভুক্ত করার জন্য আমার উত্তর সম্পাদনা করেছি।
লুইস্পিড্রো

ধন্যবাদ: তবে "আর" কি? (নোট যে recursion বেষ্টিত: অধিকাংশ এক recursive কল এ তৈরি করা হবে, কারণ একটি> 0 বোঝা 1.0 + একটি> 1.)
whuber

r হল এলোমেলো সংখ্যা জেনারেটর (যেখানে আপনি এলোমেলো নম্বর পেয়ে যাচ্ছেন)।
লুসিপডেরো

Γ(α+1)B(α,1)Γ(α)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.