Skip to content

সমাধান — অধ্যায় ৪.১০ · Bayesian Inference

অধ্যায় ফাইল: part-4-inference/04-10-bayesian-inference.md (§৭ অনুশীলনী)। সংখ্যাগত উত্তর numpy/scipy দিয়ে যাচাইযোগ্য (seed উল্লেখ থাকলে reproducible)। মূল বস্তু — Bayes' rule \(p(\theta\mid\text{data})\propto\pi(\theta)L(\theta)\); conjugate prior (Beta–Binomial: \(\text{Beta}(a,b)\) + \(k/n\)\(\text{Beta}(a+k,b+n-k)\); Normal–Normal: precision যোগ); credible interval (posterior-এর \((1-\alpha)\) ভর); MAP \(\hat\theta_{\text{MAP}}=\arg\max_\theta p(\theta\mid\text{data})\); posterior predictive \(p(\tilde y\mid\text{data})=\int p(\tilde y\mid\theta)p(\theta\mid\text{data})d\theta\)। চলমান উদাহরণ: E1 Beta–Binomial; E2 Normal–Normal; E3 credible vs confidence; E4 MCMC / posterior predictive।


ক · ধারণাগত (conceptual)

সমাধান ১ (★)

  • prior \(\pi(\theta)\) — data দেখার আগে প্যারামিটার \(\theta\) নিয়ে আমাদের বিশ্বাস, একটা probability distribution হিসেবে প্রকাশ। (Figure 1-এ নীল \(\text{Beta}(2,2)\): "\(\theta\) সম্ভবত মাঝামাঝি, কিন্তু নিশ্চিত নই।")
  • likelihood \(L(\theta)\) — একটা নির্দিষ্ট \(\theta\)-এর অধীনে observed data-র সম্ভাবনা, \(\theta\)-এর ফাংশন হিসেবে দেখা: \(L(\theta)=p(\text{data}\mid\theta)\)। (Figure 1-এ কমলা, শিখর MLE \(\hat\theta=0.70\)-তে।) লক্ষ করুন likelihood নিজে \(\theta\)-এর density নয় — এটা data-কে স্থির রেখে \(\theta\)-কে নাড়িয়ে পাওয়া বক্ররেখা।
  • posterior \(p(\theta\mid\text{data})\) — data দেখার পরে \(\theta\) নিয়ে আপডেটেড বিশ্বাস, আবার একটা distribution। (Figure 1-এ সবুজ \(\text{Beta}(16,8)\)।)

Bayes' rule এদের জোড়ে: \(p(\theta\mid\text{data})=\dfrac{\pi(\theta)L(\theta)}{\int\pi(\theta')L(\theta')d\theta'}\propto\pi(\theta)\,L(\theta)\)। হর (marginal likelihood / evidence) শুধু একটা normalizing constant — তাই প্রায়ই \(\propto\) লিখে kernel নিয়ে কাজ করা হয়।

posterior কেন মাঝে ও সরু (Figure 1): posterior প্রতিটা \(\theta\)-তে prior ও likelihood-এর মান গুণ করে। দুটোই যেখানে মাঝারি-বড়, সেখানেই গুণফল বড় — তাই শিখর prior-কেন্দ্র (\(0.50\)) আর likelihood-শিখর (\(0.70\))-এর মাঝে (\(\approx0.68\))। আর গুণফল দুই উৎসের তথ্য মেলায় বলে কোনো একক উৎসের চেয়ে \(\theta\)-কে বেশি নিশ্চিতভাবে আটকায় — তাই posterior সরু (কম variance, কম অনিশ্চয়তা)।

সমাধান ২ (★★) — [credible interval বনাম confidence interval]

credible interval (Bayesian) confidence interval (frequentist)
কী random \(\theta\) (posterior density) interval-এর দুই প্রান্ত (data-নির্ভর)
কী fixed interval (data দেওয়া) \(\theta\) (অজানা ধ্রুবক)
অর্থ \(P(\theta\in[L,U]\mid\text{data})=0.95\) এই পদ্ধতি-তে বানানো interval-এর \(95\%\) সত্য \(\theta\)-কে ঢাকবে
Figure 3 বাঁ প্যানেল: একটা posterior, ছায়া-ব্যবধান ডান প্যানেল: অনেক random interval, একটা স্থির \(\theta\)

"\(\theta\) এই interval-এ থাকার সম্ভাবনা \(0.95\)" — কোনটার জন্য বৈধ?

  • credible interval-এর জন্য বৈধ। Bayesian-এ \(\theta\) একটা random quantity (আমাদের অনিশ্চয়তার density), interval স্থির — তাই \(\theta\) এর ভেতরে পড়ার একটা সম্ভাবনা আছে, এবং তা \(0.95\)
  • confidence interval-এর জন্য অবৈধ (এই একটা interval-এর জন্য)। frequentist-এ \(\theta\) স্থির ও interval random; একটা নির্দিষ্ট interval বানিয়ে ফেললে \(\theta\) হয় তার ভেতরে, নয় বাইরে — সম্ভাবনা \(0\) বা \(1\), \(0.95\) নয়। \(0.95\) বর্ণনা করে পদ্ধতির দীর্ঘমেয়াদি coverage (Figure 3-ডান: কল্পিতভাবে বহুবার নমুনা নিলে \(\sim95\%\) interval \(\theta\)-কে ঢাকবে), এই বিশেষ interval-কে নয়। এই ভুল-ব্যাখ্যাই Bayesian ও frequentist গুলিয়ে ফেলার সবচেয়ে সাধারণ উৎস।

সমাধান ৩ (★★)

  • conjugate prior — একটা prior পরিবার যা নির্দিষ্ট likelihood-এর সাথে এমনভাবে মেলে যে posterior একই পরিবারে থাকে। তখন আপডেট মানে শুধু পরিবারের parameter বদলানো, নতুন কোনো বণ্টন বের করা নয়।
  • Beta–Binomial conjugate কেন: Beta prior \(\propto\theta^{a-1}(1-\theta)^{b-1}\), Binomial likelihood \(\propto\theta^k(1-\theta)^{n-k}\); গুণ করলে \(\propto\theta^{(a+k)-1}(1-\theta)^{(b+n-k)-1}\) — আবার একটা Beta (\(\text{Beta}(a+k,b+n-k)\))। দুটোরই \(\theta\)-তে একই "\(\theta^{\cdot}(1-\theta)^{\cdot}\)" গঠন বলেই এটা ঘটে (§৭ Q9-এ প্রমাণ)।
  • ব্যবহারিক সুবিধা: (১) posterior-এর closed-form — integral করতে হয় না; (২) online/sequential আপডেট তুচ্ছ: প্রতিটা নতুন data-তে শুধু \(a\!+\!k\), \(b\!+\!n\!-\!k\) (Figure 2 — আগের posterior পরের prior)।
  • conjugate না পাওয়া গেলে (non-conjugate): অধিকাংশ বাস্তব মডেলে (যেমন logistic regression-এর parameter) prior×likelihood কোনো নাম-জানা পরিবার দেয় না, posterior-এর closed-form নেই। তখন MCMC দিয়ে posterior থেকে নমুনা টেনে তাকে আনুমানিকভাবে আঁকা/সারাংশ করতে হয় (Figure 4)।

সমাধান ৪ (★★)

  • MAP estimate \(\hat\theta_{\text{MAP}}=\arg\max_\theta p(\theta\mid\text{data})\) — posterior যেখানে সর্বোচ্চ (শিখর/mode)। একটা single "সবচেয়ে সম্ভাব্য" মান।
  • posterior mean \(\mathbb{E}[\theta\mid\text{data}]=\int\theta\,p(\theta\mid\text{data})d\theta\) — posterior-এর ভারকেন্দ্র (গড়)। squared-error loss-এর অধীনে এটি optimal point estimate।
  • পার্থক্য: symmetric posterior-এ দুটো মেলে; skewed posterior-এ আলাদা (ভারকেন্দ্র লেজের দিকে সরে, শিখর সরে না)।
  • MLE-র সাথে সম্পর্ক: \(\hat\theta_{\text{MAP}}=\arg\max[\log\pi(\theta)+\log L(\theta)]\); prior flat (uniform) হলে \(\log\pi\) ধ্রুবক, তাই \(\hat\theta_{\text{MAP}}=\arg\max\log L=\hat\theta_{\text{MLE}}\) (§৭ Q11)। অর্থাৎ MAP = "prior দিয়ে নিয়ন্ত্রিত (regularized) MLE।"

Figure 1-এর \(\text{Beta}(16,8)\): - MAP (mode) \(=\dfrac{a-1}{a+b-2}=\dfrac{15}{22}=0.682\approx\mathbf{0.68}\) (শিখরের অবস্থান)। - mean \(=\dfrac{a}{a+b}=\dfrac{16}{24}=0.667\approx\mathbf{0.67}\) (ভারকেন্দ্র)। posterior সামান্য বাঁ-দিকে skewed (mode > mean), তাই দুটো একটু আলাদা।


খ · গাণনিক (computational)

সমাধান ৫ (★) — E1 (Beta–Binomial)

prior \(\text{Beta}(3,3)\); \(n=12\), \(x=9\) head।

(ক) posterior: \(\text{Beta}(a+x,\,b+n-x)=\text{Beta}(3+9,\,3+3)=\boxed{\text{Beta}(12,6)}\)

(খ) summaries: - posterior mean \(=\dfrac{a}{a+b}=\dfrac{12}{18}=\boxed{0.667}\)। - MAP (mode) \(=\dfrac{a-1}{a+b-2}=\dfrac{11}{16}=\boxed{0.688}\)

(যাচাই: stats.beta(12,6).mean() \(=0.6\overline{6}\); mode \(=11/16=0.6875\)।)

সমাধান ৬ (★★) — E1 (credible interval)

posterior \(\text{Beta}(12,6)\); equal-tailed \(95\%\) credible interval = \([\,\)2.5%, 97.5%\(\,]\) quantile।

from scipy import stats
lo, hi = stats.beta.ppf([0.025, 0.975], 12, 6)
print(round(lo,3), round(hi,3))     # 0.438 0.866

উত্তর: \(95\%\) credible interval \(\approx\boxed{[0.438,\ 0.866]}\)

অর্থ: "data দেখার পর, \(P(0.438\le\theta\le0.866\mid\text{data})=0.95\)" — অর্থাৎ posterior-এর ঠিক \(95\%\) ভর এই ব্যবধানে; \(\theta\) এর ভেতরে থাকার (posterior) সম্ভাবনা \(0.95\)। (frequentist confidence interval-এর মতো "পদ্ধতির coverage" নয় — Q2, Figure 3।)

সমাধান ৭ (★★) — E2 (Normal–Normal)

prior \(\mathcal{N}(\mu_0=100,\tau_0^2=25)\); জানা \(\sigma^2=16\), \(n=10\), \(\bar x=108\)

posterior precision (precision যোগ হয়): $\(\frac{1}{\tau_n^2}=\frac{1}{\tau_0^2}+\frac{n}{\sigma^2}=\frac{1}{25}+\frac{10}{16}=0.04+0.625=0.665.\)$ posterior variance: \(\tau_n^2=\dfrac{1}{0.665}=\boxed{1.504}\) (sd \(\approx1.226\))।

posterior mean (precision-ভারিত গড়): $\(\mu_n=\frac{\dfrac{\mu_0}{\tau_0^2}+\dfrac{n\bar x}{\sigma^2}}{\dfrac{1}{\tau_0^2}+\dfrac{n}{\sigma^2}}=\frac{0.04\cdot100+0.625\cdot108}{0.665}=\frac{4+67.5}{0.665}=\frac{71.5}{0.665}=\boxed{107.5}.\)$

ব্যাখ্যা: posterior mean \(107.5\) prior-mean \(100\) আর sample-mean \(108\)-এর মাঝে, কিন্তু \(108\)-এর অনেক কাছে — কারণ data-র precision (\(0.625\)) prior-precision (\(0.04\))-এর চেয়ে অনেক বড়, তাই data বেশি "ওজন" পায়। posterior variance (\(1.504\)) prior-variance (\(25\))-এর চেয়ে অনেক ছোট: data দেখার পর \(\mu\) নিয়ে অনিশ্চয়তা নাটকীয়ভাবে কমেছে।

সমাধান ৮ (★★) — E4 (posterior predictive)

posterior \(\text{Beta}(12,6)\) (Q5)। একটা ভবিষ্যৎ Bernoulli ছোঁড়া \(\tilde y\): $\(P(\tilde y=1\mid\text{data})=\int_0^1 P(\tilde y=1\mid\theta)\,p(\theta\mid\text{data})\,d\theta=\int_0^1\theta\,p(\theta\mid\text{data})\,d\theta=\mathbb{E}[\theta\mid\text{data}]=\frac{a}{a+b}=\frac{12}{18}=\boxed{0.667}.\)$

ব্যাখ্যা: posterior predictive পুরো posterior-এর ওপর গড় নেয় (একটা plug-in মান, যেমন MAP \(0.688\), ব্যবহার করে \(\theta\)-কে আটকায় না)। একটা single ভবিষ্যৎ Bernoulli ফলাফলের জন্য এটি ঠিক posterior mean-এ নেমে আসে। যদি প্রশ্ন হতো "পরের \(m\) ছোঁড়ায় কত head" — তখন posterior predictive একটা Beta-Binomial বণ্টন দিত (binomial-এর \(\theta\)-কে posterior দিয়ে integrate করে), যা plain Binomial-এর চেয়ে চওড়া — কারণ এটি \(\theta\)-র অনিশ্চয়তাও বহন করে।


গ · প্রমাণভিত্তিক (proof-based)

সমাধান ৯ (★★) — Beta–Binomial conjugacy

prior: \(\pi(\theta)=\dfrac{\theta^{a-1}(1-\theta)^{b-1}}{B(a,b)}\propto\theta^{a-1}(1-\theta)^{b-1}\), \(\ 0<\theta<1\)

likelihood (\(n\) চেষ্টায় \(k\) সাফল্য): \(L(\theta)=\binom{n}{k}\theta^k(1-\theta)^{n-k}\propto\theta^k(1-\theta)^{n-k}\) (\(\binom{n}{k}\) \(\theta\)-নিরপেক্ষ, ফেলে দেওয়া যায়)।

Bayes' rule: $\(p(\theta\mid\text{data})\propto\pi(\theta)L(\theta)\propto\theta^{a-1}(1-\theta)^{b-1}\cdot\theta^{k}(1-\theta)^{n-k}=\theta^{(a+k)-1}(1-\theta)^{(b+n-k)-1}.\)$

ডানপাশটা ঠিক \(\text{Beta}(a+k,\ b+n-k)\)-এর kernel। যেহেতু posterior একটা probability density (যোগফল \(1\)), normalizing constant অবশ্যই \(1/B(a+k,b+n-k)\) — তাই $\(\boxed{p(\theta\mid\text{data})=\text{Beta}(a+k,\ b+n-k).}\)$ prior ও posterior দুটোই Beta — তাই Beta হলো Binomial likelihood-এর conjugate prior\(\blacksquare\)

(অন্তর্দৃষ্টি: \(a\)-কে "prior সাফল্য \(+1\)" আর \(b\)-কে "prior ব্যর্থতা \(+1\)"-এর মতো ভাবা যায়; data শুধু এই pseudo-count-এ সত্যিকারের সাফল্য \(k\) ও ব্যর্থতা \(n-k\) যোগ করে।)

সমাধান ১০ (★★★) — Normal–Normal conjugacy

\(X_1,\dots,X_n\overset{iid}{\sim}\mathcal{N}(\mu,\sigma^2)\) (\(\sigma^2\) জানা), prior \(\mu\sim\mathcal{N}(\mu_0,\tau_0^2)\)

\[p(\mu\mid\text{data})\propto\underbrace{\exp\!\Big(-\frac{(\mu-\mu_0)^2}{2\tau_0^2}\Big)}_{\text{prior}}\cdot\underbrace{\exp\!\Big(-\frac{\sum_{i=1}^n(x_i-\mu)^2}{2\sigma^2}\Big)}_{\text{likelihood}}.\]

exponent-এ \(\mu\)-নির্ভর অংশ একসাথে নিই (constant ফেলে): $\(-\frac{1}{2}\Big[\frac{(\mu-\mu_0)^2}{\tau_0^2}+\frac{\sum(x_i-\mu)^2}{\sigma^2}\Big].\)$ \(\sum(x_i-\mu)^2=\sum(x_i-\bar x)^2+n(\bar x-\mu)^2\); প্রথম পদ \(\mu\)-নিরপেক্ষ, তাই বাদ। \(\mu\)-এর quadratic গুছিয়ে: $\(-\frac12\Big[\Big(\frac{1}{\tau_0^2}+\frac{n}{\sigma^2}\Big)\mu^2-2\Big(\frac{\mu_0}{\tau_0^2}+\frac{n\bar x}{\sigma^2}\Big)\mu\Big]+\text{const}.\)$ ধরি \(\dfrac{1}{\tau_n^2}=\dfrac{1}{\tau_0^2}+\dfrac{n}{\sigma^2}\) (posterior precision) আর \(\mu_n=\tau_n^2\Big(\dfrac{\mu_0}{\tau_0^2}+\dfrac{n\bar x}{\sigma^2}\Big)\)। তাহলে exponent \(=-\dfrac{1}{2\tau_n^2}(\mu-\mu_n)^2+\text{const}\) (complete the square)। অর্থাৎ $\(\boxed{p(\mu\mid\text{data})=\mathcal{N}(\mu_n,\tau_n^2),\quad \frac{1}{\tau_n^2}=\frac{1}{\tau_0^2}+\frac{n}{\sigma^2},\quad \mu_n=\frac{\frac{\mu_0}{\tau_0^2}+\frac{n\bar x}{\sigma^2}}{\frac{1}{\tau_0^2}+\frac{n}{\sigma^2}}.}\)$ posterior আবার Normal — Normal হলো (জানা variance-এ) Normal mean-এর conjugate prior। precision যোগ হয় (\(1/\tau_n^2=1/\tau_0^2+n/\sigma^2\)), আর posterior mean হলো prior-mean ও sample-mean-এর precision-ভারিত গড় — যার precision বেশি, তার ওজন বেশি। \(n\to\infty\)-এ data-precision \(n/\sigma^2\) আধিপত্য করে, \(\mu_n\to\bar x\) (prior ম্লান)। \(\blacksquare\)

সমাধান ১১ (★★) — flat prior-এ MAP = MLE

$\(\hat\theta_{\text{MAP}}=\arg\max_\theta p(\theta\mid\text{data})=\arg\max_\theta\pi(\theta)L(\theta)=\arg\max_\theta\big[\log\pi(\theta)+\log L(\theta)\big]\)$ (log একঘাতী বর্ধমান, তাই \(\arg\max\) অপরিবর্তিত; normalizing constant \(\theta\)-নিরপেক্ষ, \(\arg\max\)-এ প্রভাব ফেলে না)।

prior flat ⇒ \(\pi(\theta)=c\) (ধ্রুবক) ⇒ \(\log\pi(\theta)=\log c\) একটা ধ্রুবক, যা \(\theta\)-এর সাপেক্ষে \(\arg\max\)-কে বদলায় না: $\(\hat\theta_{\text{MAP}}=\arg\max_\theta\big[\text{const}+\log L(\theta)\big]=\arg\max_\theta\log L(\theta)=\hat\theta_{\text{MLE}}.\qquad\blacksquare\)$

informative prior-এ কেন টানে: তখন \(\log\pi(\theta)\) আর ধ্রুবক নয় — যেখানে prior ঘন সেখানে \(\log\pi\) বড়। ফলে \(\arg\max[\log\pi+\log L]\) শুধু likelihood-শিখরে না বসে, prior-এর ঘন অঞ্চলের দিকে কিছুটা সরে যায়; দুই পদের টানাটানিতে শিখর MLE ও prior-mode-এর মাঝে কোথাও পড়ে। এটাই regularization-এর Bayesian রূপ: যেমন coefficient-এ Gaussian prior দিলে MAP = ridge (L2) estimate, Laplace prior দিলে MAP = lasso (L1) estimate — prior penalty term-এর কাজ করে।


ঘ · কোডিং (coding)

সমাধান ১২ (★★) — sequential updating (Figure 2 পুনর্নির্মাণ)

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)
th = np.linspace(0, 1, 500)
a0, b0, true_p = 1, 1, 0.7
stream = rng.binomial(1, true_p, 320)

plt.figure(figsize=(8, 5))
for n in [0, 5, 20, 80, 320]:
    k = int(stream[:n].sum())
    a, b = a0 + k, b0 + (n - k)
    plt.plot(th, stats.beta.pdf(th, a, b), lw=2, label=f"n={n} (k={k}): Beta({a},{b})")
plt.axvline(true_p, ls=":", color="red", label="true theta = 0.7")
plt.xlabel("theta"); plt.ylabel("posterior density")
plt.title("Sequential Bayesian updating (Beta-Binomial)")
plt.legend(); plt.tight_layout(); plt.show()

যা দেখা যায়: \(n=0\) flat (uniform); \(n\) বাড়ার সাথে curve লম্বা ও সরু হয় (অনিশ্চয়তা কমে) আর শিখর \(0.7\)-এর দিকে থিতু হয় (Bayesian consistency)। প্রতিটা posterior পরের prior — তাই শুধু \(a,b\) আপডেট, নতুন বণ্টন বের করতে হয় না (conjugacy)। (এই বিশেষ seed-এ checkpoints: \(\text{Beta}(4,3),\text{Beta}(13,9),\text{Beta}(60,22),\text{Beta}(222,100)\)।)

সমাধান ১৩ (★★) — credible vs Wald CI (E1 + E3)

import numpy as np
from scipy import stats

n, x = 40, 28

# (ক) Bayesian credible (flat prior Beta(1,1) -> posterior Beta(29,13))
a, b = 1 + x, 1 + (n - x)
cred = stats.beta.ppf([0.025, 0.975], a, b)

# (খ) frequentist Wald CI
ph = x / n
se = np.sqrt(ph * (1 - ph) / n)
wald = (ph - 1.96 * se, ph + 1.96 * se)

print("posterior:", f"Beta({a},{b})")
print("credible :", np.round(cred, 3))   # [0.555 0.825]
print("Wald CI  :", np.round(wald, 3))   # [0.557 0.843]

(ক) posterior \(\text{Beta}(29,13)\); \(95\%\) credible interval \(\approx[0.555,\ 0.825]\)(খ) \(\hat p=0.70\), se \(=\sqrt{0.7\cdot0.3/40}=0.0725\); Wald CI \(\approx[0.557,\ 0.843]\)(গ) দুটো সংখ্যাগতভাবে কাছাকাছি (flat prior + মাঝারি \(n\)-এ স্বাভাবিক)। কিন্তু অর্থে আলাদা: credible interval বলে "\(P(0.555\le\theta\le0.825\mid\text{data})=0.95\)" (\(\theta\) random, posterior); Wald CI বলে "এমন \(95\%\) interval সত্য \(\theta\)-কে ঢাকে" (\(\theta\) fixed, interval random — coverage)। সংখ্যা মিললেও Q2/Figure 3-এর ব্যাখ্যাগত পার্থক্য বজায় থাকে। (লক্ষণীয়: credible interval \([0,1]\)-এর বাইরে যেতে পারে না, Wald CI পারে — boundary-র কাছে Bayesian ভালো আচরণ করে।)

সমাধান ১৪ (★★★) — MCMC, non-conjugate posterior

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(1)
n, k = 30, 21

def log_post(t):
    if t <= 0 or t >= 1:
        return -np.inf
    log_prior = np.log(t) + np.log(1 - t) + np.log(1 + np.sin(6 * np.pi * t))
    log_lik = k * np.log(t) + (n - k) * np.log(1 - t)
    return log_prior + log_lik

N, t = 20000, 0.5
cur = log_post(t)
chain = []
accept = 0
for _ in range(N):
    prop = t + rng.normal(0, 0.08)           # random-walk proposal
    lp = log_post(prop)
    if np.log(rng.uniform()) < lp - cur:     # Metropolis accept/reject
        t, cur = prop, lp
        accept += 1
    chain.append(t)

chain = np.array(chain)
s = chain[2000:]                              # discard burn-in
print("accept rate:", round(accept / N, 3))
print("posterior mean:", round(s.mean(), 3))
print("95% credible :", np.round(np.percentile(s, [2.5, 97.5]), 3))

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4))
ax1.plot(chain, lw=0.4); ax1.axvspan(0, 2000, color="grey", alpha=0.2)
ax1.set_title("trace (fuzzy caterpillar = good mixing)")
ax1.set_xlabel("iteration"); ax1.set_ylabel("theta")
ax2.hist(s, bins=40, density=True, alpha=0.6)
ax2.set_title("histogram = approximate posterior")
ax2.set_xlabel("theta"); plt.tight_layout(); plt.show()

যা পাওয়া যায়: accept rate \(\approx0.4\)\(0.5\) (random-walk step \(0.08\)-এ যুক্তিসঙ্গত); posterior mean \(\approx0.68\)\(0.70\), \(95\%\) credible interval \(\approx[0.53,\ 0.82]\) (seed/run-ভেদে সামান্য ভিন্ন)। মূল শিক্ষা: prior-টা ঢেউখেলানো ও non-conjugate বলে posterior-এর কোনো নাম-জানা সূত্র নেই — তবু MCMC নমুনা টেনে histogram-ই posterior বানিয়ে দেয়, আর mean/credible interval কেবল নমুনার গড়/percentile থেকে আসে; কোনো integral করতে হয় না। trace-এর "fuzzy caterpillar" চেহারা ভালো mixing-এর চিহ্ন, আর শুরুর burn-in বাদ দেওয়া হয় কারণ chain তখনও posterior-এ থিতু হয়নি (Figure 4-এর নীতি)। বাস্তবে এই কাজ PyMC/Stan-এর মতো লাইব্রেরি স্বয়ংক্রিয়ভাবে করে (NUTS/HMC sampler), কিন্তু ভেতরের ধারণা ঠিক এটাই।