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

AI-এর জন্য সম্ভাবনা — event, conditional আর independence

Probability for AI — Sample Spaces, Events, Conditional Probability, Independence, Total Probability and a First Look at Bayes' Rule

Taught in Bangla, this lesson covers sample spaces, events, Kolmogorov's axioms, the addition and multiplication rules, and why mutually exclusive is not independent. In-page runs compute the birthday problem, read joint, marginal and conditional probability from a pandas crosstab, apply total probability and Bayes to a rare-fraud example, and check Monty Hall by simulation.

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

  • Sample space, outcome আর event দিয়ে একটি অনিশ্চিত পরিস্থিতি লিখে ফেলা, আর সম্ভাবনার তিন ব্যাখ্যা ও তিন স্বতঃসিদ্ধ চেনা
  • Complement, union, intersection আর addition rule; mutually exclusive বনাম independent-এর পার্থক্য উদাহরণসহ
  • Permutation আর combination দিয়ে গোনা (math.comb, math.perm), আর জন্মদিনের সমস্যা হিসাব ও simulation দুইভাবে
  • pandas crosstab থেকে joint, marginal আর conditional probability পড়া, আর ডেটা দিয়ে independence যাচাই
  • Multiplication rule, total probability-র tree আর Bayes-এর নিয়মের প্রথম পরিচয়; base-rate fallacy আর অন্যান্য সাধারণ ভুল এড়ানো

মডিউল ৬-এ AI-এর জন্য দরকারি গণিতের অন্তর্দৃষ্টি গড়ছি; আগের দুই পর্বে ছিল vector আর similarity (পর্ব ৩৩) এবং derivative আর gradient descent (পর্ব ৩৪)। এবার সম্ভাবনা, অর্থাৎ অনিশ্চয়তাকে সংখ্যায় বলার নিয়ম। প্রতিটি নিয়ম আগে ছবি আর ছোট সংখ্যায় হাতে, তারপর সূত্র, তারপর কোডে মিলিয়ে দেখব। উদাহরণ আবার বাজারঘর, এই কোর্সের কাল্পনিক অনলাইন দোকান; সব ডেটা seed দেওয়া কোডে বানানো, আর জালিয়াতির হার বা পরীক্ষার নির্ভুলতার মতো সংখ্যা বানানো, কোনো আসল কোম্পানির নয়। চালানো যায় এমন ব্লকগুলো পাতাতেই চলে (ব্রাউজারের Python, NumPy 2.4.6, pandas 3.0.2); প্রথমবার package নামতে কয়েক সেকেন্ড লাগতে পারে।

১ · AI-এর কেন সম্ভাবনা লাগে — অনিশ্চিত ডেটা, অনিশ্চিত উত্তর

বাজারঘরের দুটি বাস্তব প্রশ্ন ভাবুন। প্রথমটি: একটি গ্রাহক SMS পাঠালেন, “অফার! ১০০০ টাকা জিতুন, এখনই লিংকে চাপুন”. এটি কি spam? দ্বিতীয়টি: আজ সিলেটে একটি COD অর্ডার রওনা হলো। এটি কি দেরিতে পৌঁছাবে? দুটির কোনোটিরই নিশ্চিত উত্তর নেই: একই রকম শব্দের কিছু SMS আসল অফার, কিছু প্রতারণা; একই ধরনের অর্ডার কখনো সময়মতো পৌঁছায়, কখনো বৃষ্টি বা যানজটে আটকে যায়। ডেটায় আছে শুধু অতীতের কিছু উদাহরণ।

তাই ভালো AI system “হ্যাঁ” বা “না” বলার আগে বলে “কতটা সম্ভব”. একটি spam filter হয়তো বলবে P(spam) = 0.97, আর আপনি ঠিক করবেন ০.৯-এর বেশি হলে আলাদা folder-এ পাঠাবেন। ডেলিভারির model বলবে P(দেরি) = 0.2, আর ০.৫-এর বেশি হলে গ্রাহককে আগেই জানানো হবে। এমন সংখ্যা ছাড়া threshold ঠিক করা বা ঝুঁকি তুলনা করা যায় না। পরের মডিউলগুলোর অনেক কিছু এই ভিত্তিতে দাঁড়ানো: Naive Bayes (পর্ব ৫১), logistic regression-এর সম্ভাবনা (পর্ব ৫৯), precision আর recall (পর্ব ৬০), এমনকি LLM-এর পরের শব্দের অনুমান (পর্ব ৭০)।

আবহাওয়ার পূর্বাভাসের কথা ভাবুন। আবহাওয়া অফিস বলে “কাল ঢাকায় বৃষ্টির সম্ভাবনা ৭০%”. তারা জানে না কাল ঠিক কী হবে, কিন্তু অনিশ্চয়তাটা একটি সংখ্যায় দিয়ে দেয়, আর আপনি সেই সংখ্যা দেখে ছাতা নেবেন কি না ঠিক করেন। AI model-ও তেমনই এক পূর্বাভাসদাতা: নিশ্চয়তা নয়, মাপা অনিশ্চয়তা দেয়।

সম্ভাবনার গণিতের শুরু প্রায়ই ধরা হয় ১৬৫৪ সালের একটি চিঠি-আলাপ থেকে: জুয়াড়ি Chevalier de Méré-এর প্রশ্ন নিয়ে Blaise Pascal আর Pierre de Fermat চিঠিতে আলোচনা করেন, অসমাপ্ত খেলার বাজির টাকা কীভাবে ন্যায্যভাবে ভাগ হবে (problem of points). এ কারণেই পুরোনো বইয়ের উদাহরণ পাশা আর তাসে ভরা। ইমেইল spam ঠেকাতে সম্ভাবনার ব্যবহার ১৯৯০-এর দশকের শেষে গবেষণায় আসে, আর ২০০২ সালে Paul Graham-এর প্রবন্ধ “A Plan for Spam” একে জনপ্রিয় করে বলে ধরা হয়।

২ · Sample space, outcome আর event — ছক্কা থেকে বাজারঘরের অর্ডার

সম্ভাবনার যেকোনো প্রশ্ন লিখতে তিনটি শব্দ লাগে।

  • Outcome (ফলাফল): একটি পরীক্ষার একটি নির্দিষ্ট ফল। একটি ছক্কা একবার ছুড়লে ফল হতে পারে ১, ২, ৩, ৪, ৫ বা ৬; এর প্রতিটি একটি outcome.
  • Sample space (নমুনা-ক্ষেত্র): সম্ভাব্য সব outcome-এর সেট, লেখা হয় Ω (গ্রিক অক্ষর omega). ছক্কার জন্য Ω = {1, 2, 3, 4, 5, 6}.
  • Event (ঘটনা): sample space-এর যেকোনো উপসেট, অর্থাৎ কিছু outcome-এর দল। “জোড় সংখ্যা আসা” একটি event: A = {2, 4, 6}. “৩-এর চেয়ে বড় আসা”: B = {4, 5, 6}.

বাজারঘরের একটি অর্ডারকেও এভাবে লেখা যায়। ধরুন আমরা দুটি জিনিস দেখি: পেমেন্টের ধরন (COD, bKash বা Card) আর ডেলিভারি (সময়মতো বা দেরি)। তাহলে প্রতিটি outcome একটি জোড়া, আর sample space-এ ৩ × ২ = ৬টি outcome: (COD, দেরি), (COD, সময়মতো) ইত্যাদি। “দেরিতে পৌঁছাল” একটি event (তিনটি outcome), “COD” আরেকটি; এই পর্বের বেশিরভাগ হিসাব এই দুটি নিয়ে।

যখন সব outcome সমান সম্ভাব্য (ভালো ছক্কা, ভালোভাবে মেশানো তাস), তখন হিসাব সরল:

P(A) = A-এর ভেতরের outcome-এর সংখ্যা ÷ মোট outcome-এর সংখ্যা

এখানে P(A) পড়ুন “A-এর সম্ভাবনা”. ছক্কায় P(জোড়) = ৩/৬ = ০.৫. বাজারঘরের ৬টি outcome অবশ্য সমান সম্ভাব্য নয়; সেখানে প্রতিটির সম্ভাবনা আসে ডেটা থেকে।

সম্ভাবনার তিন ব্যাখ্যা

“সম্ভাবনা ০.৭” কথাটির মানে নিয়ে শতাব্দী ধরে আলোচনা চলছে। তিনটি প্রধান ব্যাখ্যা আছে; পাশের নামগুলো প্রভাবশালী, তবে কোনো ধারণাই একজনের একার আবিষ্কার নয়।

🎲 Classical

সমান সম্ভাব্য outcome গুনে ভাগ; সাধারণত Laplace-এর (১৮১২–১৮১৪) সঙ্গে যুক্ত। সমস্যা: “সমান সম্ভাব্য” আগে জানতে হয়।

গোনা

📊 Frequency

অনেকবার পুনরাবৃত্তি করলে event যত ভাগ সময়ে ঘটে, দীর্ঘ মেয়াদে সেই অনুপাত। John Venn (১৮৬৬) আর Richard von Mises-এর (১৯২৮) নামের সঙ্গে যুক্ত। সমস্যা: একবারের ঘটনার (কালকের নির্বাচন) পুনরাবৃত্তি নেই।

দীর্ঘ মেয়াদ

🧠 Degree of belief

প্রমাণের ভিত্তিতে কোনো দাবিতে বিশ্বাসের মাত্রা, যা নতুন প্রমাণে হালনাগাদ হয়। Frank Ramsey (১৯২৬) আর Bruno de Finetti-র কাজে গড়ে ওঠে। সমস্যা: শুরুর বিশ্বাস কোথা থেকে আসবে।

Bayesian

AI-এ তিনটিই কাজে লাগে: ডেটা থেকে হার মাপা frequency-র ভাবনা, আর “এই নির্দিষ্ট SMS-টি spam” দাবিতে model-এর সংখ্যা বিশ্বাসের মাত্রার মতো। Frequentist আর Bayesian ঘরানার বিতর্ক আজও আছে, তবে নিচের নিয়মগুলো তিন ব্যাখ্যাতেই একই।

তিনটি স্বতঃসিদ্ধ — Kolmogorov, ১৯৩৩

১৯৩৩ সালে রুশ গণিতবিদ Andrey Kolmogorov তাঁর জার্মান ভাষার বই Grundbegriffe der Wahrscheinlichkeitsrechnung-এ সম্ভাবনাকে কয়েকটি স্বতঃসিদ্ধের (axiom, প্রমাণ ছাড়া মেনে নেওয়া মূল নিয়ম) ওপর দাঁড় করান। সহজ ভাষায়:

  1. কোনো সম্ভাবনা ঋণাত্মক নয়: যেকোনো event A-এর জন্য P(A) ≥ 0.
  2. কিছু একটা ঘটবেই: পুরো sample space-এর সম্ভাবনা P(Ω) = 1.
  3. একসঙ্গে ঘটতে পারে না এমন event-এর সম্ভাবনা যোগ হয়: A আর B-এর মধ্যে কোনো সাধারণ outcome না থাকলে P(A অথবা B) = P(A) + P(B). (আসল স্বতঃসিদ্ধ অসীম সংখ্যক এমন event-এর জন্যও খাটে।)

বাকি সব নিয়ম (সম্ভাবনা ১-এর বেশি হয় না, complement-এর নিয়ম) এই তিনটি থেকে কয়েক লাইনে আসে। তাই কোনো model তিনটি শ্রেণিকে ০.৫, ০.৪ আর ০.৩ দিলে, যোগফল ১ নয় বলে, এগুলো সম্ভাবনা নয়; কোডে ভুল খুঁজুন।

৩ · Complement, union আর addition rule — আর mutually exclusive বনাম independent

Event সেট, তাই সেটের তিনটি কাজ দিয়ে নতুন event বানানো যায়।

  • Complement (পূরক), Aᶜ বা “A নয়”: Ω-এর যে outcome-গুলো A-তে নেই। P(Aᶜ) = 1 − P(A). অর্ডার দেরির সম্ভাবনা ০.১৩ হলে সময়মতো পৌঁছানোর সম্ভাবনা ০.৮৭.
  • Intersection, A ∩ B বা “A এবং B”: যে outcome দুটোতেই আছে।
  • Union, A ∪ B বা “A অথবা B (বা দুটোই)”: যে outcome অন্তত একটিতে আছে।

ছক্কায় A = জোড়, B = ৩-এর বেশি

Venn diagram: union, intersection and complement on one die roll

Venn diagram: A ∪ B = {2, 4, 5, 6}, A ∩ B = {4, 6} Ω A: জোড় B: > 3 2 4 6 5 1 3 ↑ A ∩ B P(A ∪ B) = 3/6 + 3/6 − 2/6 = 4/6 Aᶜ = {1, 3, 5} · P(Aᶜ) = 1 − 3/6
ছবি ৩৫.১ — নীল বৃত্তে জোড় সংখ্যা, কমলা বৃত্তে ৩-এর বড় সংখ্যা। ৪ আর ৬ দুটোতেই আছে, তাই A আর B-এর সম্ভাবনা সরাসরি যোগ করলে এদের দুবার গোনা হয়; একবার বাদ দিতে হয়। ১ আর ৩ কোনো বৃত্তে নেই।

ছবিটি থেকেই addition rule আসে:

P(A ∪ B) = P(A) + P(B) − P(A ∩ B)

A আর B-এর সম্ভাবনা যোগ করলে মাঝের অংশ (৪ আর ৬) দুবার গোনা হয়, তাই একবার বিয়োগ। হাতে গুনেও মেলে: A ∪ B = {2, 4, 5, 6}, চারটি outcome, তাই ৪/৬. দুটি event-এর কোনো সাধারণ অংশ না থাকলে P(A ∩ B) = 0, আর সূত্রটি Kolmogorov-এর তৃতীয় স্বতঃসিদ্ধ হয়ে যায়।

সবচেয়ে বেশি গুলিয়ে ফেলা জোড়া

দুটি শব্দ শুনতে কাছাকাছি, কিন্তু অর্থ প্রায় উল্টো।

  • Mutually exclusive (পরস্পর বর্জনশীল): দুটি event একসঙ্গে ঘটতে পারে না, P(A ∩ B) = 0. একটি অর্ডার একই সঙ্গে COD আর bKash হতে পারে না।
  • Independent (স্বাধীন): একটি ঘটেছে জানলে অন্যটির সম্ভাবনা বদলায় না, অর্থাৎ P(A ∩ B) = P(A) · P(B). দুটি আলাদা ছক্কার ফল স্বাধীন।

ছক্কায় দুটি উদাহরণ দেখুন। C = {1, 2} আর D = {5, 6} mutually exclusive; C ঘটেছে জানলে D-এর সম্ভাবনা ১/৩ থেকে সোজা ০. P(C) · P(D) = ১/৯, অথচ P(C ∩ D) = ০, তাই এরা স্বাধীন নয়। উল্টো দিকে A = জোড় = {2, 4, 6} আর C = {1, 2}: সাধারণ outcome একটি, P(A ∩ C) = ১/৬, আর P(A) · P(C) = ১/২ × ১/৩ = ১/৬. সমান, তাই এরা স্বাধীন, যদিও একসঙ্গে ঘটতে পারে।

মূল ধারণা

দুটি event-এর প্রতিটির সম্ভাবনা ০-এর বেশি হলে, তারা mutually exclusive হলে কখনোই independent নয়। Mutually exclusive মানে “একটি ঘটলে অন্যটি অসম্ভব”, যা সবচেয়ে শক্ত নির্ভরতা। Independent মানে “একটি জানলে অন্যটি সম্পর্কে কিছুই জানা যায় না”. বিশ্ববিদ্যালয় আর চাকরির পরীক্ষায় এটি খুব প্রিয় প্রশ্ন।

৪ · গোনার কৌশল — permutation, combination আর জন্মদিনের সমস্যা

সমান সম্ভাব্য outcome-এ সম্ভাবনা মানে গোনা, আর বড় sample space হাতে গোনা যায় না। দুটি মূল কৌশল আছে। প্রথমে factorial: n! = n × (n − 1) × … × 1, অর্থাৎ n জিনিস সারিতে সাজানোর মোট উপায়। ৩টি পণ্য ৩! = ৬ ভাবে সাজানো যায়।

  • Permutation (ক্রম গুরুত্বপূর্ণ): n জিনিস থেকে r টি বেছে সারিতে সাজানো, nPr = n! / (n − r)!. বাজারঘরের হোমপেজে ৫টি পণ্যের মধ্যে ৩টি প্রথম, দ্বিতীয় আর তৃতীয় জায়গায় দেখাতে হলে উপায় ৫ × ৪ × ৩ = ৬০.
  • Combination (ক্রম গুরুত্বহীন): শুধু কোন r টি বাছা হলো, nCr = n! / (r! (n − r)!). ৫টি থেকে ৩টি পণ্যের একটি “combo প্যাক” বানানোর উপায় ৬০ ÷ ৩! = ১০, কারণ প্রতিটি দল ৬ ভাবে সাজানো যেত।

Python-এর standard library-তে দুটোই আছে: math.perm(5, 3) দেয় 60, math.comb(5, 3) দেয় 10 (Python 3.8 থেকে)। ৪৫টি সংখ্যা থেকে ৬টি বাছার একটি লটারিতে math.comb(45, 6) = 8145060 রকম টিকিট সম্ভব, তাই একটি টিকিটে জেতার সম্ভাবনা প্রায় ৮১ লাখে ১. Python-এর math module বিস্তারিত দেখতে পারেন Python কোর্সের সংখ্যা ও গণিতের পর্বে।

জন্মদিনের সমস্যা

একটি ক্লাসে কতজন থাকলে অন্তত দুজনের জন্মদিন মেলার সম্ভাবনা ৫০% পেরোয়? অনেকে ১৮০-এর কাছাকাছি অনুমান করেন; আসল উত্তর মাত্র ২৩. এই birthday problem প্রায়ই Richard von Mises-এর ১৯৩৯ সালের লেখার সঙ্গে যুক্ত করা হয়, যদিও এর ইতিহাস নিয়ে সূত্রভেদ আছে। ধরে নিচ্ছি বছর ৩৬৫ দিনের (লিপ ইয়ার বাদ) আর প্রতিটি দিন সমান সম্ভাব্য।

কৌশলটি complement: “অন্তত এক জোড়া মিল” সরাসরি গোনা কঠিন, কিন্তু “সবার আলাদা” সহজ। প্রথমজন যেকোনো দিন (৩৬৫/৩৬৫), দ্বিতীয়জন বাকি ৩৬৪ দিনের একটি, তৃতীয়জন ৩৬৩ দিনের একটি, এভাবে:

P(সবার আলাদা) = (365/365) × (364/365) × … × (343/365) = 365P23 / 36523

উত্তর এত ছোট কেন? ২৩ জনে জোড়া math.comb(23, 2) = 253টি; প্রতিটির মেলার সম্ভাবনা ছোট, কিন্তু জোড়া অনেক। নিচের ব্লকে সঠিক হিসাব আর Monte Carlo simulation পাশাপাশি; শেষ তিন লাইনে দেখুন অনেক ছোট সম্ভাবনা গুণ করলে কী হয়।

import math
import numpy as np

n = 23
p_diff = 1.0                     # সবার জন্মদিন আলাদা হওয়ার সম্ভাবনা
for k in range(n):
    p_diff *= (365 - k) / 365
print("জোড়ার সংখ্যা C(23, 2) =", math.comb(n, 2))
print("সবার আলাদা      =", round(p_diff, 4))
print("অন্তত এক জোড়া মিল =", round(1 - p_diff, 4))
print("math.perm দিয়ে   =", round(1 - math.perm(365, n) / 365**n, 4))

# simulation: ৫০,০০০টি কাল্পনিক দল, প্রতিটিতে ২৩ জন
rng = np.random.default_rng(42)
days = rng.integers(0, 365, size=(50_000, n))
days.sort(axis=1)
shared = (np.diff(days, axis=1) == 0).any(axis=1)
print("simulation       =", round(shared.mean(), 4))

for m in (10, 23, 30, 50, 70):
    q = math.prod((365 - k) / 365 for k in range(m))
    print(f"{m:>2} জন: {1 - q:.3f}")

# অনেক ছোট সম্ভাবনার গুণফল: underflow
p = np.full(400, 0.01)
print("400টি 0.01-এর গুণফল:", p.prod())
print("log-এর যোগফল:", round(np.log(p).sum(), 1))

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

জোড়ার সংখ্যা C(23, 2) = 253
সবার আলাদা      = 0.4927
অন্তত এক জোড়া মিল = 0.5073
math.perm দিয়ে   = 0.5073
simulation       = 0.5093
10 জন: 0.117
23 জন: 0.507
30 জন: 0.706
50 জন: 0.970
70 জন: 0.999
400টি 0.01-এর গুণফল: 0.0
log-এর যোগফল: -1842.1

গুণের loop আর math.perm একই উত্তর দেয়: ০.৫০৭৩. Simulation-এ প্রতিটি সারি একটি দল; sort করার পর পাশাপাশি দুটি মান সমান হলে (np.diff == 0) জোড়া মিলেছে। ৫০,০০০ দলে ফল ০.৫০৯৩, সঠিক মানের চেয়ে ০.০০২ বেশি: ভুল নয়, random নমুনার স্বাভাবিক নড়াচড়া (তা মাপে standard error, পর্ব ৩৭)। ৫০ জনে মিলের সম্ভাবনা ৯৭%.

শেষ দুই লাইন দেখায় underflow: 0.01400 = 10−800, কিন্তু float64 সবচেয়ে ছোট যে ধনাত্মক মান রাখতে পারে তা মোটামুটি 10−308 (subnormal ধরলে প্রায় 10−324), তাই ফল চুপচাপ 0.0. কোনো error বা warning আসেনি। log নিলে গুণ যোগ হয়ে যায়: 400 × ln(0.01) = −1842.1, যা সহজেই রাখা যায়। Spam filter বা ভাষা model যখন শত শত শব্দের সম্ভাবনা গুণ করে, তখন ঠিক এই কারণেই log probability ব্যবহার করে (পর্ব ৫১-এ Naive Bayes-এ দেখবেন)।

একই অঙ্ক computer science-এ hash collision বোঝায়: ৩৬৫টি “bucket”-এ ২৩টি key রাখলেই সংঘর্ষের সম্ভাবনা অর্ধেক। বিস্তারিত দেখুন DSA কোর্সের hash table পর্বে।

৫ · Joint, marginal আর conditional — অর্ডারের contingency table থেকে

বাস্তব ডেটায় outcome সমান সম্ভাব্য নয়, তাই সম্ভাবনা আসে গোনা অনুপাত থেকে। দুটি শ্রেণিবাচক কলামের প্রতিটি জোড়া কতবার এসেছে, তার টেবিলকে বলে contingency table; pandas-এ এটি crosstab, যা পর্ব ২৫-এ দেখেছেন। এখানে আমরা বাজারঘরের ১০০০টি কাল্পনিক অর্ডার নিই (seed 42). কোডে ধরে নেওয়া হয়েছে COD-এর দেরির সম্ভাবনা ০.২০, bKash-এর ০.১০ আর Card-এর ০.০৫; আর ছুটির দিনের একটি কলাম আছে যা দেরির সঙ্গে সম্পর্কহীনভাবে বানানো।

টেবিল থেকে তিন রকম সম্ভাবনা পড়া যায়:

  • Joint probability, P(A ∩ B): একটি ঘরের সংখ্যা ÷ মোট। “অর্ডারটি COD এবং দেরি” কত ভাগ।
  • Marginal probability, P(A): একটি সারি বা কলামের মোট ÷ মোট। নামটি এসেছে টেবিলের কিনারা (margin) থেকে, যেখানে মোটগুলো লেখা থাকে।
  • Conditional probability, P(A | B): শুধু B-এর সারি বা কলামের ভেতরে A-এর ভাগ। খাড়া দাগ “|” পড়ুন “জানা থাকলে”.

P(A | B) = P(A ∩ B) / P(B), যেখানে P(B) > 0

অর্থাৎ B জানা থাকলে জগৎ ছোট হয়ে শুধু B হয়ে যায়, আর সেই ছোট জগতে A-এর ভাগ মাপি। নিচের stepper ঠিক এই পড়াটি ধাপে ধাপে দেখায়; সংখ্যাগুলো পরের কোড ব্লকের আসল আউটপুট থেকে।

১০০০টি অর্ডার: payment × statusলাল = এই ধাপে যা লাগে

            
হিসাব
প্রশ্ন
ভাগ
মান
  1. গোনার টেবিল। প্রতিটি ঘরে একটি (payment, status) জোড়ার অর্ডার-সংখ্যা। শেষ সারি আর কলাম All হলো মোট (margins=True); কোণের ১০০০ সব অর্ডার।
  2. Joint. “COD এবং দেরি” একটি ঘর: ৯৪ ÷ ১০০০ = ০.০৯৪. হর পুরো জগৎ।
  3. Marginal, সারি থেকে। COD-এর সারির মোট ৫০৩, তাই P(COD) = ০.৫০৩.
  4. Marginal, কলাম থেকে। দেরির কলামের মোট ১২৯, তাই P(late) = ০.১২৯; প্রতি ১০০ অর্ডারে প্রায় ১৩টি দেরি।
  5. Conditional. শুধু COD অর্ডারের জগৎ নিন (৫০৩টি); তার মধ্যে দেরি ৯৪টি। ৯৪ ÷ ৫০৩ ≈ ০.১৮৭. একই উত্তর সূত্রেও: ০.০৯৪ ÷ ০.৫০৩ ≈ ০.১৮৭. হর এখন ১০০০ নয়, ৫০৩.
  6. উল্টো conditional. এবার জগৎ “দেরি হওয়া অর্ডার” (১২৯টি); তার মধ্যে COD ৯৪টি। ৯৪ ÷ ১২৯ ≈ ০.৭২৯. লব একই ৯৪, কিন্তু হর আলাদা, তাই P(COD | late) আর P(late | COD) একেবারে আলাদা সংখ্যা।
  7. স্বাধীন কি না। স্বাধীন হলে P(COD ∩ late) = ০.৫০৩ × ০.১২৯ ≈ ০.০৬৫ হতো; আসলে ০.০৯৪. অন্যভাবে: P(late | COD) = ০.১৮৭ > P(late) = ০.১২৯. COD জানলে দেরির সম্ভাবনা বাড়ে, তাই এরা স্বাধীন নয়।
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 1000
pay = rng.choice(["COD", "bKash", "Card"], size=n, p=[0.5, 0.3, 0.2])
p_late = np.array([{"COD": 0.20, "bKash": 0.10, "Card": 0.05}[x] for x in pay])
is_late = rng.random(n) < p_late
weekend = rng.random(n) < 2 / 7            # দেরির সঙ্গে সম্পর্কহীন
orders = pd.DataFrame({"payment": pay, "late": is_late, "weekend": weekend,
                       "status": np.where(is_late, "late", "on_time")})

t = pd.crosstab(orders["payment"], orders["status"], margins=True)
print(t, "\n")
joint = pd.crosstab(orders["payment"], orders["status"], normalize="all")
print(joint.round(3), "\n")
cond = pd.crosstab(orders["payment"], orders["status"], normalize="index")
print(cond["late"].round(3), "\n")

pL = orders["late"].mean()
pC = (orders["payment"] == "COD").mean()
print("P(late)           =", round(pL, 3))
print("P(late | COD)     =", round(orders.loc[orders["payment"] == "COD", "late"].mean(), 3))
print("P(late | weekend) =", round(orders.loc[orders["weekend"], "late"].mean(), 3))
print("P(COD ∩ late)     =", round(joint.loc["COD", "late"], 3))
print("P(COD) × P(late)  =", round(pC * pL, 3))

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

status   late  on_time   All
payment
COD        94      409   503
Card        8      189   197
bKash      27      273   300
All       129      871  1000

status    late  on_time
payment
COD      0.094    0.409
Card     0.008    0.189
bKash    0.027    0.273

payment
COD      0.187
Card     0.041
bKash    0.090
Name: late, dtype: float64

P(late)           = 0.129
P(late | COD)     = 0.187
P(late | weekend) = 0.107
P(COD ∩ late)     = 0.094
P(COD) × P(late)  = 0.065

normalize="all" প্রতিটি ঘরকে মোট দিয়ে ভাগ করে, তাই দ্বিতীয় টেবিলটি joint probability-র, আর ছয়টি সংখ্যার যোগফল ১. normalize="index" প্রতিটি সারিকে তার নিজের মোট দিয়ে ভাগ করে, তাই তৃতীয় ফলটি P(late | payment). এগুলো কোডে ধরে নেওয়া ০.২০, ০.১০, ০.০৫-এর কাছাকাছি, কিন্তু সমান নয়: নমুনার নড়াচড়া। (pandas বর্ণানুক্রমে সাজায়, বড় হাতের অক্ষর আগে, তাই bKash শেষে।)

Boolean কলামের mean() মানে True-এর ভাগ, তাই orders["late"].mean() সরাসরি P(late), আর loc দিয়ে সারি বাছলে (পর্ব ২২) conditional probability. ছুটির দিনের কলাম দেরি থেকে আলাদাভাবে বানানো, তবু P(late | weekend) = ০.১০৭; মাত্র প্রায় ২৮৬টি অর্ডারে এমন পার্থক্য সাধারণ নড়াচড়া। তাই ডেটায় independence যাচাইয়ে প্রশ্ন “ঠিক সমান কি না” নয়, “পার্থক্য নড়াচড়ার চেয়ে বড় কি না”; COD-এর ০.১৮৭ বনাম ০.১২৯ তেমন বড় পার্থক্য।

Conditional মানে কারণ নয়: P(late | COD) বেশি বলে COD দেরির কারণ, এমন নয়। হয়তো COD অর্ডার বেশি আসে দূরের জেলা থেকে, আর দূরত্বই আসল কারণ। এই লুকানো তৃতীয় চলককে বলে confounding variable; আর দল ভাগ করলে প্রবণতা উল্টে যাওয়ার ঘটনা Simpson's paradox, যা পর্ব ২৪-এ দেখেছেন।

৬ · Multiplication rule আর independence — ডেটা দিয়ে যাচাই

Conditional probability-র সংজ্ঞা উল্টে লিখলে পাওয়া যায় multiplication rule, “A এবং B” হিসাবের নিয়ম:

P(A ∩ B) = P(A | B) · P(B) = P(B | A) · P(A)

বাজারঘরের সংখ্যায়: P(COD ∩ late) = P(late | COD) · P(COD) = ০.১৮৭ × ০.৫০৩ ≈ ০.০৯৪, যা টেবিলের ঘরের সঙ্গে মেলে। ধাপে ধাপে ঘটা ঘটনায় এটি খুব কাজের। একটি ব্যাগে ৫টি লাল আর ৩টি নীল কলম থাকলে, না ফিরিয়ে দুটি তুললে দুটোই লাল হওয়ার সম্ভাবনা (৫/৮) × (৪/৭) = ২০/৫৬ ≈ ০.৩৫৭; দ্বিতীয় ভগ্নাংশে ৪/৭ কারণ একটি লাল কলম আগেই উঠে গেছে।

A আর B স্বাধীন হলে B জানা A-এর সম্ভাবনায় কিছু যোগ করে না: P(A | B) = P(A). তখন নিয়মটি সরল হয়:

independent ⇔ P(A ∩ B) = P(A) · P(B) ⇔ P(A | B) = P(A)

এখানে ⇔ মানে “একটি সত্য হলে অন্যটিও সত্য” (P(B) > 0 ধরে)। ডেটায় independence যাচাইয়ের দুটি সমান উপায় তাই: joint-কে marginal-এর গুণফলের সঙ্গে, অথবা conditional-কে marginal-এর সঙ্গে মেলানো। আগের কোডে দুটোই বলেছে COD আর দেরি স্বাধীন নয়। ছোট পার্থক্য সত্যিই এলোমেলো নড়াচড়া কি না, তা আনুষ্ঠানিকভাবে যাচাইয়ের পদ্ধতি (যেমন chi-square test) পরিসংখ্যানের বিষয়; পর্ব ৩৭-এ পরিচয় পাবেন।

Independence ধরে নেওয়া সবচেয়ে বিপজ্জনক অনুমানগুলোর একটি। একই এলাকার দুটি অর্ডারের দেরি (একই বৃষ্টি) বা একই পরিবারের দুটি ঘটনা (একই জিন) প্রায়ই স্বাধীন নয়। ভুলভাবে গুণ করলে খুব ছোট, ভয়ংকরভাবে ভুল সংখ্যা আসে; ভাবনার প্রশ্ন ২-এ একটি আদালতের ঘটনা দেখবেন।

Conditional independence — এক লাইনের পরিচয়

কখনো দুটি event সাধারণভাবে নির্ভরশীল, কিন্তু তৃতীয় কিছু জানা থাকলে স্বাধীন হয়ে যায়। একই দিনে সিলেটে দুটি অর্ডারের দেরি নির্ভরশীল দেখায়, কারণ দুটিই আবহাওয়ার ওপর নির্ভর করে। কিন্তু “আজ ভারী বৃষ্টি” জানা থাকলে হয়তো একটির দেরি অন্যটি সম্পর্কে আর নতুন কিছু বলে না। একে বলে conditional independence: P(A ∩ B | C) = P(A | C) · P(B | C). Naive Bayes (পর্ব ৫১) ঠিক এই অনুমান করে: শ্রেণি (spam বা ham) জানা থাকলে প্রতিটি শব্দ স্বাধীন; অনুমানটি প্রায়ই সত্য নয়, তবু model প্রায়ই ভালো কাজ করে। Bayesian network (পর্ব ৫২) এই সম্পর্কগুলো জাল হিসেবে আঁকে।

৭ · Law of total probability — সব পথের যোগফল, tree দিয়ে

অনেক সময় একটি event-এর সম্ভাবনা সরাসরি জানা থাকে না, কিন্তু প্রতিটি “পথে” তার সম্ভাবনা জানা থাকে। বাজারঘরের ডেলিভারি দলের হিসাব ধরুন (এখানে গোল সংখ্যা, যা আগের কোডে ধরে নেওয়া মান): অর্ডারের ৫০% COD, ৩০% bKash, ২০% Card. COD-এ দেরির সম্ভাবনা ০.২০, bKash-এ ০.১০, Card-এ ০.০৫. সব মিলিয়ে দেরির সম্ভাবনা কত?

পেমেন্টের তিন ধরন mutually exclusive আর মিলে পুরো sample space ঢাকে (partition), তাই দেরিকে তিন টুকরোয় ভেঙে প্রতিটি multiplication rule দিয়ে হিসাব করা যায়:

P(L) = ∑i P(L | Hi) · P(Hi)

এখানে L মানে দেরি, Hi হলো i-তম পেমেন্টের ধরন, আর ∑ মানে সব i-এর ওপর যোগ। এটিই law of total probability. একটি probability tree এঁকে নিলে ভুল হয় কম।

Probability tree: P(late) = 0.10 + 0.03 + 0.01 = 0.14 0.5 0.3 0.2 COD bKash Card 0.2 0.8 late on time 0.10 0.1 0.9 late on time 0.03 0.05 0.95 late on time 0.01
  1. প্রথম শাখা। তিনটি শাখা, প্রতিটি একটি পেমেন্টের ধরন: ০.৫, ০.৩, ০.২. একটি বিন্দু থেকে বের হওয়া সব শাখার যোগফল সবসময় ১.
  2. COD-এর পথ। দেরি ০.২, সময়মতো ০.৮; এই শাখার সংখ্যা conditional, P(late | COD). পথ ধরে গুণ করলে joint: ০.৫ × ০.২ = ০.১০.
  3. bKash-এর পথ। P(late | bKash) = ০.১, তাই ০.৩ × ০.১ = ০.০৩.
  4. Card-এর পথ। ০.২ × ০.০৫ = ০.০১. প্রতিটি পথের শেষের সংখ্যা একটি joint probability; ছয়টি পথের যোগফল ১.
  5. সব দেরির পথ যোগ। P(late) = ০.১০ + ০.০৩ + ০.০১ = ০.১৪, law of total probability. ১০০০টি অর্ডারের নমুনায় মাপা মান ০.১২৯ ছিল; পার্থক্যটুকু নমুনার নড়াচড়া।
  6. উল্টো দিকে। একটি অর্ডার দেরিতে এসেছে; এটি COD হওয়ার সম্ভাবনা? দেরির ০.১৪-এর মধ্যে COD-এর পথ ০.১০, তাই ০.১০ ÷ ০.১৪ ≈ ০.৭১৪. এই উল্টো হিসাবটিই Bayes-এর নিয়ম।

৮ · Bayes-এর নিয়মের পরিচয় — দুর্লভ জালিয়াতি আর base rate

Multiplication rule দুই দিক থেকে লেখা যায়: P(H ∩ E) = P(E | H) · P(H) = P(H | E) · P(E). দুটিকে সমান বসিয়ে P(E) দিয়ে ভাগ করলেই Bayes' rule:

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

H হলো একটি অনুমান (hypothesis, যেমন “অর্ডারটি জালিয়াতি”), E হলো প্রমাণ (evidence, যেমন “পরীক্ষা flag দিয়েছে”)। P(H) হলো প্রমাণ দেখার আগের সম্ভাবনা, যাকে বলে prior বা base rate; P(H | E) প্রমাণ দেখার পরের সম্ভাবনা, posterior. হরের P(E) আসে আগের অংশের total probability থেকে। নামটি ইংরেজ যাজক Thomas Bayes-এর; তাঁর মৃত্যুর পর ১৭৬৩ সালে Richard Price প্রবন্ধটি প্রকাশ করেন, আর Laplace ১৭৭৪ সাল থেকে স্বাধীনভাবে নিয়মটি গড়ে তোলেন।

একটি উদাহরণ (সব সংখ্যা কাল্পনিক): বাজারঘরে প্রতি ১০০০টি অর্ডারে গড়ে ১টি জালিয়াতি (চুরি করা কার্ড বা ভুয়া ঠিকানা)। একটি স্বয়ংক্রিয় পরীক্ষা জালিয়াতির ৯৯%-কে flag দেয় (sensitivity ০.৯৯), আর সৎ অর্ডারের ২%-কেও ভুল করে flag দেয় (false positive rate ০.০২)। একটি অর্ডার flag পেয়েছে; এটি জালিয়াতি হওয়ার সম্ভাবনা কত? অনেকে বলেন “৯৯%”. আগে অর্ডার গুনে দেখি: Gerd Gigerenzer ও Ulrich Hoffrage-এর ১৯৯৫ সালের একটি গবেষণায় দেখা যায়, শতাংশের বদলে “natural frequency” (১০০০টির মধ্যে কতটি) দিলে মানুষ Bayes-এর হিসাব অনেক বেশি সঠিক করেন।

1000 orders: 1 fraud, 999 legit; flagged 1 + 20 = 21 1000 orders 0.001 0.999 1 fraud 999 legit 0.99 0.01 flag ≈ 1 miss ≈ 0 0.02 0.98 flag ≈ 20 no flag ≈ 979 all flags: 1 + 20 = 21
  1. একটি জনসংখ্যা ধরুন। ১০০০টি অর্ডার কল্পনা করুন, যাতে base rate-এর অন্তত একটি পূর্ণ অর্ডার আসে।
  2. Base rate দিয়ে ভাগ। ১টি জালিয়াতি আর ৯৯৯টি সৎ অর্ডার। সৎ অর্ডার প্রায় হাজার গুণ বেশি, তাই উত্তর ছোট হবে।
  3. জালিয়াতির শাখা। ৯৯% ধরা পড়ে: ১ × ০.৯৯ = ০.৯৯, প্রায় ১টি flag. প্রায় কোনোটিই ছাড়া পায় না।
  4. সৎ অর্ডারের শাখা। ২% ভুল flag: ৯৯৯ × ০.০২ = ১৯.৯৮, প্রায় ২০টি। মাত্র ২% শুনতে ছোট, কিন্তু ৯৯৯-এর ২% একটি জালিয়াতির চেয়ে বিশ গুণ বেশি।
  5. সব flag একসঙ্গে। প্রায় ১ + ২০ = ২১টি অর্ডার flag পেয়েছে। আমাদের অর্ডারটি এই ২১টির একটি; আর কিছু জানা নেই।
  6. উত্তর। ২১টির মধ্যে আসল জালিয়াতি প্রায় ১টি: ১/২১ ≈ ০.০৪৮, অর্থাৎ প্রায় ৫%. ৯৯% নয়! সূত্রে সঠিক মান ০.০০০৯৯ ÷ ০.০২০৯৭ ≈ ০.০৪৭২; পার্থক্যটুকু এসেছে ০.৯৯ আর ১৯.৯৮-কে পূর্ণসংখ্যায় গোল করা থেকে।

এই ভুলকে বলে base-rate fallacy: প্রমাণের শক্তি (৯৯%) দেখে prior-এর দুর্লভতা (০.১%) ভুলে যাওয়া। ১৯৭০-এর দশকে Daniel Kahneman আর Amos Tversky-র কাজে এটি মনোবিজ্ঞানের একটি পরিচিত বিষয় হয়ে ওঠে। ১৯৭৮ সালে Casscells ও সহকর্মীরা একটি মার্কিন মেডিকেল স্কুলে প্রায় এমনই একটি প্রশ্ন দেন (রোগ ১০০০-এ ১, ভুল positive ৫%); প্রকাশিত বিবরণ অনুযায়ী সবচেয়ে বেশি দেওয়া উত্তর ছিল ৯৫%, আর সঠিক প্রায় ২% বলেন অল্প কয়েকজন। নিচের কোড সূত্র, natural frequency আর simulation তিনভাবে উত্তর বের করে।

import numpy as np

# কাল্পনিক সংখ্যা: প্রতি ১০০০ অর্ডারে ১টি জালিয়াতি
prior = 0.001     # P(fraud)
sens = 0.99       # P(flag | fraud)
fpr = 0.02        # P(flag | not fraud)

p_flag = sens * prior + fpr * (1 - prior)     # total probability
post = sens * prior / p_flag                  # Bayes' rule
print(f"P(flag)         = {p_flag:.5f}")
print(f"P(fraud | flag) = {post:.4f}")

# natural frequency: ১,০০,০০০টি অর্ডার
N = 100_000
fraud = N * prior
caught = round(fraud * sens)
false_flags = round((N - fraud) * fpr)
print("জালিয়াতি:", round(fraud), "| flag পেল:", caught)
print("সৎ অর্ডারে ভুল flag:", false_flags)
print("flag-এর মধ্যে জালিয়াতি:", round(caught / (caught + false_flags), 4))

# simulation: seed 42, ১০ লাখ কাল্পনিক অর্ডার
rng = np.random.default_rng(42)
M = 1_000_000
is_fraud = rng.random(M) < prior
u = rng.random(M)
flag = np.where(is_fraud, u < sens, u < fpr)
hit = (flag & is_fraud).sum()
print("জালিয়াতি:", is_fraud.sum(), "| flag:", flag.sum(), "| দুটোই:", hit)
print(f"simulation-এ P(fraud | flag) ≈ {hit / flag.sum():.4f}")
print(f"উল্টো প্রশ্ন P(flag | fraud) ≈ {flag[is_fraud].mean():.4f}")

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

P(flag)         = 0.02097
P(fraud | flag) = 0.0472
জালিয়াতি: 100 | flag পেল: 99
সৎ অর্ডারে ভুল flag: 1998
flag-এর মধ্যে জালিয়াতি: 0.0472
জালিয়াতি: 1002 | flag: 20872 | দুটোই: 993
simulation-এ P(fraud | flag) ≈ 0.0476
উল্টো প্রশ্ন P(flag | fraud) ≈ 0.9910

১,০০,০০০টি অর্ডার নিলে natural frequency-তে গোল করার দরকার পড়ে না: ১০০টি জালিয়াতির ৯৯টি flag পায়, ৯৯,৯০০টি সৎ অর্ডারের ১৯৯৮টি ভুল flag পায়, আর ৯৯ ÷ (৯৯ + ১৯৯৮) = ০.০৪৭২, সূত্রের সঙ্গে হুবহু। Simulation-এ ১০ লাখ অর্ডারে ঠিক ১০০০টি নয়, ১০০২টি জালিয়াতি এসেছে, আর ফল ০.০৪৭৬; random নমুনায় এটুকু নড়াচড়া স্বাভাবিক। শেষ লাইনটি সবচেয়ে শিক্ষণীয়: P(flag | fraud) ≈ ০.৯৯১, আর P(fraud | flag) ≈ ০.০৪৮. একই দুটি event, দুই দিকের conditional, উত্তরে প্রায় বিশ গুণ পার্থক্য।

মূল ধারণা

Base rate খুব ছোট হলে ভালো পরীক্ষাও বেশিরভাগ সময় ভুল সতর্কবার্তা দেয়। তবু পরীক্ষাটি অকেজো নয়: flag-এর পর জালিয়াতির সম্ভাবনা ০.১% থেকে প্রায় ৪.৭%, প্রায় ৪৭ গুণ। ঠিক ব্যবহার হলো flag পাওয়া অর্ডার মানুষ দিয়ে যাচাই করা, সরাসরি বাতিল নয়। এই সংখ্যাটিই পরে precision নামে আসবে (পর্ব ৬০)।

এখানেই থামছি। Prior কোথা থেকে আসে, একাধিক প্রমাণে বারবার হালনাগাদ, odds আর likelihood ratio, এসব পর্ব ৫০ (Bayes-এর উপপাদ্য — প্রমাণ পেলে বিশ্বাস হালনাগাদ)-এ দেখবেন।

৯ · Simulation দিয়ে যাচাই আর তিনটি সাধারণ ভুল

সম্ভাবনায় অন্তর্দৃষ্টি প্রায়ই ভুল পথে নেয়। সবচেয়ে সৎ বিচারক simulation: পরিস্থিতিটি কোডে হুবহু লিখে, seed দিয়ে হাজারবার চালিয়ে, অনুপাত মাপা। যত বেশিবার চালাবেন, অনুপাত তত আসল সম্ভাবনার কাছে যাবে (law of large numbers; পর্ব ৩৬-এ বিস্তারিত)। পর্ব ১৬-এ default_rng আর seed দেখেছেন; এখানে সেটিকে যুক্তির পরীক্ষক হিসেবে ব্যবহার করব।

Monty Hall সমস্যা

একটি টিভি গেম শোতে তিনটি দরজা। একটির পেছনে গাড়ি, বাকি দুটির পেছনে ছাগল। আপনি একটি দরজা বাছলেন। উপস্থাপক, যিনি জানেন গাড়ি কোথায়, বাকি দুটির মধ্যে ছাগলওয়ালা একটি দরজা খোলেন, তারপর জিজ্ঞেস করেন: দরজা বদলাবেন? বেশিরভাগ মানুষের মনে হয়, এখন দুটি দরজা বাকি, তাই সম্ভাবনা ৫০-৫০. আসলে বদলালে জেতার সম্ভাবনা ২/৩. কারণ আপনার প্রথম বাছাই ১/৩ সময় ঠিক; বাকি ২/৩ সময় গাড়ি অন্য দুটির একটিতে, আর উপস্থাপক জেনেশুনে ছাগলের দরজাটি খুলে আপনাকে সেই ২/৩-কে এক দরজায় এনে দেন। এই Monty Hall problem প্রথম প্রকাশ করেন পরিসংখ্যানবিদ Steve Selvin, ১৯৭৫ সালে The American Statistician-এ পাঠানো চিঠিতে।

import numpy as np

rng = np.random.default_rng(42)
games = 10_000
stay = switch = 0
for _ in range(games):
    car = rng.integers(3)              # গাড়ি কোন দরজায়
    pick = rng.integers(3)             # প্রতিযোগীর প্রথম বাছাই
    # উপস্থাপক জানেন গাড়ি কোথায়; তিনি ছাগলের একটি দরজা খোলেন
    can_open = [d for d in range(3) if d != pick and d != car]
    opened = can_open[rng.integers(len(can_open))]
    other = 3 - pick - opened          # বাকি বন্ধ দরজা (0+1+2 = 3)
    stay += int(pick == car)
    switch += int(other == car)
print(f"না বদলে জয়: {stay / games:.4f}   (ঠিক 1/3 ≈ 0.3333)")
print(f"বদলে জয়:    {switch / games:.4f}   (ঠিক 2/3 ≈ 0.6667)")

# উপস্থাপক না জেনে খুললে: গাড়ি বেরিয়ে পড়া খেলা বাদ
kept = win = 0
for _ in range(games):
    car, pick = rng.integers(3), rng.integers(3)
    opened = (pick + 1 + rng.integers(2)) % 3   # বাকি দুটির যেকোনো একটি
    if opened == car:
        continue                       # গাড়ি দেখা গেল, খেলা বাতিল
    kept += 1
    win += int(3 - pick - opened == car)
print(f"না-জানা উপস্থাপক: {kept}টি খেলা টিকল, বদলে জয় {win / kept:.4f}   (ঠিক 1/2)")

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

না বদলে জয়: 0.3345   (ঠিক 1/3 ≈ 0.3333)
বদলে জয়:    0.6655   (ঠিক 2/3 ≈ 0.6667)
না-জানা উপস্থাপক: 6595টি খেলা টিকল, বদলে জয় 0.5078   (ঠিক 1/2)

১০,০০০টি খেলায় না বদলে জেতা ০.৩৩৪৫, বদলে ০.৬৬৫৫; সঠিক ১/৩ আর ২/৩-এর খুব কাছে। প্রতিটি খেলায় ঠিক একটি কৌশল জেতে, তাই দুটির যোগফল ঠিক ১. দ্বিতীয় অংশ দেখায় উপস্থাপকের জ্ঞান কেন জরুরি: তিনি না জেনে এলোমেলো দরজা খুললে আর শুধু ছাগল বেরোনো খেলাগুলো রাখলে বদলে জয় প্রায় ১/২ (০.৫০৭৮); টিকে থাকা ৬৫৯৫টি খেলা প্রত্যাশিত ২/৩ × ১০,০০০ ≈ ৬৬৬৭-এর কাছাকাছি। কে, কী জেনে তথ্য দিচ্ছে, তা হিসাবের অংশ।

ভুল ১ · Gambler's fallacy

একটি ন্যায্য মুদ্রায় পাঁচবার পরপর head এসেছে। অনেকের মনে হয়, এবার tail-এর “পালা”. কিন্তু মুদ্রা স্মৃতি রাখে না; স্বাধীন টসে পরের ফলের সম্ভাবনা এখনো ১/২. একে বলে gambler's fallacy. বহুবার বলা একটি গল্প ১৯১৩ সালের মন্টে কার্লো ক্যাসিনোর: শোনা যায় রুলেটে পরপর ২৬ বার কালো এসেছিল, আর মানুষ “এবার লাল আসবেই” ভেবে বিপুল টাকা হারান (খুঁটিনাটি সূত্রভেদে আলাদা)। দীর্ঘ মেয়াদে অনুপাত ১/২-এর কাছে যায়, কারণ নতুন অনেক টস আগের অস্বাভাবিকতাকে “পাতলা” করে দেয়, পরের টস আগেরটা “শোধ” করে বলে নয়।

ভুল ২ · P(A | B) আর P(B | A) গুলিয়ে ফেলা

Bayes-এর উদাহরণে দেখেছেন, P(flag | fraud) = ০.৯৯ কিন্তু P(fraud | flag) ≈ ০.০৪৭. দুটিকে এক ভাবাকে আদালতের প্রসঙ্গে prosecutor's fallacy বলা হয়: “নির্দোষ হলে এমন প্রমাণ পাওয়ার সম্ভাবনা ১০ লাখে ১” কথাটিকে “অভিযুক্তের নির্দোষ হওয়ার সম্ভাবনা ১০ লাখে ১” হিসেবে পড়া। ১০ লাখে ১ সম্ভাবনার প্রমাণ এক কোটি মানুষের শহরে প্রায় ১০ জনের সঙ্গে মিলতে পারে। নামটি William Thompson আর Edward Schumann-এর ১৯৮৭ সালের একটি প্রবন্ধ থেকে জনপ্রিয় হয় বলে জানা যায়। AI-এ রোজকার রূপ: “spam SMS-এর ৮০%-এ ‘অফার’ শব্দ থাকে” মানে এই নয় যে “অফার” থাকা SMS-এর ৮০% spam.

ভুল ৩ · ছোট নমুনার হারকে সম্ভাবনা ভাবা

নতুন একটি কুরিয়ার কোম্পানির প্রথম ৪টি অর্ডারের ৩টি দেরিতে পৌঁছেছে। “এদের দেরির সম্ভাবনা ৭৫%” বলা কি ঠিক? ৪টি নমুনার হার একটি নড়বড়ে অনুমান মাত্র। সম্পর্কহীন ছুটির দিনের কলামেও প্রায় ২৮৬টি অর্ডারে দেরির হার ০.১২৯-এর বদলে ০.১০৭ এসেছিল; ৪টিতে নড়াচড়া আরও অনেক বেশি। হারের পাশে সবসময় n লিখুন, আর অনিশ্চয়তা মাপুন (confidence interval, পর্ব ৩৭)। না-দেখা শব্দের সম্ভাবনা শূন্য ধরে নেওয়ার সমস্যাও এর আত্মীয়; সেখানে Laplace smoothing লাগে (পর্ব ৫১)।

নিয়মসূত্রকখন
ComplementP(Aᶜ) = 1 − P(A)“অন্তত একটি” প্রশ্নে, উল্টোটা সহজ হলে
AdditionP(A ∪ B) = P(A) + P(B) − P(A ∩ B)“A অথবা B”
ConditionalP(A | B) = P(A ∩ B) / P(B)B জানা থাকলে
MultiplicationP(A ∩ B) = P(A | B) · P(B)“A এবং B”, ধাপে ধাপে
IndependenceP(A ∩ B) = P(A) · P(B)শুধু সত্যিই স্বাধীন হলে
Total probabilityP(L) = ∑ P(L | Hi) P(Hi)পথগুলো জানা, মোট জানা নেই
BayesP(H | E) = P(E | H) P(H) / P(E)প্রমাণ থেকে কারণের দিকে

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

AI assistant-এর সম্ভাবনার উত্তর প্রায়ই সাবলীল আর আত্মবিশ্বাসী। কিন্তু ভাষা model লেখা তৈরি করে, হিসাব নয়: প্রশ্নের শর্ত সামান্য বদলালে (যেমন না-জানা উপস্থাপক) সে মুখস্থ পুরোনো উত্তর দিতে পারে, আর বিশ্বাসযোগ্য কিন্তু ভুল সংখ্যা (hallucination) সহজে চোখে পড়ে না।

AI যা প্রায়ই করেকীভাবে ধরবেন
প্রমাণ ছাড়াই দুটি event-কে স্বাধীন ধরে সম্ভাবনা গুণ করেজিজ্ঞেস করুন “কেন স্বাধীন?”; ডেটায় P(A | B) বনাম P(A) মিলিয়ে দেখুন
P(A | B) আর P(B | A) গুলিয়ে ফেলে, base rate উপেক্ষা করে১০০০ বা ১,০০,০০০ জনের natural frequency দিয়ে নিজে হিসাব করুন
crosstab-এ ভুল normalize ব্যবহার করে (সারির বদলে কলাম)প্রতিটি সারি বা কলামের যোগফল ১ কি না দেখুন; কোন হর, তা লিখে নিন
ছোট নমুনার হারকে সম্ভাবনা বলে, n জানায় নাপ্রতিটি দলের সংখ্যা ছাপান; সিদ্ধান্তের আগে অনিশ্চয়তা মাপুন
seed ছাড়া simulation দেয়, বা পুরোনো ধাঁচের global np.random.seed ব্যবহার করেnp.random.default_rng(42) ব্যবহার করুন; দুবার চালিয়ে একই ফল আসে কি না দেখুন
অনেক সম্ভাবনা সরাসরি গুণ করে, ফল 0.0 এলেও কিছু বলে নাlog-space-এ যোগ করুন; অদ্ভুত 0.0 বা 1.0 দেখলে থামুন

শর্তগুলো স্পষ্ট লিখুন, আর হিসাবের পাশাপাশি একটি simulation-ও লিখিয়ে নিন, যাতে মিলিয়ে দেখতে পারেন। আসল গ্রাহকের তথ্য কখনো পেস্ট করবেন না; কলামের নাম আর কয়েকটি কাল্পনিক সারিই যথেষ্ট।

আমার একটি pandas DataFrame আছে orders নামে: কলাম payment (COD/bKash/Card) আর late (True/False). pandas 3.0 আর NumPy 2.x দিয়ে Python কোড লেখো যা: ১. pd.crosstab দিয়ে গোনার টেবিল (margins=True), joint probability-র টেবিল আর P(late | payment) ছাপাবে; প্রতিটি টেবিলে হর কী, তা comment-এ লিখবে। ২. প্রতিটি payment-এর জন্য P(late | payment) আর P(late) পাশাপাশি দেখাবে, সঙ্গে প্রতিটি দলের অর্ডার-সংখ্যা n. ৩. স্বাধীনতা ধরে নেবে না; P(payment ∩ late) আর P(payment) × P(late) তুলনা করবে। ৪. একটি seeded simulation (np.random.default_rng(42)) দিয়ে নিজের হিসাব যাচাই করবে। ৫. কোনো deprecated API ব্যবহার করবে না, আর কোথাও কারণ-ফল দাবি করবে না; শুধু সম্পর্ক বলবে।

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

আরও গভীরে: Kolmogorov-এর কাঠামোয় সম্ভাবনা হলো একটি measure: Ω, event-এর একটি σ-algebra (যে সেটগুলোর সম্ভাবনা সংজ্ঞায়িত) আর P মিলে একটি probability space. অসীম sample space-এ (০ থেকে ১-এর সব বাস্তব সংখ্যা) প্রতিটি একক বিন্দুর সম্ভাবনা শূন্য, তবু ব্যবধানের সম্ভাবনা ধনাত্মক; continuous distribution (পর্ব ৩৬) এভাবেই কাজ করে। P(B) = 0 হলে conditional probability-র সাধারণ সংজ্ঞা ভেঙে পড়ে, আর তার জন্য সূক্ষ্ম সংজ্ঞা লাগে (Borel–Kolmogorov paradox দেখুন)।

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

  • Mutually exclusive আর independent-এর পার্থক্য? প্রথমটিতে P(A ∩ B) = 0, দ্বিতীয়টিতে P(A ∩ B) = P(A)P(B); দুটির সম্ভাবনা ধনাত্মক হলে mutually exclusive কখনো independent নয়।
  • P(A) = 0.5, P(B) = 0.4, P(A ∩ B) = 0.2 হলে P(A ∪ B)? ০.৫ + ০.৪ − ০.২ = ০.৭; আর ০.৫ × ০.৪ = ০.২, তাই এরা স্বাধীন।
  • দুটি ছক্কা ছুড়লে যোগফল ৭ হওয়ার সম্ভাবনা? ৩৬টি সমান সম্ভাব্য জোড়ার ৬টিতে, তাই ১/৬.
  • রোগ ১০০-এ ১, পরীক্ষার sensitivity ৯০%, false positive ৯%: positive হলে রোগের সম্ভাবনা? ১০০০ জনে ১০ রোগীর ৯ জন positive, ৯৯০ সুস্থের প্রায় ৮৯ জন; ৯ ÷ ৯৮ ≈ ০.০৯২.
  • ৫ জনের মধ্যে ২ জনের একটি দল কত ভাবে? 5C2 = ১০; সভাপতি আর সম্পাদক বাছতে হলে 5P2 = ২০.

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

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

প্র ০১Monty Hall সমস্যার সঠিক উত্তর পত্রিকায় ছাপা হওয়ার পর হাজার হাজার মানুষ, এমনকি গণিতবিদেরাও, প্রতিবাদ করেছিলেন। অন্তর্দৃষ্টি এখানে কেন এত জোরালোভাবে ভুল করে?

১৯৯০ সালে মার্কিন সাময়িকী Parade-এর “Ask Marilyn” কলামে Marilyn vos Savant এক পাঠকের প্রশ্নের উত্তরে লেখেন, দরজা বদলানোই ভালো, কারণ তাতে জেতার সম্ভাবনা ২/৩. প্রকাশিত বিবরণ অনুযায়ী এরপর তিনি হাজার হাজার চিঠি পান, যার বড় অংশ বলেছিল তিনি ভুল, আর পত্রলেখকদের মধ্যে ডক্টরেট ডিগ্রিধারী অনেকেও ছিলেন। প্রচলিত একটি গল্প হলো বিখ্যাত গণিতবিদ Paul Erdős-ও প্রথমে মানতে চাননি, আর computer simulation দেখার পর রাজি হন; গল্পটি তাঁর জীবনীতে আছে, তবে খুঁটিনাটি সতর্কভাবে নেওয়াই ভালো। অথচ সমস্যাটি নতুন ছিল না: Steve Selvin ১৯৭৫ সালেই এর সমাধান প্রকাশ করেছিলেন।

অন্তর্দৃষ্টি দুই জায়গায় হোঁচট খায়। প্রথমত, “দুটি দরজা বাকি, তাই ৫০-৫০” ভাবনাটি সমান-সম্ভাব্যতা অন্ধভাবে খাটায়; অথচ একটি দরজা আপনি এলোমেলোভাবে বেছেছেন, অন্যটি উপস্থাপক জেনেশুনে রেখে দিয়েছেন। দ্বিতীয়ত, আমরা প্রমাণের উৎস ভুলে যাই: দরজা খোলা একটি তথ্য, আর সেটি কোন নিয়মে এসেছে তার ওপর conditional probability নির্ভর করে। Simulation-এ দেখেছেন, একই দৃশ্য (একটি ছাগল বেরিয়েছে) না-জানা উপস্থাপকের ক্ষেত্রে উত্তর ১/২ করে দেয়।

দুটি কৌশল অন্তর্দৃষ্টি ঠিক করে: সংখ্যা বড় করা (১০০টি দরজা, উপস্থাপক জেনেশুনে ৯৮টি ছাগলের দরজা খোলেন; এখন বদলানো স্পষ্টতই ভালো), আর simulation, যদি কোডে প্রশ্নের নিয়ম হুবহু লেখা থাকে। AI-এর কাজে শিক্ষাটি সরাসরি: ডেটা কীভাবে সংগ্রহ হয়েছে, কে বেছেছে, কী বাদ পড়েছে, তা না জেনে conditional probability পড়লে ভুল হয়।

মূল উপলব্ধি: conditional probability শুধু “কী দেখলাম” নয়, “কোন প্রক্রিয়ায় দেখলাম” তার ওপরও নির্ভর করে; সন্দেহ হলে প্রক্রিয়াটি কোডে লিখে simulation চালান।

প্র ০২যুক্তরাজ্যের Sally Clark মামলায় পরিসংখ্যানের কোন দুটি ভুল একসঙ্গে ঘটেছিল, আর AI system-এর জন্য এর শিক্ষা কী?

Sally Clark ছিলেন একজন ইংরেজ আইনজীবী, যাঁর দুটি শিশুসন্তান অল্প বয়সে মারা যায়। ১৯৯৯ সালে তিনি হত্যার দায়ে দণ্ডিত হন। বিচারে শিশুরোগ বিশেষজ্ঞ Roy Meadow সাক্ষ্য দেন যে তাঁর মতো একটি সচ্ছল, ধূমপানহীন পরিবারে একটি শিশুর আকস্মিক মৃত্যুর (SIDS) সম্ভাবনা প্রায় ৮৫৪৩-এ ১, তাই দুটির সম্ভাবনা প্রায় ৭ কোটি ৩০ লাখে ১. ২০০১ সালে Royal Statistical Society এক বিবৃতিতে এই যুক্তির সমালোচনা করে, আর ২০০৩ সালে দ্বিতীয় আপিলে দণ্ড বাতিল হয় (প্রধান কারণ ছিল একটি চিকিৎসা-প্রমাণ গোপন রাখা, তবে পরিসংখ্যানের ভুলও ব্যাপক আলোচিত হয়)।

প্রথম ভুল: independence ধরে নেওয়া। ৮৫৪৩-কে নিজের সঙ্গে গুণ করা তখনই ঠিক, যখন একই পরিবারে দুটি মৃত্যু স্বাধীন। কিন্তু একই বাবা-মা, একই জিন, একই ঘর; একটি SIDS ঘটলে দ্বিতীয়টির সম্ভাবনা সম্ভবত বাড়ে, অর্থাৎ P(দ্বিতীয় | প্রথম) > P(দ্বিতীয়)।

দ্বিতীয় ভুল: prosecutor's fallacy. সংখ্যাটি ঠিক হলেও “নির্দোষ হলে এমন ঘটনার সম্ভাবনা খুব ছোট” মানে “নির্দোষ হওয়ার সম্ভাবনা খুব ছোট” নয়, কারণ দুটি শিশুর হত্যাও অত্যন্ত দুর্লভ। সঠিক প্রশ্ন Bayes-এর: দুটি মৃত্যু জানা থাকলে দুই ব্যাখ্যার আপেক্ষিক সম্ভাবনা কত। কিছু পরিসংখ্যানবিদের পরের বিশ্লেষণে এই অনুপাত সাক্ষ্যের ধারণার উল্টো দিকে যেতে পারে বলে দেখানো হয়েছে, যদিও সংখ্যা অনুমানের ওপর নির্ভর করে।

AI-এর জন্য শিক্ষা: ঝুঁকির score বা মুখ চেনার system “ভুল মিলের সম্ভাবনা খুব ছোট” বললেও বিশাল database-এ অনেক ভুল মিল আসে, আর flag পাওয়া মানুষটির নির্দোষ হওয়ার সম্ভাবনা base rate-এর ওপর নির্ভর করে।

মূল উপলব্ধি: ছোট সম্ভাবনা গুণ করার আগে স্বাধীনতা প্রমাণ করুন, আর “প্রমাণ দেওয়া থাকলে অনুমান” ও “অনুমান দেওয়া থাকলে প্রমাণ” কখনো গুলিয়ে ফেলবেন না; মানুষের জীবনে প্রভাব ফেলা সিদ্ধান্তে এই দুই ভুলের দাম অনেক।

প্র ০৩“কাল বৃষ্টির সম্ভাবনা ৭০%” আর “এই SMS-টি spam হওয়ার সম্ভাবনা ০.৯৭”, দুটি কথার মানে কি একই ধরনের? Frequentist আর Bayesian ব্যাখ্যা এখানে কী বলে?

Frequency ব্যাখ্যায় সম্ভাবনা হলো অনেকবার পুনরাবৃত্তির দীর্ঘ মেয়াদি অনুপাত। কিন্তু “কাল” একবারই আসবে, আর একটি নির্দিষ্ট SMS হয় spam, নয় spam; এর পুনরাবৃত্তি নেই। Frequentist ভাবনায় তাই কথাটিকে অন্যভাবে পড়তে হয়: “যে সব দিনের আবহাওয়ার অবস্থা আজকের মতো ছিল, তার প্রায় ৭০%-এ পরদিন বৃষ্টি হয়েছে”, বা “model যে SMS-গুলোকে ০.৯৭ দেয়, তার প্রায় ৯৭% spam”. এখানে সম্ভাবনা একটি একক ঘটনার নয়, একটি শ্রেণির ঘটনার। কোন শ্রেণি বেছে নেবেন (“আজকের মতো দিন” মানে কী), এটিকে বলে reference class problem, আর এর কোনো একক সঠিক উত্তর নেই।

Bayesian বা degree-of-belief ব্যাখ্যায় কথাটি সরাসরি অর্থপূর্ণ: প্রমাণের ভিত্তিতে এই নির্দিষ্ট দাবিতে কতটা বিশ্বাস যুক্তিসঙ্গত। Ramsey আর de Finetti-র Dutch book যুক্তি দেখায়, কারও বাজির বিশ্বাস সম্ভাবনার নিয়ম না মানলে এমন বাজির সেট বানানো যায় যাতে তিনি নিশ্চিত হারবেন; তাই বিশ্বাসের মাত্রাও Kolmogorov-এর নিয়ম মানা উচিত।

ব্যবহারিক দিক থেকে দুটি ব্যাখ্যা মেলে calibration-এ: ৭০% পূর্বাভাসের দিনগুলোর প্রায় ৭০%-এ বৃষ্টি হলে পূর্বাভাসটি calibrated. AI model-এর সংখ্যাও এভাবে যাচাই করা উচিত। ২০১৭ সালে Chuan Guo ও সহকর্মীদের একটি পরিচিত গবেষণায় দেখা যায়, আধুনিক বড় neural network প্রায়ই অতিরিক্ত আত্মবিশ্বাসী। দুই ঘরানার বিতর্ক পরিসংখ্যানে আজও জীবন্ত, তবে AI-এর কাজে দুই ঘরানার হাতিয়ারই পাশাপাশি চলে।

মূল উপলব্ধি: একক ঘটনার সম্ভাবনাকে বিশ্বাসের মাত্রা হিসেবে পড়া যায়, কিন্তু সেই সংখ্যার মূল্য যাচাই হয় frequency দিয়ে: model যখন ০.৯ বলে, তখন সত্যিই প্রায় ৯০% ঠিক হয় কি না।

প্র ০৪দুর্লভ ঘটনা ধরার AI system (জালিয়াতি, রোগ, যন্ত্রের ত্রুটি) কেন প্রায়ই সতর্কবার্তার বন্যা তৈরি করে, আর এর সমাধান কী?

এই পর্বের Bayes-এর উদাহরণে দেখেছেন, ১০০০-এ ১ base rate-এ ৯৯% sensitivity আর ২% false positive rate-এর পরীক্ষার flag-এর মাত্র প্রায় ৪.৭% সত্যিকারের। ১০ লাখ লেনদেনে ২% মানে ২০,০০০টি ভুল সতর্কবার্তা। যে দল এগুলো হাতে যাচাই করে, তারা শিগগিরই বোঝে বেশিরভাগ flag অর্থহীন, আর flag উপেক্ষা করা শুরু করে। হাসপাতালের যন্ত্রে এই সমস্যাকে alarm fatigue বলা হয়, আর বিভিন্ন স্বাস্থ্য সংস্থা একে রোগীর নিরাপত্তার ঝুঁকি হিসেবে চিহ্নিত করেছে।

সমস্যাটি গাণিতিক, model-এর প্রকৌশলের ব্যর্থতা নয়; ভালো model দিয়েও এটি এড়ানো যায় না। P(আসল | flag) নির্ভর করে sensitivity, false positive rate আর base rate-এর ওপর, আর base rate ব্যবসা ঠিক করে, model নয়। Base rate ০.১% হলে ২% false positive rate আসলে খুব বেশি।

সমাধানের প্রতিটি পথের দাম আছে। Threshold বাড়ালে flag কমে, কিন্তু কিছু জালিয়াতি ছাড়া পায়। ধাপে ধাপে পরীক্ষায় প্রথম flag-এর পর base rate প্রায় ৪.৭%, তাই দ্বিতীয় পরীক্ষার posterior অনেক বড় হয়, যদি দুটি পরীক্ষা একই ভুল না করে। Flag-কে রায় না বানিয়ে অগ্রাধিকার বানানো যায়, আর দুই ধরনের ভুলের খরচ expected utility দিয়ে মাপা যায় (পর্ব ৫৪)। মূল্যায়নে class imbalance-এ accuracy প্রায় অর্থহীন: কখনো flag না দেওয়া model-ও ৯৯.৯% accurate (পর্ব ৬০)।

মূল উপলব্ধি: দুর্লভ ঘটনায় একটি ভালো পরীক্ষার flag-ও বেশিরভাগ সময় ভুল হতে পারে; system নকশা করুন base rate মাথায় রেখে, আর flag-কে রায় নয়, যাচাইয়ের অগ্রাধিকার হিসেবে ব্যবহার করুন।

প্র ০৫AI model বা LLM যে “সম্ভাবনা” দেয়, সেগুলোকে কি Kolmogorov-এর অর্থে সত্যিকারের সম্ভাবনা ধরা যায়? কখন ভরসা করবেন?

গাণিতিক দিক থেকে অনেক model-এর output সম্ভাবনার নিয়ম মানে: softmax function প্রতিটি শ্রেণিকে ০ থেকে ১-এর মধ্যে একটি সংখ্যা দেয়, আর যোগফল হয় ১. একটি LLM প্রতিটি ধাপে সম্ভাব্য পরের token-গুলোর ওপর এমনই একটি বণ্টন দেয় (পর্ব ৭০)। তাই এগুলো আনুষ্ঠানিকভাবে একটি probability distribution. কিন্তু প্রশ্নটা অন্য: এই সংখ্যাগুলো কি বাস্তব জগতের ঘটনার হার বা যুক্তিসঙ্গত বিশ্বাসের সঙ্গে মেলে?

তিনটি কারণে না-ও মিলতে পারে। প্রথমত, calibration: model প্রশিক্ষণের loss কমাতে গিয়ে অতিরিক্ত আত্মবিশ্বাসী হতে পারে, বিশেষত বড় neural network (প্র ০৩-এ উল্লেখিত গবেষণা)। দ্বিতীয়ত, distribution shift: প্রশিক্ষণের ডেটার base rate আর আজকের বাস্তবের base rate আলাদা হলে, যেমন প্রশিক্ষণে জালিয়াতি ভারসাম্য করতে বাড়িয়ে দেওয়া হয়েছিল, তাহলে model-এর সম্ভাবনা সরাসরি ব্যবহারযোগ্য নয়; Bayes-এর নিয়ম দিয়ে prior সংশোধন করতে হয়। তৃতীয়ত, LLM-এর token সম্ভাবনা বলে “এই লেখার পর এই শব্দ আসার সম্ভাবনা কত”, “এই দাবি সত্য হওয়ার সম্ভাবনা কত” নয়; ভুল তথ্যও উচ্চ সম্ভাবনায় সাবলীলভাবে লেখা হতে পারে, আর LLM-কে তার নিশ্চয়তার শতাংশ জিজ্ঞেস করলে পাওয়া সংখ্যাও আরেকটি তৈরি করা লেখা। এ বিষয়ে গবেষণা চলছে।

ভরসা করবেন তখন, যখন নিজে যাচাই করেছেন: আলাদা test ডেটায় (পর্ব ৫৬), সম্ভাবনাকে দলে ভাগ করে প্রতিটি দলে আসল হার মেপে (reliability diagram), বর্তমান base rate-এ। না হলে সংখ্যাটিকে ক্রম হিসেবে ব্যবহার করুন (“এটি ওটার চেয়ে বেশি সন্দেহজনক”), “ঠিক ৯৭%” দাবি হিসেবে নয়।

মূল উপলব্ধি: model-এর output সম্ভাবনার নিয়ম মানলেই তা বাস্তবের সম্ভাবনা হয় না; calibration আর বর্তমান base rate দিয়ে যাচাই না করা পর্যন্ত সংখ্যাটিকে আত্মবিশ্বাসের ক্রম হিসেবে পড়ুন।

অনুশীলন

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

  1. ঢাকার অর্ডার আর দেরি (হিসাব): বাজারঘরের ২০০টি অর্ডারের মধ্যে ৮০টি ঢাকার, ৫০টি দেরিতে পৌঁছেছে, আর ৩০টি ঢাকার এবং দেরি (কাল্পনিক)। হিসাব করুন: (ক) P(ঢাকা ∪ দেরি), (খ) P(দেরি | ঢাকা), (গ) P(ঢাকা | দেরি), (ঘ) ঢাকা আর দেরি কি স্বাধীন?

    P(ঢাকা) = ৮০/২০০ = ০.৪০, P(দেরি) = ৫০/২০০ = ০.২৫, P(ঢাকা ∩ দেরি) = ৩০/২০০ = ০.১৫.

    • (ক) addition rule: ০.৪০ + ০.২৫ − ০.১৫ = ০.৫০. অর্থাৎ অর্ধেক অর্ডার হয় ঢাকার, নয় দেরি, বা দুটোই।
    • (খ) ৩০ ÷ ৮০ = ০.৩৭৫ (হর ঢাকার অর্ডার)।
    • (গ) ৩০ ÷ ৫০ = ০.৬০ (হর দেরির অর্ডার)। একই লব, আলাদা হর।
    • (ঘ) স্বাধীন হলে P(ঢাকা ∩ দেরি) = ০.৪০ × ০.২৫ = ০.১০ হতো; আসলে ০.১৫. বা P(দেরি | ঢাকা) = ০.৩৭৫ ≠ ০.২৫. তাই স্বাধীন নয়; ঢাকায় দেরির হার বেশি। (২০০টি অর্ডার ছোট নমুনা, তাই এই পার্থক্য সত্যিকারের কি না, আরও ডেটায় দেখা উচিত।)
  2. ৯৯% পেরোতে কতজন (কোড): জন্মদিনের সমস্যার birthday.py ব্লক বদলে একটি loop লিখুন যা সবচেয়ে ছোট দলের আকার খুঁজে বের করে যেখানে অন্তত এক জোড়া মিলের সম্ভাবনা প্রথমবার ০.৫ পেরোয়, আর যেখানে প্রথমবার ০.৯৯ পেরোয়।
    import math
    
    def p_match(m):
        return 1 - math.prod((365 - k) / 365 for k in range(m))
    
    for target in (0.5, 0.99):
        m = 1
        while p_match(m) <= target:
            m += 1
        print(target, m, round(p_match(m), 4))

    সত্যিকারের run (desktop Python 3.14, শুধু standard library):

    0.5 23 0.5073
    0.99 57 0.9901

    ২২ জনে সম্ভাবনা ০.৪৭৫৭, তাই ২৩-ই প্রথম যেখানে ০.৫ পেরোয়; আর ৫৬ জনে ০.৯৮৮৩, তাই ৯৯%-এর জন্য ৫৭ জন। মাত্র ৫৭ জনের একটি ক্লাসে জন্মদিন মিলে যাওয়া প্রায় নিশ্চিত।

  3. সমালোচনা ও নতুন নকশা: একজন সহকর্মী রিপোর্টে লিখেছেন: “আমাদের নতুন জালিয়াতি model-এর accuracy ৯৯.৮%. গতকাল এটি একটি অর্ডারকে flag দিয়েছে, তাই অর্ডারটি ৯৯.৮% নিশ্চিতভাবে জালিয়াতি; আমরা সরাসরি বাতিল করেছি। আর গত সপ্তাহের ১০টি Card অর্ডারের ৪টি জালিয়াতি ছিল, তাই Card অর্ডারে জালিয়াতির সম্ভাবনা ৪০%.” কী কী ভুল, আর আপনি কীভাবে মূল্যায়ন ও নীতি নতুন করে সাজাবেন?
    • Accuracy ≠ P(fraud | flag): জালিয়াতি দুর্লভ হলে “কখনো flag না দেওয়া” model-ও প্রায় ৯৯.৯% accurate. Flag পাওয়ার পর জালিয়াতির সম্ভাবনা হলো precision, যা base rate, sensitivity আর false positive rate থেকে Bayes দিয়ে আসে, আর তা অনেক ছোট হতে পারে।
    • P(A | B) আর P(B | A) গুলিয়ে ফেলা: “৯৯.৮% নিশ্চিত” দাবিটি পরীক্ষার নির্ভুলতাকে flag পাওয়া অর্ডারের সম্ভাবনা বানিয়ে দিয়েছে।
    • ছোট নমুনা: ১০টি অর্ডারের ৪টি থেকে ৪০% একটি খুব নড়বড়ে অনুমান; n জানাতে হবে, আর বেশি সময়ের ডেটা নিতে হবে।

    নতুন নকশা: আলাদা test ডেটায় confusion matrix, precision ও recall রিপোর্ট করুন, সঙ্গে বর্তমান base rate; natural frequency-তে লিখুন (“প্রতি ১০,০০০ অর্ডারে কতটি flag, তার কতটি আসল”)। Flag পাওয়া অর্ডার সরাসরি বাতিল না করে মানুষ দিয়ে বা দ্বিতীয় পরীক্ষায় (যেমন গ্রাহককে ফোন) যাচাই করুন। Card-এর হার কয়েক মাসের ডেটায়, n আর অনিশ্চয়তাসহ দেখান।

  4. আউটপুট অনুমান: নিচের কোড কী ছাপবে? দ্বিতীয় লাইনের সংখ্যাটি কোন ঐতিহাসিক প্রশ্নের উত্তর?
    import math
    print(math.comb(5, 2), math.perm(5, 2))
    print(round(1 - (5 / 6) ** 4, 4))
    print(0.5 * 0.2 + 0.3 * 0.1 + 0.2 * 0.05)
    10 20
    0.5177
    0.14

    প্রথম লাইন: ৫টি থেকে ২টি বাছাই ১০ ভাবে, ক্রমসহ ২০ ভাবে (প্রতিটি দল ২! = ২ ভাবে সাজানো)। দ্বিতীয় লাইন: চারবার ছক্কা ছুড়ে অন্তত একটি ছয় পাওয়ার সম্ভাবনা, complement দিয়ে: ১ − (৫/৬)৪ = ৬৭১/১২৯৬ ≈ ০.৫১৭৭. এটি Chevalier de Méré-এর বিখ্যাত বাজির প্রশ্নগুলোর একটি, যা ১৬৫৪ সালে Pascal আর Fermat-এর চিঠিতে আলোচিত হয়েছিল বলে প্রচলিত; সম্ভাবনা ০.৫-এর সামান্য বেশি, তাই দীর্ঘ মেয়াদে বাজিটি লাভজনক। তৃতীয় লাইন: tree-এর total probability, ০.১৪. Float-এর যোগে অনেক সময় শেষ অঙ্কে ছোট গোলমাল দেখা যায় (যেমন 0.1 + 0.2 ছাপে 0.30000000000000004); এই নির্দিষ্ট যোগফলটি অবশ্য desktop Python 3.14-এর একটি সত্যিকারের run-এ ঠিক 0.14 ছেপেছে। তাই float-এর সম্ভাবনা তুলনায় == নয়, math.isclose ব্যবহার করা নিরাপদ।

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

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

ক্রমNatural frequency দিয়ে “flag পেলে জালিয়াতির সম্ভাবনা” বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. একটি সুবিধাজনক জনসংখ্যা ধরা, যেমন ১০০০ বা ১,০০,০০০টি অর্ডার
  2. Base rate দিয়ে জালিয়াতি আর সৎ অর্ডারে ভাগ করা
  3. জালিয়াতির দলে sensitivity খাটিয়ে কতটি flag পায় তা বের করা
  4. সৎ দলে false positive rate খাটিয়ে কতটি ভুল flag পায় তা বের করা
  5. সব flag যোগ করে মোট flag পাওয়া অর্ডার বের করা
  6. সত্যিকারের জালিয়াতির flag-কে মোট flag দিয়ে ভাগ করা

একটি ছক্কা একবার ছোড়া হলো। A = “জোড় সংখ্যা” = {2, 4, 6} আর C = {1, 2}. A আর C সম্পর্কে কোনটি সঠিক?

  • এরা mutually exclusive
  • এরা independent, কারণ P(A ∩ C) = P(A) · P(C)
  • এরা dependent, কারণ দুটোতে 2 আছে
  • P(A ∪ C) = 5/6

দুটি event A আর B-এর প্রতিটির সম্ভাবনা ০-এর বেশি, আর তারা mutually exclusive. তাহলে কোনটি সবসময় সত্য?

  • এরা independent
  • P(A) + P(B) = 1
  • P(B | A) = P(B)
  • এরা dependent, কারণ P(B | A) = 0 অথচ P(B) > 0

একটি দোকানের অর্ডারের ৬০% COD আর ৪০% অনলাইন পেমেন্ট। COD-এ ফেরতের হার ০.১০, অনলাইনে ০.৩০. একটি এলোমেলোভাবে বাছা অর্ডার ফেরত আসার সম্ভাবনা কত?

  • ০.১৮
  • ০.২০
  • ০.৪০
  • ০.০৩

একটি রোগ প্রতি ১০০০ জনে ১ জনের। একটি পরীক্ষা সব রোগীকে positive বলে, আর সুস্থ মানুষের ১%-কে ভুল করে positive বলে। একজন positive এসেছেন। তাঁর রোগ থাকার সম্ভাবনা প্রায় কত?

  • ৯৯%
  • ৫০%
  • প্রায় ৯%
  • ০.১%

একটি ন্যায্য মুদ্রা পরপর ৫ বার head দিয়েছে। স্বাধীন টসে ষষ্ঠবার head আসার সম্ভাবনা কত?

  • ১/৬৪
  • ১/২
  • ১/২-এর কম, কারণ এবার tail-এর পালা
  • ১/২-এর বেশি, কারণ head-এর ধারা চলছে

একটি contingency table-এ ৫০০টি অর্ডার: Card ১০০টি, তার মধ্যে দেরি ১০টি; সব মিলিয়ে দেরি ৪০টি। P(Card | দেরি) কত?

  • ০.২৫
  • ০.১০
  • ০.০২
  • ০.২০

শব্দকোষ

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

মনে রাখুন

  1. Sample space Ω, outcome আর event দিয়ে প্রশ্ন লিখুন; সম্ভাবনা ০ থেকে ১, P(Ω) = 1, আর একসঙ্গে ঘটতে না পারা event-এর সম্ভাবনা যোগ হয় (Kolmogorov, ১৯৩৩)।
  2. P(A ∪ B) = P(A) + P(B) − P(A ∩ B); “অন্তত একটি” প্রশ্নে complement. Mutually exclusive (P(A ∩ B) = 0) আর independent (P(A ∩ B) = P(A)P(B)) আলাদা; ধনাত্মক সম্ভাবনার mutually exclusive event কখনো স্বাধীন নয়।
  3. P(A | B) = P(A ∩ B) / P(B): B-এর জগতে A-এর ভাগ। Crosstab-এ joint = ঘর ÷ মোট, marginal = কিনারার মোট ÷ মোট, conditional = ঘর ÷ সারি বা কলামের মোট। Independence যাচাই করুন P(A | B) বনাম P(A) দিয়ে, নমুনার নড়াচড়া মাথায় রেখে।
  4. Total probability আর Bayes: P(L) = ∑ P(L | Hi)P(Hi); P(H | E) = P(E | H)P(H) / P(E). দুর্লভ ঘটনায় base rate প্রমাণের চেয়ে বেশি গুরুত্বপূর্ণ হতে পারে; natural frequency দিয়ে হিসাব করুন।
  5. Simulation দিয়ে যাচাই, ভুল এড়িয়ে: seed দেওয়া Monte Carlo হিসাব মিলিয়ে দেয়; gambler's fallacy, P(A | B) আর P(B | A) গুলিয়ে ফেলা আর ছোট নমুনা এড়ান; অনেক সম্ভাবনা গুণ করতে log-এ যোগ করুন।

পরের পর্বে: event থেকে সংখ্যায়: random variable আর distribution. Bernoulli, binomial, Poisson আর normal distribution, sampling, আর Monte Carlo simulation-এ law of large numbers চোখের সামনে কাজ করা।

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

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