সরাসরি পর্বে যান
পর্ব ৫০ · ৭৯-এর মধ্যে · মডিউল ৯

Bayes-এর উপপাদ্য — প্রমাণ পেলে বিশ্বাস হালনাগাদ

Bayes' Theorem in Depth — Prior, Likelihood, Evidence and Posterior, the Odds Form, Sequential Updating, Beta–Binomial Estimation, Credible Intervals and MAP

Taught in Bangla, this lesson works Bayes' theorem through a damaged-parcel example with a table and the odds form, shows sequential updating and the danger of counting the same evidence twice, estimates a return rate with a Beta prior and binomial data using SciPy in the browser, compares two products by posterior sampling, and explains credible intervals, MAP, MLE and Laplace's rule.

এই পর্বে যা শিখবেন

  • শুধু যুক্তি দিয়ে অনিশ্চয়তা সামলানো কেন কঠিন, আর সম্ভাবনা কীভাবে logic-কে সম্প্রসারিত করে
  • Prior, likelihood, evidence আর posterior নাম ধরে চেনা, দুই লাইনে Bayes-এর সূত্র প্রমাণ, আর odds form ও likelihood ratio দিয়ে দ্রুত হিসাব
  • একাধিক প্রমাণে ধারাবাহিক হালনাগাদ, ক্রম কেন বদলায় না, আর নির্ভরশীল প্রমাণকে স্বাধীন ধরার বিপদ
  • Beta prior আর binomial likelihood দিয়ে পণ্যের ফেরতের হার অনুমান, scipy.stats.beta.ppf দিয়ে credible interval, আর prior-এর শক্তির প্রভাব
  • Posterior sampling দিয়ে দুটি পণ্যের তুলনা, credible বনাম confidence interval, MAP বনাম MLE, আর AI-তে Bayesian চিন্তার জায়গা ও সাধারণ ভুল

এই পর্ব দিয়ে মডিউল ৯ শুরু: অনিশ্চয়তার মধ্যে যুক্তি। পর্ব ৩৫-এ Bayes-এর নিয়মের প্রথম পরিচয় পেয়েছেন: ১০০০-এ ১ জালিয়াতির base rate-এ ৯৯% ধরতে পারা পরীক্ষার flag-ও মাত্র প্রায় ৪.৭% ক্ষেত্রে সত্যি। এখানে আরও গভীরে যাব, শেষে অজানা একটি হার পর্যন্ত। উদাহরণ আবার বাজারঘর, এই কোর্সের কাল্পনিক অনলাইন দোকান; সব হার আর সংখ্যা বানানো। চালানো যায় এমন ব্লকগুলো পাতাতেই চলে (ব্রাউজারের Python, NumPy 2.4.6, SciPy 1.18.0, matplotlib 3.10.8); প্রথমবার SciPy নামতে প্রায় ১০ সেকেন্ড লাগতে পারে, পরে দ্রুত।

১ · যুক্তি থেকে সম্ভাবনায় — নিয়ম কেন অনিশ্চয়তায় হোঁচট খায়

মডিউল ৮-এ জ্ঞানকে বাক্য আর নিয়মে লিখেছেন। পর্ব ৪৫-এর propositional logic-এ প্রতিটি বাক্য হয় সত্য, নয় মিথ্যা, আর modus ponens বলে: “A হলে B” আর “A” জানা থাকলে B নিশ্চিত। মানুষের লেখা হ্যাঁ-না নীতিতে এটি চমৎকার, কিন্তু বাস্তব জগৎ প্রায়ই এমন নয়।

একটি পার্সেল ভেঙে পৌঁছেছে। কোন কুরিয়ার দায়ী? “ভাঙা হলে কুরিয়ার B” নিয়মটি লিখলে ভুল, কারণ A-ও মাঝে মাঝে ভাঙে। “ভাঙা হলে B, যদি না … ” লিখতে গেলে ব্যতিক্রমের তালিকা শেষ হয় না: বৃষ্টি, প্যাকিং, দূরত্ব, পণ্যের ধরন। Logic-এর তিনটি সীমা এখানে স্পষ্ট:

  • মাত্রা নেই: “সম্ভবত B” বলার উপায় নেই; সত্য-মিথ্যার মাঝখানে কিছু নেই।
  • মত বদলানো কঠিন: logic-এ একবার প্রমাণিত সিদ্ধান্ত নতুন তথ্যে বাতিল হয় না (একে monotonic বলে)। অথচ “ভাঙা দেখে B সন্দেহ, কিন্তু রসিদে দেখি পার্সেলটি A-এর” এমন মত বদল রোজকার ব্যাপার।
  • প্রমাণ মেলানোর নিয়ম নেই: দুটি দুর্বল ইঙ্গিত মিলে কতটা জোরালো, logic তা বলে না।

১৯৭০-এর দশকের expert system এই ফাঁক পূরণ করতে নিয়মের সঙ্গে একটি সংখ্যা জুড়ে দিত। পর্ব ৪৭-এ MYCIN-এর certainty factor দেখেছেন: দুটি নিয়ম একই সিদ্ধান্ত দিলে CF = CF1 + CF2(1 − CF1). সূত্রটি সহজ, কিন্তু পরে দেখানো হয় এটি সম্ভাবনার নিয়মের সঙ্গে মেলে শুধু কঠোর কিছু অনুমানে, আর একই প্রমাণ দুই পথে এলে দুবার গোনা হয়। সম্ভাবনা এই সমস্যার একটি নীতিগত সমাধান দেয়। P = 1 মানে logic-এর “সত্য”, P = 0 মানে “মিথ্যা”; আর মাঝের সংখ্যাগুলো বিশ্বাসের মাত্রা। P(B | A) = 1 হলে Bayes-এর হিসাব modus ponens-এর মতোই আচরণ করে। এই অর্থে সম্ভাবনা logic-এর সম্প্রসারণ, আর প্রমাণ পেলে বিশ্বাস হালনাগাদের নিয়মটিই Bayes-এর উপপাদ্য।

ডাক্তারের রোগনির্ণয়ের কথা ভাবুন। জ্বর নিয়ে আসা রোগী দেখে অভিজ্ঞ ডাক্তার মনে মনে বলেন: “এই মৌসুমে এলাকায় ডেঙ্গু অনেক, তাই সম্ভাবনা বেশ।” এটি তাঁর আগের ধারণা। তারপর পরীক্ষার রিপোর্ট আসে; রিপোর্ট যত নির্ভরযোগ্য, ধারণা তত বেশি বদলায়। কিন্তু একটি রিপোর্টেই তিনি এলাকার ছবি ভুলে যান না। Bayes-এর উপপাদ্য এই অভ্যাসটিকে সংখ্যায় লেখে।

এর একটি পরিচিত দার্শনিক যুক্তি Richard Cox-এর (১৯৪৬): বিশ্বাসের মাত্রা কিছু স্বাভাবিক শর্ত মানলে তা সম্ভাবনার নিয়মই মানতে বাধ্য। E. T. Jaynes এই ধারায় তাঁর বইয়ের নাম দেন Probability Theory: The Logic of Science (২০০৩); শর্তগুলো নিয়ে গবেষকদের মধ্যে আলোচনা আছে।

২ · চার অংশ — prior, likelihood, evidence আর posterior

বাজারঘর দুটি কুরিয়ার ব্যবহার করে, যাদের এই কোর্সে আগেও দেখেছেন (দুটিই কাল্পনিক): A = “দ্রুতপথ” আর B = “সবুজ”. ধরুন হিসাবের খাতা বলছে (কাল্পনিক হার): মোট পার্সেলের ৬০% যায় A দিয়ে, ৪০% B দিয়ে; A-এর ২% পার্সেল ভেঙে পৌঁছায়, B-এর ৫%. আজ একজন ক্রেতা অভিযোগ করেছেন, পার্সেল ভাঙা; রসিদ হারিয়ে গেছে। কোন কুরিয়ার, কত সম্ভাবনায়?

প্রশ্নে H (hypothesis, অনুমান) হলো “কুরিয়ার B”, আর E (evidence, প্রমাণ) হলো “পার্সেল ভাঙা”. সূত্রের চারটি অংশের নাম:

P(H | E) = P(E | H) · P(H) / P(E)

অংশপ্রতীকমানেভাঙা পার্সেলে
PriorP(H)প্রমাণ দেখার আগে বিশ্বাসP(B) = ০.৪০
LikelihoodP(E | H)অনুমানটি সত্য হলে এই প্রমাণ কতটা প্রত্যাশিতP(ভাঙা | B) = ০.০৫
Evidence বা marginal likelihoodP(E)সব অনুমান মিলিয়ে প্রমাণটির মোট সম্ভাবনা০.৬ × ০.০২ + ০.৪ × ০.০৫ = ০.০৩২
PosteriorP(H | E)প্রমাণ দেখার পরে বিশ্বাস০.০২০ ÷ ০.০৩২ = ০.৬২৫

Likelihood শব্দটি নিয়ে সাবধান। P(ভাঙা | A) = ০.০২ আর P(ভাঙা | B) = ০.০৫ দুটি সংখ্যা যোগ করলে ১ হয় না, আর হওয়ার কথাও নয়: এগুলো দুটি আলাদা জগতে একই প্রমাণের সম্ভাবনা। Likelihood পড়ুন “কোন অনুমান এই প্রমাণকে কতটা ভালো ব্যাখ্যা করে” হিসেবে। Evidence শুধু ভাগ করার সংখ্যা, যা posterior-গুলোর যোগফল ১ করে; এটি আসে পর্ব ৩৫-এর law of total probability থেকে।

১০০০টি পার্সেল দিয়ে একই হিসাব

600 go by A, 400 by B; 12 of A's and 20 of B's arrive damaged; among the 32 damaged parcels, 20 are B's

1000 parcels: P(B | damaged) = 20 / 32 = 0.625 1000 parcels prior 0.6 0.4 A: 600 B: 400 × 0.02 × 0.05 12 damaged 20 damaged all damaged: 32 A 12 B 20 P(B ∣ damaged) = 20/32 = 0.625
ছবি ৫০.১ — Prior জনসংখ্যাকে ভাগ করে, likelihood প্রতিটি ভাগ থেকে কতটি প্রমাণ দেখাবে তা ঠিক করে, আর posterior হলো শুধু প্রমাণওয়ালা পার্সেলের (নিচের দণ্ড) মধ্যে প্রতিটি কুরিয়ারের ভাগ। B কম পার্সেল নেয়, তবু ভাঙা পার্সেলের বেশিরভাগ তার।

দুই লাইনে প্রমাণ

Conditional probability-র সংজ্ঞা (পর্ব ৩৫) থেকে “H এবং E”-কে দুই দিক থেকে লেখা যায়, তারপর P(E) দিয়ে ভাগ:

P(H ∩ E) = P(H | E) · P(E) = P(E | H) · P(H)
⇒ P(H | E) = P(E | H) · P(H) / P(E),  যেখানে P(E) = ∑i P(E | Hi) · P(Hi)

এখানে Hi হলো পরস্পর-বর্জনকারী সব অনুমান (A আর B), আর ∑ মানে সবগুলোর ওপর যোগ। Bayes-এর উপপাদ্য তাই নতুন কোনো স্বতঃসিদ্ধ নয়; এর শক্তি ব্যবহারে: সহজে জানা দিক (কুরিয়ার জানলে ভাঙার হার) থেকে কঠিন দিকে (ভাঙা দেখে কুরিয়ার) যাওয়া।

নিচের stepper হিসাবটি একটি ছোট টেবিলে করে; পরীক্ষার খাতায় Bayes-এর অঙ্কের সবচেয়ে নিরাপদ ছক এটিই।

ভাঙা পার্সেল: কোন কুরিয়ার?
AB
prior
likelihood
গুণফল
P(E)
posterior
  1. Prior লিখুন। প্রতিটি অনুমানের জন্য একটি কলাম; প্রমাণ দেখার আগে A ০.৬০, B ০.৪০. এই সারির যোগফল সবসময় ১.
  2. Likelihood লিখুন। প্রতিটি কুরিয়ার সত্য ধরলে “ভাঙা” দেখার সম্ভাবনা: ০.০২ আর ০.০৫. এই সারি যোগ করার মানে নেই; প্রতিটি আলাদা জগতের সংখ্যা।
  3. কলাম ধরে গুণ। ০.৬০ × ০.০২ = ০.০১২ আর ০.৪০ × ০.০৫ = ০.০২০. এগুলো joint probability, P(কুরিয়ার এবং ভাঙা); ১০০০টি পার্সেলে ১২টি আর ২০টি।
  4. যোগ করে evidence. ০.০১২ + ০.০২০ = ০.০৩২; প্রতি ১০০০টি পার্সেলে প্রায় ৩২টি ভাঙা পৌঁছায়। এটিই P(E).
  5. ভাগ করে posterior. ০.০১২ ÷ ০.০৩২ = ০.৩৭৫ আর ০.০২০ ÷ ০.০৩২ = ০.৬২৫. যোগফল আবার ১. Prior-এ A এগিয়ে ছিল, প্রমাণ দেখে B এগিয়ে গেল।
মূল ধারণা

Posterior ∝ likelihood × prior. চিহ্ন ∝ মানে “সমানুপাতিক”: আগে প্রতিটি অনুমানের prior আর likelihood গুণ করুন, শেষে যোগফল দিয়ে ভাগ করে ১-এ আনুন। অনুমান দুটি হোক বা দশটি, ছকটি একই।

৩ · Odds form — posterior odds = prior odds × likelihood ratio

দুটি অনুমানের তুলনায় সম্ভাবনার চেয়ে odds প্রায়ই সহজ। Odds মানে “পক্ষে : বিপক্ষে”, অর্থাৎ p / (1 − p). সম্ভাবনা ০.৪০ মানে odds ০.৪ : ০.৬ = ২ : ৩ ≈ ০.৬৬৭; উল্টো দিকে odds o থেকে সম্ভাবনা o / (1 + o).

Bayes-এর সূত্রটি B আর A দুটির জন্য লিখে একটিকে অন্যটি দিয়ে ভাগ করলে হরের P(E) কেটে যায়:

P(B | E) / P(A | E) = [P(B) / P(A)] × [P(E | B) / P(E | A)]
posterior odds = prior odds × likelihood ratio

ডান দিকের দ্বিতীয় বন্ধনী likelihood ratio (LR): প্রমাণটি B-এর জগতে A-এর জগতের তুলনায় কত গুণ বেশি প্রত্যাশিত। ভাঙা পার্সেলে LR = ০.০৫ ÷ ০.০২ = ২.৫. তাই posterior odds = ০.৬৬৭ × ২.৫ = ১.৬৬৭, আর সম্ভাবনা ১.৬৬৭ ÷ ২.৬৬৭ = ০.৬২৫, আগের মতোই। কেন এই রূপটি কাজের:

  • হর লাগে না: P(E)-এর হিসাব বাদ।
  • প্রমাণের শক্তি আলাদা করে পড়া যায়: LR = ১ মানে প্রমাণ কিছুই বলে না; LR > ১ পক্ষে, LR < ১ বিপক্ষে।
  • একাধিক প্রমাণ মানে গুণ: প্রমাণগুলো শর্তসাপেক্ষে স্বাধীন হলে LR-গুলো পরপর গুণ হয়; log নিলে যোগ। LR-এর log-কে বলে weight of evidence.

চিকিৎসায় এই রূপ বহুদিন ধরে ব্যবহৃত: একটি পরীক্ষার positive ফলের LR = sensitivity ÷ (1 − specificity). Sensitivity ০.৯০ আর specificity ০.৯৫ হলে LR = ০.৯০ ÷ ০.০৫ = ১৮; রোগীর আগের odds যা-ই হোক, positive ফল তাকে ১৮ গুণ করে।

Bayes factor — সহজ ভাষায়

অনুমান যখন একটি নির্দিষ্ট সংখ্যা নয়, একটি পুরো মডেল (যেমন “ফেরতের হার কোথাও ০ থেকে ১-এর মধ্যে, Beta prior অনুযায়ী”), তখন একই অনুপাতের নাম Bayes factor: দুটি মডেলের অধীনে পুরো ডেটার সম্ভাবনার অনুপাত। মানে একই: ডেটা prior odds-কে কত গুণ বদলাতে বলে। Harold Jeffreys ১৯৩৯ সালের বই Theory of Probability-তে এর ব্যবহার জনপ্রিয় করেন, আর Robert Kass ও Adrian Raftery-র ১৯৯৫ সালের একটি পরিচিত পর্যালোচনায় মোটামুটি এমন স্কেল দেওয়া হয়: ১ থেকে ৩ উল্লেখ করার মতোই নয়, ৩ থেকে ২০ ইতিবাচক, ২০ থেকে ১৫০ জোরালো, ১৫০-এর বেশি খুব জোরালো। স্কেলগুলো রীতি মাত্র; লেখকভেদে সীমা আলাদা।

B বনাম A: odds, গুণক আর সম্ভাবনা
ধাপ
গুণক (LR)
odds B:A
P(B)
log₁₀ odds
  1. Prior odds. B ০.৪০, A ০.৬০, তাই odds ০.৬৬৭ (২ : ৩)। log১০ নিলে −০.১৭৬: ঋণাত্মক মানে এখনো A-এর দিকে।
  2. প্রথম প্রমাণ, ভাঙা। LR = ০.০৫ ÷ ০.০২ = ২.৫. Odds ১.৬৬৭, সম্ভাবনা ০.৬২৫, টেবিলের হিসাবের সঙ্গে হুবহু। log-এ শুধু +০.৩৯৮ যোগ।
  3. দ্বিতীয় প্রমাণ, দেরি। ধরুন A-এর ১০% আর B-এর ৩০% পার্সেল দেরিতে পৌঁছায় (কাল্পনিক), আর এই পার্সেলটি দেরিতে এসেছে। LR = ০.৩০ ÷ ০.১০ = ৩. Odds ৫, সম্ভাবনা ৫ ÷ ৬ ≈ ০.৮৩৩.
  4. উল্টো ক্রম। আগে দেরি (× ৩ = ২, সম্ভাবনা ০.৬৬৭), পরে ভাঙা (× ২.৫ = ৫)। গুণে ক্রম বদলালে ফল বদলায় না, তাই শেষে আবার ০.৮৩৩.
  5. ভুল: একই প্রমাণ দুবার। “বাক্স থেঁতলানো” আর “জিনিস ভাঙা” আসলে একই ঘটনার দুই বিবরণ; দুটিকে আলাদা প্রমাণ ধরে আবার × ২.৫ করলে odds ১২.৫, সম্ভাবনা ০.৯২৬. বিশ্বাস বাড়ল, কিন্তু কোনো নতুন তথ্য আসেনি।

৪ · প্রমাণের পর প্রমাণ — ধারাবাহিক হালনাগাদ আর নির্ভরশীল প্রমাণের ফাঁদ

প্রমাণ সাধারণত একে একে আসে। Bayesian updating-এর নিয়ম সহজ: প্রতিটি প্রমাণের পর আজকের posterior হয়ে যায় কালকের prior.

P(H | E1, E2) ∝ P(E2 | H) · P(E1 | H) · P(H)

এই সরল গুণ টেকে একটি শর্তে: কুরিয়ার জানা থাকলে প্রমাণগুলো একে অন্যের সম্পর্কে নতুন কিছু বলে না, অর্থাৎ P(E2 | H, E1) = P(E2 | H). একে বলে conditional independence (পর্ব ৩৫-এ এক লাইনের পরিচয়)। শর্তটি থাকলে গুণের ক্রম বদলায় না বলে প্রমাণ কোন ক্রমে এল তাতে শেষ বিশ্বাস বদলায় না; সব প্রমাণ একসঙ্গে দেখা আর একটি একটি করে দেখা একই।

নিচের কোড সব হিসাব ভগ্নাংশে (fractions.Fraction) করে, যাতে গোলাকরণের ভুল না থাকে: সূত্রে, odds form-এ, দুই ক্রমে, আর একই প্রমাণ দুবার গুনে।

from fractions import Fraction as F

# কাল্পনিক হার: কোন কুরিয়ার কত ভাগ পার্সেল নেয়, আর প্রমাণের সম্ভাবনা
prior = {"A": F(6, 10), "B": F(4, 10)}
evidence = {                                 # P(প্রমাণ | কুরিয়ার)
    "damaged": {"A": F(2, 100), "B": F(5, 100)},
    "late":    {"A": F(10, 100), "B": F(30, 100)},
}

def bayes(p, e):
    joint = {c: p[c] * evidence[e][c] for c in p}   # prior × likelihood
    total = sum(joint.values())                     # evidence, P(E)
    return {c: joint[c] / total for c in p}, total

post, pE = bayes(prior, "damaged")
print("P(damaged) =", float(pE))
print("posterior  =", {c: round(float(v), 4) for c, v in post.items()})

odds = prior["B"] / prior["A"]               # odds form
lr = evidence["damaged"]["B"] / evidence["damaged"]["A"]
new = odds * lr
print(f"prior odds {float(odds):.4f} × LR {float(lr)} = {float(new):.4f}"
      f" → P(B) = {float(new / (1 + new)):.4f}")

for order in (["damaged", "late"], ["late", "damaged"]):
    p = dict(prior)
    for e in order:
        p, _ = bayes(p, e)
        print(f"  after {e:8s} P(B) = {p['B']} ≈ {float(p['B']):.4f}")
    print(order, "→ final", p["B"])

p = dict(prior)                              # ভুল: একই প্রমাণ দুবার গোনা
for e in ["damaged", "damaged", "late"]:
    p, _ = bayes(p, e)
print("double-counted damage → P(B) =", round(float(p["B"]), 4))

আসল আউটপুট (ব্রাউজারের Python):

P(damaged) = 0.032
posterior  = {'A': 0.375, 'B': 0.625}
prior odds 0.6667 × LR 2.5 = 1.6667 → P(B) = 0.6250
  after damaged  P(B) = 5/8 ≈ 0.6250
  after late     P(B) = 5/6 ≈ 0.8333
['damaged', 'late'] → final 5/6
  after late     P(B) = 2/3 ≈ 0.6667
  after damaged  P(B) = 5/6 ≈ 0.8333
['late', 'damaged'] → final 5/6
double-counted damage → P(B) = 0.9259

bayes() ফাংশনটি টেবিলের ছক হুবহু: প্রতিটি অনুমানে গুণ (joint), যোগ (total), ভাগ। সূত্র আর odds form দুটোই ০.৬২৫ দেয়। দুই ক্রমের মাঝের ধাপ আলাদা (৫/৮ বনাম ২/৩), কিন্তু শেষ ফল ঠিক ৫/৬; ভগ্নাংশে হিসাব বলে এটি গোলাকরণের কাকতাল নয়, হুবহু সমান। প্রতিটি ধাপে আগের p-ই নতুন prior, আর সেটিই ধারাবাহিক হালনাগাদ। শেষ লাইনে একই প্রমাণ দুবার ঢোকানোয় বিশ্বাস ০.৯২৬-এ উঠেছে: কোড কোনো error দেয়নি, কারণ ভুলটি গণিতের নয়, অনুমানের।

নির্ভরশীল প্রমাণকে স্বাধীন ধরার বিপদ

শেষ লাইনের ভুলটি বাস্তবে নানা ছদ্মবেশে আসে। পাঁচটি অনলাইন খবর একই সূত্র থেকে কপি করা হলে প্রমাণ একটি, পাঁচটি নয়; একই অভিযোগ ফোনে আর ইমেইলে এলে তা-ও একটি। এমন প্রমাণকে স্বাধীন ধরে LR গুণ করলে posterior অতিরিক্ত আত্মবিশ্বাসী হয়, প্রায়ই ০ বা ১-এর খুব কাছে। পর্ব ৩৫-এর ভাবনার প্রশ্নে আদালতের Sally Clark মামলায় এই ভুলের মানবিক দাম দেখেছেন। সমাধান: নির্ভরশীল প্রমাণকে একসঙ্গে একটি প্রমাণ হিসেবে মাপা, অর্থাৎ P(E1, E2 | H) সরাসরি অনুমান করা; অথবা নির্ভরতাটি মডেলে আঁকা, যা Bayesian network-এর কাজ (পর্ব ৫২)।

Naive Bayes-এর সেতু

এখন কল্পনা করুন প্রমাণ দুটি নয়, একটি SMS-এর প্রতিটি শব্দ: “অফার”, “জিতেছেন”, “লিংকে”. অনুমান দুটি: spam আর ham (সাধারণ বার্তা)। প্রতিটি শব্দের জন্য একটি likelihood, আর সব একসঙ্গে গুণ, ঠিক উপরের কোডের মতো। শ্রেণি জানা থাকলে শব্দগুলো স্বাধীন, এই অনুমানটিকে “naive” বা সরল বলা হয়, কারণ ভাষায় শব্দগুলো স্পষ্টতই নির্ভরশীল। তবু এই Naive Bayes classifier অনেক কাজে ভালো চলে, যদিও দ্বিগুণ গোনার কারণে তার সম্ভাবনা প্রায়ই অতিরিক্ত চরম। শত শত likelihood-এর গুণফল float-এ শূন্য হয়ে যায় (পর্ব ৩৫-এর underflow), তাই সেখানে log-এ যোগ করা হয়, stepper-এর log১০ odds-এর মতো। পুরো গল্প পরের পর্বে, পর্ব ৫১ (Naive Bayes — বাংলা SMS-কে spam না ham বলা)-এ।

৫ · অজানা হার নিজেই অনিশ্চিত — Beta prior আর binomial likelihood

এ পর্যন্ত অনুমান ছিল দুটি: A অথবা B. এবার বাজারঘরের একটি নতুন ব্লুটুথ হেডফোন। প্রশ্ন: এর ফেরতের হার θ (গ্রিক “থিটা”) কত? θ একটি সংখ্যা ০ থেকে ১-এর মধ্যে, যার সম্ভাব্য মান অসীম। প্রথম ৪০টি অর্ডারের ৭টি ফেরত এসেছে (কাল্পনিক)। ৪০টি অর্ডার কম, আর অন্য হেডফোনগুলোর অভিজ্ঞতা বলে ফেরত সাধারণত প্রায় ১০%. দুটি তথ্য মেলানোর পথ আবার Bayes, তবে এবার অনুমানের তালিকার বদলে একটি distribution.

Prior: Beta distribution. ০ থেকে ১-এর একটি অজানা হারের বিশ্বাস আঁকার স্বাভাবিক উপায় Beta(α, β), যার ঘনত্ব (পর্ব ৩৬-এর PDF) θα−1(1 − θ)β−1-এর সমানুপাতিক, আর গড় α / (α + β). এখানে α আর β দুটি ধনাত্মক parameter. Beta(1, 1) হলো সমতল, “সব হার সমান সম্ভব”; Beta(2, 18)-এর গড় ২ ÷ ২০ = ০.১০, আর মোটামুটি “আগে ২০টি অর্ডার দেখেছি, তার ২টি ফেরত” এমন বিশ্বাসের ওজন বহন করে। α আর β-কে তাই কল্পিত গণনা, pseudo-count, হিসেবে পড়া যায়।

Likelihood: binomial. θ জানা থাকলে n = ৪০টি অর্ডারে k = ৭টি ফেরতের সম্ভাবনা পর্ব ৩৬-এর binomial: C(n, k) θk(1 − θ)n−k. এখানে k আর n স্থির, θ বদলায়; তাই এটি θ-এর likelihood.

Posterior: গুণ করে দেখুন। ধ্রুবক বাদ দিলে

θα−1(1 − θ)β−1 × θk(1 − θ)n−k = θα+k−1(1 − θ)β+n−k−1
⇒ posterior = Beta(α + k, β + n − k)

Posterior আবার একটি Beta! এমন prior-কে বলে conjugate prior: likelihood-এর সঙ্গে গুণ করলে একই পরিবারে থাকে, তাই হালনাগাদ মানে শুধু দুটি সংখ্যায় যোগ। ফেরত এলে α-তে ১ যোগ, রাখলে β-তে ১ যোগ। আমাদের হেডফোনে Beta(2 + 7, 18 + 33) = Beta(9, 51).

অর্ডারের ধারা (R = ফেরত, K = রাখা)লাল = এই ধাপে নতুন

            
Posterior Beta(α, β)
α (ফেরত + prior)
β (রাখা + prior)
α + β
গড় α ÷ (α + β)
k / n (শুধু ডেটা)
  1. Prior Beta(2, 18). গড় ০.১০, যেন আগে ২০টি অর্ডারের অভিজ্ঞতা আছে। কোনো ডেটা নেই, তাই k/n সংজ্ঞায়িত নয়।
  2. প্রথম অর্ডার ফেরত। α-তে ১ যোগ: Beta(3, 18), গড় ৩ ÷ ২১ ≈ ০.১৪৩. শুধু ডেটা দেখলে হার ১০০%, যা হাস্যকর; prior এটিকে সংযত রাখে।
  3. দ্বিতীয়টি রাখা। β-তে ১ যোগ: Beta(3, 19), গড় ≈ ০.১৩৬. ডেটার হার এক লাফে ৫০%-এ নামল, posterior নড়ল সামান্য।
  4. তৃতীয়টিও রাখা। Beta(3, 20), গড় ≈ ০.১৩০. প্রতিটি নতুন অর্ডারের প্রভাব একটু একটু কমছে, কারণ α + β বাড়ছে।
  5. চতুর্থটি ফেরত। Beta(4, 20), গড় ≈ ০.১৬৭. ৪টিতে ২টি ফেরত বলে ডেটা ৫০% বলছে; posterior এখনো prior-এর দিকে টেনে রেখেছে।
  6. পরের ৬টি রাখা। Beta(4, 26), গড় ≈ ০.১৩৩. মোট ১০টিতে ২টি ফেরত (ডেটার হার ০.২০)। একসঙ্গে হিসাব করলেও Beta(2 + 2, 18 + 8) = Beta(4, 26): ধারাবাহিক আর একবারে হালনাগাদ একই।

Posterior mean-কে একটি ভারিত গড় হিসেবে লেখা যায়, যা prior-এর ভূমিকা স্পষ্ট করে:

(α + k) / (α + β + n) = w · α/(α + β) + (1 − w) · k/n,  w = (α + β) / (α + β + n)

হেডফোনে w = ২০ ÷ ৬০ = ১/৩: তাই posterior mean = ⅓ × ০.১০ + ⅔ × ০.১৭৫ = ০.১৫. Prior ২০টি কল্পিত অর্ডারের সমান ওজন পায়, ডেটা ৪০টি আসল অর্ডারের। এক-সংখ্যার উত্তরের চেয়ে বেশি কাজের পুরো posterior থেকে একটি পরিসর: ৯৫% credible interval, যার নিচে ২.৫% আর ওপরে ২.৫% সম্ভাবনা থাকে। এটি বের করে CDF-এর উল্টো, ppf (percent point function, পর্ব ৩৬)।

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

a0, b0 = 2, 18          # prior: আগের হেডফোনগুলোর মতো, গড় ফেরত ১০%
n, k = 40, 7            # নতুন হেডফোন: ৪০টি অর্ডার, ৭টি ফেরত (কাল্পনিক)
a1, b1 = a0 + k, b0 + n - k                  # conjugate update

theta = np.linspace(0, 0.5, 501)
prior = stats.beta.pdf(theta, a0, b0)
like = stats.binom.pmf(k, n, theta)
like = like / (like.sum() * (theta[1] - theta[0]))   # একই স্কেলে আঁকার জন্য
post = stats.beta.pdf(theta, a1, b1)

lo, hi = stats.beta.ppf([0.025, 0.975], a1, b1)
print(f"posterior = Beta({a1}, {b1})")
print(f"prior mean     = {a0 / (a0 + b0):.4f}")
print(f"MLE k/n        = {k / n:.4f}")
print(f"posterior mean = {a1 / (a1 + b1):.4f}")
print(f"95% credible interval = [{lo:.4f}, {hi:.4f}]")
print(f"P(theta > 0.20 | data) = {stats.beta.sf(0.20, a1, b1):.4f}")

fig, ax = plt.subplots(figsize=(6, 3.4))
ax.plot(theta, prior, "--", label="prior Beta(2, 18)")
ax.plot(theta, like, ":", lw=2, label="likelihood (scaled), 7 of 40")
ax.plot(theta, post, lw=2.2, label="posterior Beta(9, 51)")
ax.axvspan(lo, hi, alpha=0.15, color="C2", label="95% credible interval")
ax.set_xlabel("return rate theta")
ax.set_ylabel("density")
ax.set_title("Prior x likelihood -> posterior")
ax.legend(fontsize=8)
plt.tight_layout()
plt.show()

আসল আউটপুট (ব্রাউজারের Python, SciPy 1.18.0; নিচে ছবিও আসে):

posterior = Beta(9, 51)
prior mean     = 0.1000
MLE k/n        = 0.1750
posterior mean = 0.1500
95% credible interval = [0.0722, 0.2498]
P(theta > 0.20 | data) = 0.1398

ছবিতে তিনটি বক্ররেখা: ভাঙা দাগে prior (চূড়া প্রায় ০.০৫৬-এ, কারণ Beta(2, 18)-এর সবচেয়ে উঁচু বিন্দু (α − 1)/(α + β − 2) = ১/১৮), বিন্দু দাগে likelihood (চূড়া ঠিক ০.১৭৫-এ, ডেটার নিজের কথা), আর মোটা দাগে posterior, দুটির মাঝে, likelihood-এর বেশি কাছে কারণ ডেটার ওজন দ্বিগুণ। Likelihood θ-এর distribution নয়, তাই শুধু আঁকার জন্য স্কেল করা হয়েছে; আকৃতি বদলায়নি। Posterior প্রায় ১৪% সম্ভাবনা দেয় যে আসল হার ২০%-এর বেশি; “হেডফোনটি খারাপ” বলার আগে এই সংখ্যাটিই সিদ্ধান্তের কাজে লাগে (কত ঝুঁকি মেনে নেবেন, তা পর্ব ৫৪-এর বিষয়)।

৬ · Prior কতটা শক্ত — ৫, ৫০ আর ৫০০টি অর্ডার

Bayesian পদ্ধতির সবচেয়ে বড় সমালোচনা: “prior তো আপনার পছন্দ, তাহলে ফলও আপনার পছন্দ!” উত্তরটি সংখ্যায় দেখা ভালো। দুজন বিশ্লেষক একই পণ্য দেখছেন। প্রথমজন প্রায় কিছুই ধরে নেন না: দুর্বল prior Beta(1, 1). দ্বিতীয়জন জোর দিয়ে বিশ্বাস করেন হার প্রায় ১০%: শক্ত prior Beta(10, 90), যা ১০০টি কল্পিত অর্ডারের ওজন বহন করে। আসলে ফেরত আসছে ঠিক ২০% হারে। ৫, ৫০ আর ৫০০টি অর্ডারের পর তাঁদের posterior কোথায়?

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

priors = {"weak Beta(1, 1)": (1, 1), "strong Beta(10, 90)": (10, 90)}
data = [(5, 1), (50, 10), (500, 100)]      # (n, k): সবসময় ২০% ফেরত
theta = np.linspace(0, 0.5, 501)

fig, axes = plt.subplots(1, 3, figsize=(7.5, 2.8), sharey=True)
for ax, (n, k) in zip(axes, data):
    print(f"n = {n}, k = {k}, MLE = {k / n:.3f}")
    for name, (a, b) in priors.items():
        a1, b1 = a + k, b + n - k
        lo, hi = stats.beta.ppf([0.025, 0.975], a1, b1)
        print(f"   {name:20s} mean {a1 / (a1 + b1):.3f}"
              f"  95% CrI [{lo:.3f}, {hi:.3f}]")
        ax.plot(theta, stats.beta.pdf(theta, a1, b1), label=name)
    ax.axvline(0.2, color="gray", ls=":")
    ax.set_title(f"n = {n}")
    ax.set_xlabel("theta")
axes[0].set_ylabel("posterior density")
axes[0].legend(fontsize=7)
plt.tight_layout()
plt.show()

আসল আউটপুট (ব্রাউজারের Python; নিচে তিন ভাগের ছবি):

n = 5, k = 1, MLE = 0.200
   weak Beta(1, 1)      mean 0.286  95% CrI [0.043, 0.641]
   strong Beta(10, 90)  mean 0.105  95% CrI [0.054, 0.170]
n = 50, k = 10, MLE = 0.200
   weak Beta(1, 1)      mean 0.212  95% CrI [0.113, 0.331]
   strong Beta(10, 90)  mean 0.133  95% CrI [0.084, 0.192]
n = 500, k = 100, MLE = 0.200
   weak Beta(1, 1)      mean 0.201  95% CrI [0.167, 0.237]
   strong Beta(10, 90)  mean 0.183  95% CrI [0.153, 0.215]

৫টি অর্ডারে দুজনের উত্তর একেবারে আলাদা: দুর্বল prior-এ গড় ০.২৮৬ আর পরিসর ০.০৪৩ থেকে ০.৬৪১, মানে “প্রায় কিছুই জানি না”; শক্ত prior-এ গড় ০.১০৫, পরিসর সরু, কিন্তু আসল ০.২০ সেই পরিসরের বাইরে! ছোট নমুনায় শক্ত prior ভুল হলে তা আত্মবিশ্বাসের সঙ্গে ভুল বলে। ৫০টিতে দুটি কাছে আসছে, আর ৫০০টিতে দুজনের ৯৫% পরিসরই ০.২০-কে ধরে ফেলেছে; দুর্বল prior-এর গড় ০.২০১, শক্তটির ০.১৮৩. কারণ শক্ত prior-এর ওজন w = ১০০ ÷ (১০০ + n): n = ৫-এ ০.৯৫, n = ৫০০-এ মাত্র ০.১৭.

মূল ধারণা

বেশি ডেটায় prior-এর মত ধুয়ে যায়; কম ডেটায় prior-ই প্রায় পুরো উত্তর। তাই ছোট নমুনায় prior কোথা থেকে এল, তা লিখে জানানো বাধ্যতামূলক, আর একাধিক যুক্তিসঙ্গত prior দিয়ে ফল বদলায় কি না দেখা (sensitivity analysis) ভালো অভ্যাস।

৭ · দুটি পণ্যের তুলনা — posterior থেকে নমুনা, আর credible বনাম confidence interval

বাজারঘরের ক্রয় দল জানতে চায়: হেডফোন (৪০টিতে ৭টি ফেরত) কি ব্লুটুথ স্পিকারের (১৫০টিতে ১৮টি ফেরত) চেয়ে বেশি ফেরত আসে? কাঁচা হার ০.১৭৫ বনাম ০.১২০, কিন্তু হেডফোনের নমুনা ছোট। Bayesian উত্তর একটি সরাসরি সম্ভাবনা: P(θA > θB | ডেটা). দুটি Beta-র পার্থক্যের কোনো সহজ সূত্র নেই, কিন্তু দরকারও নেই: দুটি posterior থেকে অনেক নমুনা নিয়ে গুনে ফেলুন, যা পর্ব ৩৬-এর Monte Carlo.

import numpy as np
from scipy import stats

# কাল্পনিক ডেটা: দুটি পণ্যের অর্ডার আর ফেরত; prior দুটিরই Beta(1, 1)
nA, kA = 40, 7         # হেডফোন
nB, kB = 150, 18       # ব্লুটুথ স্পিকার
aA, bA = 1 + kA, 1 + nA - kA
aB, bB = 1 + kB, 1 + nB - kB

rng = np.random.default_rng(42)
S = 100_000
tA = rng.beta(aA, bA, S)               # posterior থেকে নমুনা
tB = rng.beta(aB, bB, S)
diff = tA - tB

print(f"raw rates: A {kA / nA:.3f}, B {kB / nB:.3f}")
print(f"posterior means: A {tA.mean():.4f}, B {tB.mean():.4f}")
print(f"P(theta_A > theta_B) ≈ {(tA > tB).mean():.4f}")
print(f"P(A is at least 5 points worse) ≈ {(diff > 0.05).mean():.4f}")
lo, hi = np.percentile(diff, [2.5, 97.5])
print(f"95% interval for theta_A - theta_B: [{lo:.4f}, {hi:.4f}]")

# যাচাই: Monte Carlo-র নিজের নড়াচড়া কত?
p = (tA > tB).mean()
print(f"Monte Carlo SE ≈ {np.sqrt(p * (1 - p) / S):.4f}")

# তুলনা: শুধু A-এর জন্য frequentist Wald CI আর Bayesian credible interval
se = np.sqrt(kA / nA * (1 - kA / nA) / nA)
print(f"A Wald 95% CI      : [{kA / nA - 1.96 * se:.4f}, {kA / nA + 1.96 * se:.4f}]")
print("A 95% credible int.:", np.round(stats.beta.ppf([0.025, 0.975], aA, bA), 4))

আসল আউটপুট (ব্রাউজারের Python, NumPy 2.4.6, seed 42):

raw rates: A 0.175, B 0.120
posterior means: A 0.1904, B 0.1250
P(theta_A > theta_B) ≈ 0.8412
P(A is at least 5 points worse) ≈ 0.5704
95% interval for theta_A - theta_B: [-0.0516, 0.2041]
Monte Carlo SE ≈ 0.0012
A Wald 95% CI      : [0.0572, 0.2928]
A 95% credible int.: [0.0882 0.3206]

Posterior-এর গড় কাঁচা হারের চেয়ে একটু বেশি (A ০.১৯০, B ০.১২৫), কারণ সমতল prior দুটি কল্পিত অর্ডার (একটি ফেরত, একটি রাখা) যোগ করে, যা ছোট নমুনার A-কে বেশি টানে। প্রায় ৮৪% সম্ভাবনায় হেডফোনের হার বেশি, কিন্তু পার্থক্যের ৯৫% পরিসর −০.০৫২ থেকে ০.২০৪, যা শূন্য পেরিয়ে যায়: “সম্ভবত বেশি, তবে নিশ্চিত নয়”. অন্তত ৫ শতাংশ-বিন্দু বেশি হওয়ার সম্ভাবনা প্রায় ৫৭%; Monte Carlo SE ০.০০১২ বলে ০.৮৪১-এর দ্বিতীয় দশমিক পর্যন্ত নিশ্চিন্তে ভরসা করা যায়, তৃতীয়টি ±০.০০২-এর মতো নড়তে পারে; শেষ দুই লাইন নিচের আলোচনার জন্য।

Credible interval বনাম confidence interval — সহজ ভাষায়

পর্ব ৩৭-এ confidence interval (CI) দেখেছেন, আর তার “৯৫%”-এর সঠিক অর্থ: পদ্ধতিটি বারবার নতুন নমুনায় চালালে প্রায় ৯৫% বার পরিসরটি আসল মান ধরবে। Credible interval সরাসরি সেই কথা বলে যা বেশিরভাগ মানুষ শুনতে চান: “আমার মডেল আর prior মেনে নিলে, θ এই পরিসরে আছে ৯৫% সম্ভাবনায়।” দাম হলো ঐ “মেনে নিলে”.

সংখ্যায় দুটি প্রায়ই কাছাকাছি, বিশেষ করে বড় নমুনা আর দুর্বল prior-এ। উপরের আউটপুটে ৪০টি অর্ডারে পার্থক্য চোখে পড়ে: Wald CI গড়ের দুই দিকে সমান দূরে (ছোট নমুনায় এর আসল coverage ৯৫%-এর কম হতে পারে বলে পরিসংখ্যানের সাহিত্যে বহুবার দেখানো হয়েছে), আর Beta posterior ডান দিকে একটু লম্বা, তাই পরিসরটি অসমান। কোনটি “ঠিক”, সেই বিতর্ক পর্ব ৩৭-এর ভাবনার প্রশ্নে আছে; রিপোর্টে কোনটি দিচ্ছেন তা নাম ধরে লিখুন, আর credible interval দিলে prior-টিও।

৮ · MLE, MAP আর Laplace-এর rule of succession

অনেক সময় পুরো posterior-এর বদলে একটি সংখ্যাই লাগে। তিনটি পরিচিত পছন্দ:

অনুমানকী সর্বোচ্চ বা গড়Beta–Binomial সূত্রহেডফোন (Beta(2, 18), ৭/৪০)
MLElikelihood সর্বোচ্চk / n৭ ÷ ৪০ = ০.১৭৫
MAPposterior-এর চূড়া(α + k − 1) / (α + β + n − 2)৮ ÷ ৫৮ ≈ ০.১৩৮
Posterior meanposterior-এর গড়(α + k) / (α + β + n)৯ ÷ ৬০ = ০.১৫০

MAP-এর সূত্রটি ভালো করে দেখুন: এটি ঠিক MLE, শুধু লবে α − 1টি কল্পিত ফেরত আর হরে α + β − 2টি কল্পিত অর্ডার যোগ করা। তাই বলা হয় MAP = MLE + pseudo-count. সমতল prior Beta(1, 1)-এ যোগ শূন্য, আর MAP হুবহু MLE; অর্থাৎ MLE হলো সমতল prior-এর MAP. Log নিলে MAP সর্বোচ্চ করে log likelihood + log prior; পরের Machine Learning কোর্সের অনেক regularization-কে এভাবে একটি prior-এর log হিসেবে পড়া যায়। তবে MAP শুধু চূড়া দেখে, পরিসর দেখে না।

Laplace-এর rule of succession

একটি নতুন পণ্য ৮টি অর্ডারে একটিও ফেরত আসেনি। MLE বলে θ = ০/৮ = ০: “এই পণ্য কখনো ফেরত আসবে না”. এটি স্পষ্টতই অতি-আত্মবিশ্বাস। সমতল Beta(1, 1) prior নিলে posterior mean হয়

P(পরের অর্ডার ফেরত | n-এ k) = (k + 1) / (n + 2)

৮-এ ০ হলে (০ + ১) ÷ (৮ + ২) = ০.১০. এটিই Laplace-এর rule of succession: “একটি সাফল্য আর একটি ব্যর্থতা আগেই দেখেছি” ধরে নেওয়া। Pierre-Simon Laplace ১৭৭৪ সালের একটি প্রবন্ধে এই ধারায় হিসাব করেন, আর ১৮১৪ সালের Essai philosophique sur les probabilités-এ সূর্য পরদিন ওঠার সম্ভাবনা নিয়ে তাঁর বিখ্যাত (আর বিতর্কিত) উদাহরণটি আছে বলে প্রচলিত। একই “১ যোগ করা”-র কৌশল পর্ব ৫১-এ Naive Bayes-এ Laplace smoothing নামে আসবে, যা না-দেখা শব্দের শূন্য সম্ভাবনা ঠেকায়।

Thomas Bayes (প্রায় ১৭০১–১৭৬১) ছিলেন একজন ইংরেজ Presbyterian যাজক। তাঁর মৃত্যুর পর বন্ধু Richard Price কাগজপত্রে একটি প্রবন্ধ পান এবং সম্পাদনা করে ১৭৬৩ সালে Royal Society-তে পেশ করেন; An Essay towards solving a Problem in the Doctrine of Chances নামে এটি Philosophical Transactions-এ ছাপা হয়। মজার ব্যাপার, প্রবন্ধটির মূল প্রশ্ন ছিল এই পর্বের পাঁচ নম্বর অংশের প্রশ্নই: অজানা একটি হারের ব্যাপারে, n বারে k সাফল্য দেখে কী বলা যায়, সমতল prior ধরে; একটি টেবিলে বল গড়ানোর কাল্পনিক পরীক্ষা দিয়ে তিনি তা ব্যাখ্যা করেন। Price-এর অবদান কতটা মৌলিক ছিল, তা নিয়ে ইতিহাসবিদদের মধ্যে আলোচনা আছে। আজকের সাধারণ রূপটি মূলত Laplace-এর, যিনি ১৭৭৪ সাল থেকে স্বাধীনভাবে একে “কারণের সম্ভাবনা” হিসেবে গড়ে তোলেন।

৯ · AI-তে Bayesian চিন্তা — কোথায় কাজে লাগে, আর কোথায় ভুল হয়

Bayes-এর উপপাদ্য AI-তে নানা রূপে আসে; এখানে শুধু পরিচয়।

Spam filter

প্রতিটি শব্দ একটি প্রমাণ, প্রতিটির LR spam বনাম ham. ১৯৯৮ সালে Mehran Sahami ও সহকর্মীদের একটি গবেষণা ইমেইলে এই পথ দেখায়, আর ২০০২ সালে Paul Graham-এর প্রবন্ধ “A Plan for Spam” একে ব্যাপক জনপ্রিয় করে। বাংলা SMS-এ নিজে বানাবেন পর্ব ৫১-এ।

চিকিৎসার পরীক্ষা

Pre-test probability (prior) × পরীক্ষার LR = post-test odds. একই positive ফল কম আর বেশি ঝুঁকির মানুষের ক্ষেত্রে আলাদা অর্থ বহন করে।

A/B test

দুটি পাতার রূপান্তরের হার দুটি Beta posterior; অংশ ৭-এর মতো সরাসরি “B ভালো হওয়ার সম্ভাবনা” রিপোর্ট করা যায়। Frequentist A/B test দেখেছেন পর্ব ৩৭-এ।

Calibration

Model “০.৯” বললে সত্যিই প্রায় ৯০% ঠিক হয় কি না, তা-ই calibration. প্রশিক্ষণের আর আজকের base rate আলাদা হলে Bayes দিয়ে সম্ভাবনা সংশোধন করা যায়।

দুটি উন্নত রূপের নাম শুধু জেনে রাখুন। Bayesian optimization একটি দামি ফাংশন, যেমন একটি মডেলের hyperparameter বনাম validation score, সম্পর্কে একটি অনিশ্চিত মডেল রাখে আর ঠিক করে পরের কোন বিন্দু পরীক্ষা করা সবচেয়ে লাভজনক; ২০১২ সালে Jasper Snoek ও সহকর্মীদের একটি প্রবন্ধ Machine Learning-এ এর ব্যবহার পরিচিত করে। Bayesian deep learning neural network-এ অনিশ্চয়তা রাখার চেষ্টা, যাতে model অচেনা ইনপুটে “জানি না” বলতে পারে; এটি সক্রিয় গবেষণার বিষয়, আর এর নির্ভরযোগ্যতা নিয়ে মতভেদ আছে। দুটিই পরের Machine Learning আর Deep Learning কোর্সে আসবে।

সাধারণ ভুল

  • Prior-এর অপব্যবহার: ডেটা দেখার পর এমন prior বাছা যাতে কাঙ্ক্ষিত উত্তর আসে। প্রতিকার: ডেটা দেখার আগে prior লিখে রাখা, তার উৎস জানানো, আর দুই-তিনটি যুক্তিসঙ্গত prior দিয়ে ফল দেখানো (অংশ ৬)।
  • Base rate উপেক্ষা: শুধু likelihood দেখে সিদ্ধান্ত। ৯৯% নির্ভুল পরীক্ষাও দুর্লভ ঘটনায় বেশিরভাগ সময় ভুল সতর্কবার্তা দেয় (পর্ব ৩৫-এর base-rate fallacy).
  • P(E | H) আর P(H | E) গুলিয়ে ফেলা: আদালতে একে prosecutor's fallacy বলা হয়; “নির্দোষ হলে এমন প্রমাণ দুর্লভ” মানে “নির্দোষ হওয়া দুর্লভ” নয়। বিস্তারিত পর্ব ৩৫-এ।
  • ০ বা ১ prior: P(H) = ০ দিলে কোনো প্রমাণেই posterior বাড়ে না, কারণ গুণফল শূন্যই থাকে। তাই Cromwell's rule-এর পরামর্শ: নিশ্চিত না হলে নিশ্চিত সংখ্যা দেবেন না।
  • ভুল likelihood: Binomial ধরে নেয় প্রতিটি অর্ডার স্বাধীন আর একই হারের। একটি ত্রুটিপূর্ণ চালানের হেডফোন একসঙ্গে ফেরত এলে তা ভাঙে, আর posterior ভুল মডেলের ওপর দাঁড়ায়।
  • নির্ভরশীল প্রমাণ দুবার গোনা: অংশ ৪-এর ০.৮৩৩ থেকে ০.৯২৬; Naive Bayes-এর অতিরিক্ত চরম সম্ভাবনার মূলেও এটি।

১০ · AI-এর যুগে — AI assistant-এর Bayesian হিসাব যাচাই

AI assistant Bayes-এর সূত্র নির্ভুলভাবে লিখতে পারে, কিন্তু সংখ্যা বসাতে গিয়ে প্রায়ই ছোট ছোট ভুল করে: হরের evidence বাদ দেয়, P(E | H) আর P(H | E) উল্টে ফেলে, বা SciPy-র parameter-এর অর্থ গুলিয়ে ফেলে। আত্মবিশ্বাসী ভাষায় লেখা ভুল সংখ্যা সহজে চোখে পড়ে না।

AI যা প্রায়ই করেকীভাবে ধরবেন
Posterior-এর যোগফল ১ হয় না, কারণ evidence দিয়ে ভাগ বাদ পড়েছেপ্রতিটি posterior তালিকার যোগফল ছাপিয়ে দেখুন
Beta update-এ α আর β উল্টে ফেলে (ফেরত β-তে যোগ)Posterior mean কাঁচা হার k/n-এর দিকে সরল কি না দেখুন; ছোট উদাহরণ হাতে মেলান
দুটি posterior-এর গড় তুলনা করে “B ভালো” বলে দেয়, অনিশ্চয়তা ছাড়াPosterior sampling দিয়ে P(θA > θB) আর পার্থক্যের পরিসর চান
Credible interval-কে confidence interval বলে, বা উল্টোকোন পদ্ধতি, কোন prior, তা রিপোর্টে নাম ধরে লেখান
কোনো prior না বলে চুপচাপ সমতল prior ধরে, বা ডেটা দেখে prior বাছেPrior আর তার উৎস আলাদা লাইনে লেখান; অন্তত একটি বিকল্প prior-এ ফল দেখুন
অনেক প্রমাণের likelihood সরাসরি গুণ করে, স্বাধীনতা যাচাই করে না, ফল 0.0 এলে চুপ থাকেপ্রমাণগুলো কেন শর্তসাপেক্ষে স্বাধীন, তা জিজ্ঞেস করুন; log-এ যোগ করুন

নিচের prompt-এ শর্তগুলো স্পষ্ট, আর উত্তরের সঙ্গে নিজের যাচাইয়ের ব্যবস্থাও চাওয়া হয়েছে। আসল গ্রাহক বা অর্ডারের তথ্য পেস্ট করবেন না; শুধু সংখ্যা (n, k) আর কলামের নামই যথেষ্ট।

আমার দুটি পণ্যের ফেরতের ডেটা: পণ্য A-তে n=40 অর্ডারে k=7 ফেরত, পণ্য B-তে n=150-এ k=18. Python 3, NumPy 2.x আর SciPy 1.18 দিয়ে কোড লেখো যা: ১. প্রতিটি পণ্যের জন্য Beta(1, 1) prior থেকে conjugate update করে posterior-এর α, β, mean আর scipy.stats.beta.ppf দিয়ে ৯৫% equal-tailed credible interval ছাপাবে। ২. np.random.default_rng(42) দিয়ে প্রতিটি posterior থেকে 100000 নমুনা নিয়ে P(theta_A > theta_B) আর পার্থক্যের ৯৫% পরিসর দেবে, সঙ্গে Monte Carlo standard error. ৩. একই হিসাব Beta(10, 90) prior দিয়ে আবার করবে, আর দুই prior-এর ফল পাশাপাশি দেখাবে। ৪. Credible interval আর confidence interval-এর পার্থক্য দুই লাইনে লিখবে, কিন্তু কোনো ব্যবসায়িক সিদ্ধান্ত দেবে না। ৫. কোনো deprecated API (যেমন global np.random.seed) ব্যবহার করবে না, আর কোথাও অনুমান থাকলে comment-এ লিখবে।

AI-এর Bayesian উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

আরও গভীরে: Beta–Binomial একমাত্র conjugate জোড়া নয়: Poisson ডেটায় (ঘণ্টায় অর্ডার) Gamma prior, অজানা গড়ের normal ডেটায় normal prior, আর বহু শ্রেণির গণনায় Dirichlet–Multinomial, যা Naive Bayes-এর smoothing-এর পেছনের গণিত। Conjugate না হলে posterior-এর সূত্র মেলে না; তখন Markov chain Monte Carlo (Metropolis ও সহকর্মীরা ১৯৫৩, Hastings ১৯৭০) বা variational inference দিয়ে posterior থেকে নমুনা নেওয়া বা আন্দাজ করা হয়, যা PyMC বা Stan-এর মতো library-র কাজ। “কোনো তথ্য নেই” বোঝাতে Beta(1, 1) ছাড়াও Jeffreys prior Beta(½, ½) ব্যবহৃত হয়; কোন prior সত্যিই “তথ্যহীন”, এ প্রশ্নের একক উত্তর নেই।

পরীক্ষা ও ইন্টারভিউতে:

  • P(H) = 0.2, P(E | H) = 0.9, P(E | ¬H) = 0.3 হলে P(H | E)? ০.১৮ ÷ (০.১৮ + ০.২৪) = ০.১৮ ÷ ০.৪২ ≈ ০.৪২৯.
  • Prior odds ১ : ৪, likelihood ratio ৮ হলে posterior সম্ভাবনা? Odds ০.২৫ × ৮ = ২, সম্ভাবনা ২ ÷ ৩ ≈ ০.৬৬৭.
  • Beta(2, 8) prior, ১০টিতে ৩টি সাফল্য: posterior আর তার গড়? Beta(5, 15), গড় ৫ ÷ ২০ = ০.২৫.
  • Conjugate prior কী আর কেন কাজের? Likelihood-এর সঙ্গে গুণ করলে posterior একই পরিবারে থাকে; হালনাগাদ শুধু parameter-এ যোগ, কোনো integral লাগে না।
  • MAP আর MLE কখন সমান? Prior সমতল হলে (যেমন Beta(1, 1)); আর ডেটা অনেক বাড়লে দুটি কাছাকাছি চলে আসে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Bayes-এর প্রবন্ধ ১৭৬৩ সালে ছাপা হয়েছিল, অথচ “Bayesian” পদ্ধতি পরিসংখ্যানের মূলধারায় ফেরে বিংশ শতাব্দীর শেষ দিকে। প্রায় দুই শতাব্দী ধরে এটি কেন বিতর্কিত ছিল, আর কী বদলাল?

Laplace-এর হাতে উনিশ শতকের শুরুতে “inverse probability”, অর্থাৎ প্রমাণ থেকে কারণের সম্ভাবনা, বিজ্ঞানের একটি স্বাভাবিক হাতিয়ার ছিল; তিনি একে জ্যোতির্বিজ্ঞান থেকে জন্মহারের পরিসংখ্যান পর্যন্ত ব্যবহার করেন। সমস্যা দেখা দেয় prior নিয়ে। কিছু জানা না থাকলে Laplace সমান সম্ভাবনা ধরতেন, কিন্তু “সমান” কোন মাপে? একটি হারকে সমতল ধরলে তার বর্গ আর সমতল থাকে না, তাই “অজ্ঞতা” প্রকাশের একটি একক উপায় নেই। উনিশ শতকের মাঝামাঝি থেকে George Boole ও John Venn-এর মতো লেখকেরা এই ব্যবহারের সমালোচনা করেন।

বিংশ শতাব্দীর শুরুতে Ronald Fisher, আর পরে Jerzy Neyman ও Egon Pearson, এমন পরিসংখ্যান গড়েন যাতে prior লাগে না: likelihood, p-value, confidence interval. Fisher inverse probability-কে কড়া ভাষায় প্রত্যাখ্যান করেন, আর কয়েক দশক ধরে এই frequentist ধারাই মূলধারা হয়। তবু অন্য ধারাটি টিকে থাকে: Harold Jeffreys-এর ১৯৩৯ সালের বই, Bruno de Finetti আর Leonard Savage-এর ব্যক্তিগত সম্ভাবনার তত্ত্ব। পরিসংখ্যানের ইতিহাসবিদ Stephen Fienberg-এর একটি লেখা অনুযায়ী “Bayesian” শব্দটিই ব্যাপকভাবে ব্যবহৃত হতে শুরু করে বিংশ শতাব্দীর মাঝামাঝিতে।

বড় বাধা ছিল হিসাব। Beta–Binomial-এর মতো conjugate জোড়া ছাড়া posterior-এর integral প্রায়ই হাতে করা অসম্ভব। ১৯৯০ সালের দিকে Alan Gelfand ও Adrian Smith-এর একটি প্রভাবশালী প্রবন্ধ পরিসংখ্যানবিদদের দেখায় কীভাবে Markov chain Monte Carlo দিয়ে কম্পিউটারে posterior থেকে নমুনা নেওয়া যায়, আর BUGS-এর মতো সফটওয়্যার তা সহজ করে। অংশ ৭-এ যা করেছেন, posterior থেকে নমুনা নিয়ে গোনা, সেটিই এই বিপ্লবের সারকথা।

আজ বিতর্ক অনেক শান্ত। বেশিরভাগ ব্যবহারিক পরিসংখ্যানবিদ দুই ধারাই ব্যবহার করেন, প্রশ্ন বুঝে। তবে prior-এর বিষয়ীতা নিয়ে আপত্তিটি পুরোপুরি যায়নি, আর যাওয়ার কথাও নয়: এটি মনে করিয়ে দেয় যে prior লিখে জানাতে হয়।

মূল উপলব্ধি: Bayesian পদ্ধতির দুর্বলতা ছিল দুটি, prior-এর বিষয়ীতা আর হিসাবের কাঠিন্য; কম্পিউটার দ্বিতীয়টি অনেকটাই সমাধান করেছে, আর প্রথমটির সমাধান হলো স্বচ্ছতা আর sensitivity analysis.

প্র ০২দ্বিতীয় বিশ্বযুদ্ধে Bletchley Park-এ Alan Turing প্রমাণের শক্তি মাপতে “ban” নামের একটি একক ব্যবহার করেছিলেন বলে জানা যায়। Likelihood ratio-র log নেওয়া কেন এত কাজের, আর আধুনিক AI-তে এর ছাপ কোথায়?

Turing-এর সহকর্মী গণিতবিদ I. J. Good-এর পরের লেখা অনুযায়ী, Enigma-র বার্তা ভাঙার একটি পদ্ধতিতে (Banburismus) Turing প্রতিটি সূত্রকে একটি likelihood ratio হিসেবে দেখতেন, আর তার ১০-ভিত্তিক log-কে “ban” বলতেন; এক-দশমাংশ “deciban”. প্রচলিত বিবরণ অনুযায়ী নামটি এসেছে Banbury শহর থেকে, যেখানে এই কাজের বিশেষ কাগজ ছাপা হতো। খুঁটিনাটি গোপনীয়তার কারণে বহু বছর প্রকাশিত হয়নি, তাই কিছু বিবরণ সতর্কভাবে নেওয়াই ভালো।

কেন log? অংশ ৩-এর stepper মনে করুন। Odds form-এ প্রতিটি প্রমাণ odds-কে গুণ করে; log নিলে প্রতিটি প্রমাণ শুধু একটি সংখ্যা যোগ করে: −০.১৭৬ থেকে শুরু, ভাঙায় +০.৩৯৮, দেরিতে +০.৪৭৭. যোগ মানুষের মাথায় গুণের চেয়ে সহজ, ক্রম বদলালে যোগফল বদলায় না, আর বিপক্ষের প্রমাণ শুধু ঋণাত্মক সংখ্যা। একজন বিশ্লেষক বলতে পারেন: “এই সূত্রটি ২ deciban দিল, ওটি ৫; সিদ্ধান্তের জন্য মোট ২০ লাগবে।” দ্বিতীয় সুবিধা সংখ্যার: অনেক ছোট সম্ভাবনার গুণ underflow করে শূন্য হয় (পর্ব ৩৫), যোগ করে না।

আধুনিক AI-তে এই চিন্তা সর্বত্র। Naive Bayes প্রতিটি শব্দের log likelihood ratio যোগ করে, ঠিক Turing-এর পদ্ধতির মতো। Logistic regression (পর্ব ৫৯) সরাসরি log-odds-কে বৈশিষ্ট্যগুলোর ভারিত যোগফল হিসেবে মডেল করে; প্রতিটি weight-কে “এই বৈশিষ্ট্য কত weight of evidence দেয়” হিসেবে পড়া যায়। Neural network-এর শেষ স্তরের “logit”-ও একটি log-odds. ক্রস-এনট্রপি loss (পর্ব ৩৮) আসলে সঠিক উত্তরের log probability-র ঋণাত্মক।

তবে যোগের সরলতা একটি অনুমানের ওপর দাঁড়ানো: প্রমাণগুলো শর্তসাপেক্ষে স্বাধীন। নির্ভরশীল সূত্রের deciban যোগ করলে অংশ ৪-এর দ্বিগুণ গোনার ভুল হয়।

মূল উপলব্ধি: Likelihood ratio-র log প্রমাণকে যোগযোগ্য একক বানায়; এই ধারণা Bletchley Park থেকে আজকের logistic regression আর logit পর্যন্ত বিস্তৃত, আর তার শর্তও একই: প্রমাণ সত্যিই আলাদা কিনা।

প্র ০৩“Cromwell's rule” বলে, নিশ্চিত না হলে কোনো সম্ভাবনা ঠিক ০ বা ১ দেবেন না। এই পরামর্শ AI system নকশায় কোথায় কোথায় দেখা যায়?

নামটি দিয়েছেন পরিসংখ্যানবিদ Dennis Lindley, Oliver Cromwell-এর ১৬৫০ সালের একটি চিঠির বিখ্যাত বাক্য থেকে, যেখানে তিনি স্কটল্যান্ডের চার্চের নেতাদের অনুরোধ করেন ভেবে দেখতে যে তাঁরা ভুলও হতে পারেন। গণিতটি সরল: posterior ∝ likelihood × prior. Prior শূন্য হলে likelihood যত বড়ই হোক, গুণফল শূন্য। অর্থাৎ যে অনুমানকে শুরুতেই অসম্ভব ধরেছেন, কোনো প্রমাণেই তা আর সম্ভব হবে না। Prior ১ হলে উল্টোটা: বিকল্পগুলোর সম্ভাবনা চিরকাল শূন্য।

AI-তে এর সবচেয়ে চেনা রূপ শূন্য গণনা। অংশ ৮-এ ৮টি অর্ডারে একটিও ফেরত না দেখে MLE θ = ০ বলেছিল। Naive Bayes-এ কোনো শব্দ প্রশিক্ষণের spam বার্তায় একবারও না এলে P(শব্দ | spam) = ০, আর সেই শব্দওয়ালা প্রতিটি নতুন বার্তা spam হওয়ার সম্ভাবনা শূন্য পায়, বাকি সব প্রমাণ যা-ই বলুক। Laplace smoothing এটিই ঠেকায়। ভাষা model-এ n-gram-এর যুগে না-দেখা শব্দক্রমের জন্য নানা smoothing কৌশল (যেমন Kneser–Ney) এই সমস্যার উত্তর ছিল; পর্ব ৫৩-এ Markov chain দিয়ে লেখা তৈরিতে এর ছায়া দেখবেন।

দ্বিতীয় রূপ log loss. পর্ব ৩৮-এ দেখেছেন, model সঠিক শ্রেণিকে ঠিক ০ সম্ভাবনা দিলে log loss অসীম হয়; তাই library-গুলো সাধারণত সম্ভাবনাকে ০ আর ১ থেকে সামান্য দূরে কেটে রাখে। তৃতীয় রূপ নকশার সিদ্ধান্তে: নিয়মভিত্তিক filter যদি কোনো প্রেরককে “কখনো spam নয়” তালিকায় রাখে, তাহলে সেই অ্যাকাউন্ট হ্যাক হলেও system তা ধরবে না।

তবে নিয়মটিকে অন্ধভাবে খাটানো যায় না। যৌক্তিকভাবে অসম্ভব জিনিস (একটি অর্ডার একই সঙ্গে A আর B কুরিয়ারে) শূন্যই পায়। আর কখনো খুব ছোট সম্ভাবনাকে কার্যত শূন্য ধরে নেওয়া হিসাবের সুবিধার জন্য ঠিক, যদি মনে রাখেন যে এটি একটি অনুমান।

মূল উপলব্ধি: শূন্য সম্ভাবনা শেখার দরজা বন্ধ করে দেয়; যেখানেই ডেটা কম, সেখানে pseudo-count বা smoothing দিয়ে অন্তত একটি ছোট ফাঁক খোলা রাখুন।

প্র ০৪Naive Bayes-এর স্বাধীনতার অনুমান প্রায় সবসময় ভুল, তবু এটি অনেক কাজে ভালো classifier. এটি কীভাবে সম্ভব, আর এর দেওয়া সম্ভাবনাকে কতটা বিশ্বাস করা উচিত?

বাংলা SMS-এ “অভিনন্দন” আর “জিতেছেন” প্রায়ই একসঙ্গে আসে; শ্রেণি জানা থাকলেও একটি অন্যটি সম্পর্কে তথ্য দেয়। Naive Bayes তবু দুটির likelihood ratio আলাদাভাবে গুণ করে, যেন দুটি স্বাধীন সাক্ষী। অংশ ৪-এ দেখেছেন এর ফল: একই প্রমাণ কার্যত দুবার গোনা হয়, আর posterior চরমের দিকে সরে যায়। শত শত শব্দে এই প্রভাব জমে, তাই Naive Bayes প্রায়ই ০.৯৯৯৯ বা ০.০০০১-এর মতো সম্ভাবনা দেয়, যেখানে আসল অনিশ্চয়তা অনেক বেশি।

তবু শ্রেণিবিভাগ প্রায়ই ঠিক থাকে। Pedro Domingos ও Michael Pazzani-র ১৯৯৭ সালের একটি পরিচিত বিশ্লেষণ দেখায়, classification-এর জন্য দরকার শুধু সঠিক শ্রেণিটি সবচেয়ে বেশি score পাওয়া; সম্ভাবনার মান ভুল হলেও ক্রম ঠিক থাকতে পারে, আর অনেক ধরনের নির্ভরতায় এমনটাই ঘটে। কম ডেটায় এর সরলতা একটি সুবিধাও: প্রতিটি শব্দের জন্য শুধু দুটি গণনা লাগে, তাই অল্প উদাহরণেই প্রশিক্ষণ হয়, আর overfitting-এর সুযোগ কম।

ব্যবহারিক শিক্ষা তিনটি। প্রথমত, Naive Bayes-এর সংখ্যাকে ক্রম হিসেবে নিন, সঠিক সম্ভাবনা হিসেবে নয়; “০.৯৯৯৯ নিশ্চিত spam” কথাটি সাধারণত অতিরঞ্জন। দ্বিতীয়ত, সম্ভাবনা দরকার হলে (যেমন খরচ-ভিত্তিক সিদ্ধান্তে, পর্ব ৫৪) আলাদা ডেটায় calibrate করুন, যেমন isotonic regression বা Platt scaling দিয়ে, যা পরের Machine Learning কোর্সে আসবে। তৃতীয়ত, স্পষ্টভাবে নির্ভরশীল বৈশিষ্ট্য (একই শব্দের দুটি বানান, বা একটি বৈশিষ্ট্য আর তার কপি) আগেই মিলিয়ে ফেলুন।

এই প্রশ্নটি একটি বড় সত্যও দেখায়: একটি model-এর অনুমান ভুল হলেও তা কাজের হতে পারে, কিন্তু তখন তার কোন output বিশ্বাসযোগ্য আর কোনটি নয়, তা আলাদা করে জানতে হয়।

মূল উপলব্ধি: নির্ভরশীল প্রমাণকে স্বাধীন ধরলে শ্রেণির ক্রম প্রায়ই টিকে যায়, কিন্তু সম্ভাবনা অতিরিক্ত চরম হয়; সিদ্ধান্ত সম্ভাবনার মানের ওপর নির্ভর করলে আগে calibration যাচাই করুন।

প্র ০৫একটি নতুন checkout পাতার A/B test-এ এক দল বলছে “p-value দেখি”, আরেক দল বলছে “P(নতুন পাতা ভালো) দেখি”. দুটি পথের সুবিধা ও বিপদ কী, আর prior কে ঠিক করবে?

Frequentist পথে (পর্ব ৩৭) প্রশ্ন হলো: “পার্থক্য সত্যিই না থাকলে এত বড় বা আরও বড় পার্থক্য দেখার সম্ভাবনা কত?” এর উত্তর p-value, যা অনেক ম্যানেজার ভুল করে “নতুন পাতা ভালো না হওয়ার সম্ভাবনা” হিসেবে পড়েন। Bayesian পথে অংশ ৭-এর মতো দুটি Beta posterior থেকে সরাসরি P(θনতুন > θপুরোনো | ডেটা) আর পার্থক্যের পরিসর রিপোর্ট করা যায়, যা ব্যবসার প্রশ্নের কাছাকাছি। আরও এক ধাপ এগিয়ে “ভুল পাতা বাছলে প্রত্যাশিত ক্ষতি কত” হিসাব করা যায়, যা পর্ব ৫৪-এর expected utility-র সঙ্গে মেলে।

বিপদ দুই দিকেই। Frequentist test-এ বারবার ফল দেখে “significant হলেই থামি” করলে ভুল-positive-এর হার প্রতিশ্রুত ৫%-এর অনেক বেশি হয়; এটি সুপরিচিত। Bayesian পদ্ধতি নিয়ে প্রায়ই বলা হয় এতে বারবার দেখা নিরাপদ, কিন্তু বিষয়টি সূক্ষ্ম: posterior-এর ব্যাখ্যা সৎ থাকে যদি prior আর মডেল সঠিক হয়, তবে “P > ০.৯৫ হলেই থামি” নিয়মের দীর্ঘমেয়াদি ভুলের হার নিয়ন্ত্রিত নয়, আর এ নিয়ে পরিসংখ্যানবিদদের মধ্যে আলোচনা চলছে।

Prior কে ঠিক করবে? ভালো চর্চা হলো test শুরুর আগে, ডেটা দেখার আগে, অতীতের test থেকে লিখে রাখা: যেমন “আগের ২০টি পাতা-বদলের রূপান্তরের হার মোটামুটি ২% থেকে ৪%”. অংশ ৬ দেখিয়েছে, হাজার হাজার দর্শক এলে যুক্তিসঙ্গত prior-গুলোর ফল প্রায় এক; কিন্তু অল্প দর্শকে prior-ই সিদ্ধান্ত চালায়, তাই তখন প্রশ্নটি সবচেয়ে জরুরি। Prior ডেটা দেখার পর বদলানো, এটিই সবচেয়ে বড় অসততা।

দুই পথই সৎভাবে চালানো যায়: নমুনার আকার আগে ঠিক করা, একটি প্রধান metric, আর সব ফল রিপোর্ট করা। পদ্ধতির নাম নয়, এই শৃঙ্খলাই বিশ্বাসযোগ্যতা আনে।

মূল উপলব্ধি: Bayesian A/B test সরাসরি “কতটা সম্ভাবনায় ভালো” বলে, frequentist test পদ্ধতির ভুলের হার নিয়ন্ত্রণ করে; দুটিতেই আগে থেকে পরিকল্পনা, লিখে রাখা prior আর সৎ রিপোর্টিং ছাড়া ফল ভরসার নয়।

অনুশীলন

হাতে হিসাব, কোড, সমালোচনা আর আউটপুট অনুমান; প্রতিটির উত্তর নিচে লুকানো আছে।

  1. তিনটি কুরিয়ার (হাতে হিসাব): বাজারঘর তিনটি কুরিয়ার ব্যবহার করে (কাল্পনিক): A ৫০% পার্সেল নেয় আর ১% ভাঙে, B ৩০% নেয় আর ৩% ভাঙে, C ২০% নেয় আর ৬% ভাঙে। একটি পার্সেল ভাঙা এসেছে। (ক) প্রতিটি কুরিয়ারের posterior কত? (খ) C বনাম B-এর জন্য prior odds, likelihood ratio আর posterior odds বের করে (ক)-এর সঙ্গে মিলিয়ে দেখান।

    (ক) প্রতিটি কুরিয়ারে prior × likelihood: A ০.৫ × ০.০১ = ০.০০৫, B ০.৩ × ০.০৩ = ০.০০৯, C ০.২ × ০.০৬ = ০.০১২. Evidence = ০.০২৬. Posterior: A ০.০০৫ ÷ ০.০২৬ ≈ ০.১৯২, B ≈ ০.৩৪৬, C ≈ ০.৪৬২ (যোগফল ১)। সবচেয়ে কম পার্সেল নেওয়া C-ই এখন সবচেয়ে সম্ভাব্য।

    (খ) Prior odds C : B = ০.২ ÷ ০.৩ ≈ ০.৬৬৭; LR = ০.০৬ ÷ ০.০৩ = ২; posterior odds = ০.৬৬৭ × ২ ≈ ১.৩৩৩. (ক) থেকে ০.৪৬২ ÷ ০.৩৪৬ ≈ ১.৩৩৩, হুবহু মেলে। খেয়াল করুন, তিন অনুমানের মধ্যে দুটির odds বের করতে A-এর কোনো সংখ্যা লাগেনি, evidence-ও না।

  2. একে একে বনাম একবারে (কোড): একটি Python ফাংশন লিখুন যা Beta(2, 18) prior থেকে শুরু করে ০/১-এর একটি তালিকা (১ = ফেরত) একটি একটি করে হালনাগাদ করে। তালিকা [1, 0, 0, 1, 0, 0, 0, 0, 0, 0]-এ সাধারণ ক্রম, উল্টো ক্রম আর একবারে হিসাব তিনটি মিলিয়ে দেখান, আর শেষ posterior-এর গড় ও ৯৫% credible interval ছাপান।
    from scipy import stats
    
    obs = [1, 0, 0, 1, 0, 0, 0, 0, 0, 0]       # 1 = ফেরত, 0 = রাখা
    def seq(order, a=2, b=18):
        for x in order:
            a, b = a + x, b + (1 - x)
        return a, b
    
    print("sequential:", seq(obs))
    print("reversed  :", seq(obs[::-1]))
    k, n = sum(obs), len(obs)
    print("batch     :", (2 + k, 18 + n - k))
    a, b = seq(obs)
    print("mean", round(a / (a + b), 4), "95% CrI", stats.beta.ppf([0.025, 0.975], a, b).round(4))

    সত্যিকারের run (desktop Python 3.14.4, SciPy 1.18.0):

    sequential: (4, 26)
    reversed  : (4, 26)
    batch     : (4, 26)
    mean 0.1333 95% CrI [0.0389 0.2735]

    তিনটি পথেই Beta(4, 26), যা অংশ ৫-এর stepper-এর শেষ ধাপ। যোগ ক্রম মানে না বলে ধারাবাহিক হালনাগাদের ক্রমও কিছু বদলায় না। মাত্র ১০টি অর্ডারে পরিসর বেশ চওড়া: ০.০৩৯ থেকে ০.২৭৪.

  3. সমালোচনা ও নতুন নকশা: একজন বিশ্লেষক রিপোর্টে লিখেছেন: “নতুন রাইস কুকারের প্রথম ৬টি অর্ডারের ২টি ফেরত। আমি Beta(1, 30) prior নিয়েছি, কারণ এতে ফল সুন্দর আসে, আর posterior mean মাত্র ৮%, তাই চিন্তার কিছু নেই। বিক্রেতার রিভিউ পাতায় ‘ভাঙা এসেছে’ আর ‘কাজ করে না’ দুটি অভিযোগ আলাদা প্রমাণ হিসেবে গুণ করেছি। ৯৫% confidence interval [০.০২, ০.২০], তাই ৯৫% নিশ্চিত হার ২০%-এর কম।” কী কী ভুল, আর আপনি বিশ্লেষণটি কীভাবে সাজাবেন?
    • Prior বাছা হয়েছে ফল দেখে: “ফল সুন্দর আসে” কোনো যুক্তি নয়। Beta(1, 30) মানে ৩১টি কল্পিত অর্ডারে প্রায় ০টি ফেরত, যা ৬টি আসল অর্ডারকে চাপা দেয়: posterior Beta(3, 34), গড় ৩ ÷ ৩৭ ≈ ০.০৮১. সমতল prior-এ Beta(3, 5), গড় ০.৩৭৫. এত পার্থক্য মানে ডেটা খুব কম, আর সেটিই রিপোর্টের প্রধান কথা।
    • নির্ভরশীল প্রমাণ দুবার গোনা: একই ফেরতের দুটি বিবরণ হয়তো একই ঘটনা; আর সেগুলো একই অর্ডারের হলে ৬টির ২টি ফেরতের মধ্যেই আছে।
    • নাম গুলিয়ে ফেলা: Posterior থেকে পাওয়া পরিসর credible interval, confidence interval নয়; আর তার “৯৫%” এই prior মেনে নেওয়ার শর্তে।

    নতুন নকশা: ডেটা দেখার আগে অন্য রাইস কুকার বা একই ধরনের পণ্যের অতীত ফেরত থেকে prior ঠিক করে লিখে রাখা; সমতল আর সেই prior দুটিতেই posterior mean ও credible interval দেখানো; প্রতিটি ফেরত একবারই গোনা; n = ৬ স্পষ্ট করা, আর কত ঝুঁকিতে কী সিদ্ধান্ত, তা আগে ঠিক করা।

  4. আউটপুট অনুমান: নিচের কোড কী ছাপবে? তৃতীয় গুণক ১/২-এর মানে কী?
    from fractions import Fraction as F
    odds = F(1, 4)
    for lr in [F(3), F(2), F(1, 2)]:
        odds *= lr
        print(odds, round(float(odds / (1 + odds)), 3))
    k, n = 0, 8
    print(k / n, (k + 1) / (n + 2))
    3/4 0.429
    3/2 0.6
    3/4 0.429
    0.0 0.1

    সত্যিকারের run (desktop Python 3.14.4). Prior odds ১/৪ (সম্ভাবনা ০.২)। LR ৩-এ odds ৩/৪, সম্ভাবনা ৩/৭ ≈ ০.৪২৯; LR ২-এ ৩/২, সম্ভাবনা ০.৬; LR ১/২ মানে প্রমাণটি অনুমানের বিপক্ষে (বিকল্প অনুমানের অধীনে দ্বিগুণ প্রত্যাশিত), তাই odds আবার ৩/৪-এ নামে। শেষ লাইনে ৮টিতে ০টি ফেরত: MLE ০.০, আর Laplace-এর rule of succession (০ + ১)/(৮ + ২) = ০.১. Fraction ছাপলে ভগ্নাংশ আসে, আর F(3) পূর্ণসংখ্যা হলেও গুণফল ভগ্নাংশই থাকে।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমBeta–Binomial দিয়ে একটি পণ্যের ফেরতের হার অনুমানের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. ডেটা দেখার আগে অতীতের অভিজ্ঞতা থেকে prior Beta(α, β) ঠিক করে লিখে রাখা
  2. অর্ডারের সংখ্যা n আর ফেরতের সংখ্যা k সংগ্রহ করা
  3. Conjugate update: posterior Beta(α + k, β + n − k)
  4. Posterior mean আর beta.ppf দিয়ে ৯৫% credible interval বের করা
  5. অন্য একটি যুক্তিসঙ্গত prior দিয়ে ফল বদলায় কি না যাচাই করা
  6. n, prior আর interval-এর ধরন উল্লেখ করে ফল রিপোর্ট করা

P(H) = 0.2, P(E | H) = 0.9 আর P(E | ¬H) = 0.3. প্রমাণ E দেখার পর P(H | E) কত?

  • ০.৯০
  • ০.১৮
  • প্রায় ০.৪৩
  • ০.৭৫

একটি অনুমানের prior odds ১ : ৪. একটি প্রমাণের likelihood ratio (অনুমানের পক্ষে) ৮. প্রমাণের পর অনুমানটির সম্ভাবনা কত?

  • ৮/৯ ≈ ০.৮৮৯
  • ২/৩ ≈ ০.৬৬৭
  • ২
  • ০.২০

একটি হারের prior Beta(2, 8). ১০টি চেষ্টায় ৩টি সাফল্য এসেছে। Posterior আর তার গড় কত?

  • Beta(5, 15), গড় ০.২৫
  • Beta(5, 18), গড় প্রায় ০.২১৭
  • Beta(9, 11), গড় ০.৪৫
  • Beta(3, 7), গড় ০.৩০

দুটি প্রমাণ E1 আর E2 অনুমান জানা থাকলে পরস্পর শর্তসাপেক্ষে স্বাধীন। প্রথমে E1 পরে E2 দিয়ে হালনাগাদ করলে, আর উল্টো ক্রমে করলে শেষ posterior সম্পর্কে কোনটি সঠিক?

  • প্রথম প্রমাণটি সবসময় বেশি প্রভাব ফেলে
  • শেষের প্রমাণটি বেশি প্রভাব ফেলে
  • শেষ ফল আলাদা, কারণ মাঝের posterior আলাদা
  • শেষ posterior একই, যদিও মাঝের ধাপ আলাদা হতে পারে

একটি নতুন পণ্যের ১৮টি অর্ডারে একটিও ফেরত আসেনি। সমতল Beta(1, 1) prior ধরলে পরের অর্ডার ফেরত আসার posterior mean সম্ভাবনা কত?

  • ০
  • ১/১৮ ≈ ০.০৫৬
  • ১/২০ = ০.০৫
  • ০.৫

একটি ফেরতের হার θ-এর posterior থেকে ৯৫% credible interval [0.07, 0.25] পাওয়া গেছে। এর সবচেয়ে সঠিক ব্যাখ্যা কোনটি?

  • একই পদ্ধতি বারবার চালালে ৯৫% বার পরিসরটি আসল θ ধরবে
  • ব্যবহৃত prior আর মডেল মেনে নিলে θ এই পরিসরে আছে ৯৫% সম্ভাবনায়
  • ভবিষ্যতের ৯৫% অর্ডারের ফেরতের হার এই পরিসরে পড়বে
  • পরিসরটি prior-এর ওপর নির্ভর করে না

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. সম্ভাবনা logic-এর সম্প্রসারণ: ০ আর ১ হলো মিথ্যা আর সত্য, মাঝের সংখ্যা বিশ্বাসের মাত্রা; Bayes-এর উপপাদ্য conditional probability-র সংজ্ঞা থেকে দুই লাইনে আসে, আর MYCIN-এর CF-এর মতো জোড়াতালির নীতিগত বিকল্প।
  2. posterior ∝ likelihood × prior, ভাগ করে evidence দিয়ে। টেবিলের ছক: prior, likelihood, গুণফল, যোগ, ভাগ। ভাঙা পার্সেলে P(B | ভাঙা) = ০.০২০ ÷ ০.০৩২ = ০.৬২৫.
  3. Odds form: posterior odds = prior odds × likelihood ratio; শর্তসাপেক্ষে স্বাধীন প্রমাণে LR-গুলো গুণ হয়, log-এ যোগ, আর ক্রম বদলায় না। নির্ভরশীল প্রমাণ দুবার গুনলে মিথ্যা আত্মবিশ্বাস আসে।
  4. Beta–Binomial: Beta(α, β) prior আর n-এ k ফেরতে posterior Beta(α + k, β + n − k); গড় prior-গড় আর k/n-এর ভারিত গড়, ৯৫% credible interval beta.ppf([0.025, 0.975], α, β). কম ডেটায় prior প্রায় পুরো উত্তর, বেশি ডেটায় ধুয়ে যায়।
  5. তুলনা আর এক-সংখ্যার অনুমান: posterior থেকে নমুনা নিয়ে P(θA > θB); credible interval prior-সহ বিশ্বাস, confidence interval পদ্ধতির প্রতিশ্রুতি; MAP = MLE + pseudo-count, সমতল prior-এ Laplace-এর (k + 1)/(n + 2).

পরের পর্বে: Bayes-এর উপপাদ্যকে একটি সম্পূর্ণ classifier-এ রূপ দেওয়া: Naive Bayes দিয়ে বাংলা SMS-কে spam না ham বলা। নিজের বানানো ছোট SMS-এর ডেটা, শব্দে ভাঙা, bag of words, Laplace smoothing, log probability আর scikit-learn-এর MultinomialNB দিয়ে যাচাই।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান