এই পর্বে যা শিখবেন
- শর্তসাপেক্ষ সম্ভাবনার সংজ্ঞা, আর কেন P( · | B) নিজেই একটি পূর্ণ সম্ভাবনা মাপ, তার প্রমাণ
- গুণের নিয়ম, chain rule (induction দিয়ে), মোট সম্ভাবনার সূত্র আর Bayes-এর উপপাদ্যের প্রমাণ
- Base rate আর natural frequency দিয়ে Bayes-এর হিসাব, আর odds রূপে প্রমাণ জমানো
- Independence, pairwise বনাম mutual, conditional independence আর naive Bayes spam filter
- Prosecutor's fallacy আর two-child problem-এর মতো ক্লাসিক ভুল চেনা, আর প্রতিটি উত্তর Fraction দিয়ে নিখুঁত গুনে ও seeded simulation দিয়ে যাচাই
১ · শর্তসাপেক্ষ সম্ভাবনা — নতুন তথ্যে sample space ছোট হয়
কাল্পনিক অনলাইন দোকান বাজারঘর গত সপ্তাহে ২০০টি অর্ডার পাঠিয়েছে: ১২০টি ঢাকার ভেতরে, ৮০টি ঢাকার বাইরে। ঢাকার ভেতরের ১৮টি আর বাইরের ২০টি অর্ডার দেরিতে পৌঁছেছে। এলোমেলোভাবে একটি অর্ডার বাছলে (প্রতিটি অর্ডার সমান সম্ভাব্য) সেটি দেরিতে পৌঁছানোর সম্ভাবনা 38/200 = 19/100. এখন কেউ বললেন, “অর্ডারটি ঢাকার বাইরের।” নতুন তথ্য পেলে উত্তর বদলায়: এখন আমরা শুধু ৮০টি অর্ডারের মধ্যে খুঁজছি, যার ২০টি দেরিতে, তাই সম্ভাবনা 20/80 = 1/4.
পরীক্ষার হলে রোল নম্বর ডাকা হচ্ছে। “পরের জন কি আমার বন্ধু?” প্রশ্নের উত্তর এক রকম; কিন্তু শিক্ষক যদি বলেন “এখন শুধু তৃতীয় বেঞ্চ ডাকা হবে”, তখন হিসাবটি শুধু তৃতীয় বেঞ্চের মানুষদের মধ্যে। বাকি হল তখন হিসাবের বাইরে। শর্তসাপেক্ষ সম্ভাবনা ঠিক এই কাজটি করে: জানা তথ্যের বাইরের সব ফল মুছে ফেলে, বাকিগুলোর অনুপাত নতুন করে মাপে।
পর্ব ৩৮ “বিচ্ছিন্ন সম্ভাবনা — sample space, event আর Laplace-এর সংজ্ঞা”-এর ভাষায়, একটি পরীক্ষার সব সম্ভাব্য ফলের সেট হলো sample space Ω, আর Ω-এর যেকোনো উপসেট একটি event. Event যেহেতু সেট, তাই “A আর B দুটিই” মানে intersection A ∩ B, আর “A অথবা B” মানে union A ∪ B (পর্ব ১৪ আর পর্ব ১৫)। এই পর্বে Ω সসীম বা গণনাযোগ্য (countable), আর P হলো Kolmogorov-এর স্বতঃসিদ্ধ মেনে চলা একটি সম্ভাবনা মাপ: P(E) ≥ 0, P(Ω) = 1, আর পরস্পর বিচ্ছিন্ন event-এর union-এর সম্ভাবনা তাদের সম্ভাবনার যোগফল।
A আর B দুটি event, আর P(B) > 0. তাহলে B জানা থাকলে A-এর শর্তসাপেক্ষ সম্ভাবনা (conditional probability)
P(A | B) = P(A ∩ B) / P(B)
“P(A | B)” পড়ুন “B দেওয়া থাকলে A-এর সম্ভাবনা”। খাড়া দাগ “|” এখানে “যদি জানা থাকে” অর্থে, ভাগ বা বিভাজ্যতার চিহ্ন নয়। P(B) = 0 হলে এই সংজ্ঞা প্রযোজ্য নয়।
সব ফল সমান সম্ভাব্য হলে সংজ্ঞাটি সরাসরি গোনায় নামে: P(A | B) = |A ∩ B| / |B|. অর্থাৎ Ω বাদ দিয়ে B-কেই নতুন sample space ধরুন, আর তার ভেতরে A-এর ফল গুনুন। একটি ছক্কা ছুড়লে A = “৪ বা তার বেশি” = {4, 5, 6} আর B = “জোড়” = {2, 4, 6}. তখন P(A) = 1/2, কিন্তু P(A | B) = |{4, 6}| / 3 = 2/3: জোড় জানলে বড় সংখ্যার সম্ভাবনা বাড়ে।
বাজারঘরের উদাহরণে D = “দেরিতে”, O = “ঢাকার বাইরে” লিখুন। তাহলে P(D | O) = 20/80 = 1/4, কিন্তু P(O | D) = 20/38 = 10/19 ≈ 0.53. দুটি প্রশ্ন একেবারে আলাদা: প্রথমটি বলে বাইরের অর্ডারের কত অংশ দেরি করে, দ্বিতীয়টি বলে দেরির অর্ডারের কত অংশ বাইরের। এই দুটি গুলিয়ে ফেলা সম্ভাবনার সবচেয়ে সাধারণ ভুল, যা §৭-এ আবার আসবে।
P(B) > 0 হলে Q(A) = P(A | B) ফাংশনটি Kolmogorov-এর তিনটি স্বতঃসিদ্ধ মানে। তাই পর্ব ৩৮-এ প্রমাণ করা সব নিয়ম (complement, union-এর সূত্র, union bound) “| B” লাগিয়েও খাটে, যেমন P(Aᶜ | B) = 1 − P(A | B).
প্রমাণ:
- Q(A) = P(A ∩ B)/P(B), যেখানে লব ≥ 0 আর হর > 0, তাই Q(A) ≥ 0. — P-এর প্রথম স্বতঃসিদ্ধ
- Q(Ω) = P(Ω ∩ B)/P(B) = P(B)/P(B) = 1. — Ω ∩ B = B
- A1, A2, … পরস্পর বিচ্ছিন্ন হলে Ai ∩ B-গুলোও পরস্পর বিচ্ছিন্ন, আর (∪ Ai) ∩ B = ∪ (Ai ∩ B). — বণ্টন নিয়ম, পর্ব ১৫
- তাই Q(∪ Ai) = P(∪ (Ai ∩ B))/P(B) = ∑ P(Ai ∩ B)/P(B) = ∑ Q(Ai). ∎ — P-এর যোগের স্বতঃসিদ্ধ
এই উপপাদ্যের মানে গভীর: নতুন তথ্য পাওয়া মানে একটি নতুন সম্ভাবনার জগতে ঢোকা, যেখানে পুরোনো সব নিয়ম একই রকম কাজ করে। পরের তথ্য এলে আবার শর্ত বসানো যায়: P(A | B ∩ C) মানে আগে B, তারপর C জানার পরের সম্ভাবনা।
২ · গুণের নিয়ম আর chain rule — ধাপে ধাপে ঘটা ঘটনা
সংজ্ঞার দুই দিকে P(B) দিয়ে গুণ করলেই একটি অত্যন্ত কাজের সূত্র পাওয়া যায়। এটি তখনই সবচেয়ে উপকারী, যখন ঘটনাগুলো একটির পর একটি ঘটে আর প্রতিটি ধাপের সম্ভাবনা আগের ধাপ জেনে সহজে বলা যায়।
P(B) > 0 হলে P(A ∩ B) = P(B) · P(A | B). একইভাবে P(A) > 0 হলে P(A ∩ B) = P(A) · P(B | A).
প্রমাণ এক লাইনের: সংজ্ঞা ১.১-এর দুই দিক P(B) দিয়ে গুণ করুন। ∎ এটিকে বলে সম্ভাবনার গুণের নিয়ম (multiplication rule). পর্ব ৩১-এর গণনার গুণের নিয়মের সঙ্গে মিলটি লক্ষ করুন: সেখানে প্রতিটি ধাপে পছন্দের সংখ্যা গুণ হতো, এখানে প্রতিটি ধাপের শর্তসাপেক্ষ সম্ভাবনা।
n ≥ 2 আর P(A1 ∩ … ∩ An−1) > 0 হলে
P(A1 ∩ A2 ∩ … ∩ An) = P(A1) · P(A2 | A1) · P(A3 | A1 ∩ A2) ⋯ P(An | A1 ∩ … ∩ An−1)
প্রমাণ (n-এর ওপর induction, পর্ব ১০): প্রথমে লক্ষ করুন, A1 ∩ … ∩ Ak ⊇ A1 ∩ … ∩ An−1 যখন k ≤ n − 1, তাই শর্তটি থেকে প্রতিটি ছোট intersection-এর সম্ভাবনাও ধনাত্মক, আর সূত্রের সব শর্তসাপেক্ষ সম্ভাবনা সুসংজ্ঞায়িত।
- ভিত্তি n = 2: P(A1 ∩ A2) = P(A1) P(A2 | A1), যা উপপাদ্য ২.১. — গুণের নিয়ম
- অনুমান: কোনো n ≥ 2-এর জন্য সূত্রটি সত্য। — induction hypothesis
- ধাপ: B = A1 ∩ … ∩ An লিখুন, যার সম্ভাবনা শর্ত অনুযায়ী ধনাত্মক। তাহলে P(B ∩ An+1) = P(B) · P(An+1 | B). — উপপাদ্য ২.১
- অনুমান থেকে P(B)-কে n-টি গুণফলে ভাঙুন; শেষ গুণনীয়ক P(An+1 | A1 ∩ … ∩ An). তাই সূত্রটি n + 1-এর জন্যও সত্য। ∎ — প্রতিস্থাপন
এই সূত্রকে বলে chain rule (সম্ভাবনার শৃঙ্খল নিয়ম)। Calculus-এর chain rule-এর সঙ্গে এর কোনো সম্পর্ক নেই; শুধু নাম মেলে।
বাজারঘরের মান-পরীক্ষা: ব্যাচ থেকে না ফিরিয়ে তোলা
একটি ব্যাচে ২০টি পাওয়ার ব্যাংক, তার ৩টি ত্রুটিপূর্ণ। পরিদর্শক একটি একটি করে ৩টি তোলেন, ফেরত রাখেন না। Gi = “i-তম তোলা জিনিসটি ভালো”। Chain rule অনুযায়ী
P(G1 ∩ G2 ∩ G3) = (17/20) · (16/19) · (15/18) = 34/57 ≈ 0.596
প্রতিটি গুণনীয়ক সহজ: প্রথমবার ২০টির ১৭টি ভালো; প্রথমটি ভালো জানলে বাকি ১৯টির ১৬টি ভালো; প্রথম দুটি ভালো জানলে বাকি ১৮টির ১৫টি। একই উত্তর গণনা দিয়েও আসে: ভালো ১৭টি থেকে ৩টি বাছাই C(17, 3) = 680, সব বাছাই C(20, 3) = 1140, অনুপাত 680/1140 = 34/57 (পর্ব ৩৩)। দুই পদ্ধতির মিল একটি ভালো পরীক্ষা। Complement নিলে “অন্তত একটি ত্রুটিপূর্ণ ধরা পড়ে” = 1 − 34/57 = 23/57. আর “প্রথম ত্রুটিপূর্ণটি ঠিক দ্বিতীয় তোলায়” = (17/20)(3/19) = 51/380. শেষ দুটি সংখ্যা scratch-এ ২০ × ১৯ × ১৮ = ৬৮৪০টি সাজানো তোলা গুনে মেলানো।
সাবধান: “না ফিরিয়ে” তুললে প্রতিটি ধাপের সম্ভাবনা বদলায়। কেউ যদি (17/20)3 ≈ 0.614 লেখেন, তিনি ধরে নিয়েছেন প্রতিবার জিনিসটি ফেরত রাখা হয়, অর্থাৎ ধাপগুলো স্বাধীন। কোন মডেল ঠিক, তা প্রশ্নের ভাষা থেকে আগে ঠিক করুন।
৩ · মোট সম্ভাবনার সূত্র — পথে ভাগ করে যোগ
বাজারঘর তিনটি গুদাম থেকে পণ্য পাঠায়। মোট চালানের ৫০% ঢাকা, ৩০% চট্টগ্রাম আর ২০% রাজশাহী গুদাম থেকে; ত্রুটির হার যথাক্রমে ২%, ৩% আর ৫% ধরা যাক। এলোমেলো একটি চালান ত্রুটিপূর্ণ হওয়ার সম্ভাবনা কত? প্রতিটি চালান ঠিক একটি গুদাম থেকে আসে, তাই প্রশ্নটি তিন ভাগে ভাঙা যায়।
B1, …, Bn event-গুলো Ω-এর একটি partition, যদি এরা পরস্পর বিচ্ছিন্ন হয় (i ≠ j হলে Bi ∩ Bj = ∅) আর B1 ∪ … ∪ Bn = Ω হয়। সহজ কথায়: প্রতিটি ফল ঠিক একটি Bi-তে পড়ে।
B1, …, Bn Ω-এর একটি partition আর প্রতিটি P(Bi) > 0 হলে যেকোনো event A-এর জন্য
P(A) = ∑i=1n P(A | Bi) · P(Bi)
প্রমাণ:
- A = A ∩ Ω = A ∩ (B1 ∪ … ∪ Bn) = (A ∩ B1) ∪ … ∪ (A ∩ Bn). — partition-এর সংজ্ঞা, বণ্টন নিয়ম
- A ∩ Bi ⊆ Bi, আর Bi-গুলো পরস্পর বিচ্ছিন্ন, তাই A ∩ Bi-গুলোও পরস্পর বিচ্ছিন্ন। — উপসেটের intersection
- তাই P(A) = ∑ P(A ∩ Bi). — যোগের স্বতঃসিদ্ধ
- প্রতিটি পদ P(A ∩ Bi) = P(A | Bi) P(Bi). ∎ — উপপাদ্য ২.১
গণনাযোগ্য অসীম partition B1, B2, …-এর জন্যও একই প্রমাণ খাটে, কারণ যোগের স্বতঃসিদ্ধ গণনাযোগ্য union-এ প্রযোজ্য। এটিকে বলে law of total probability. এর ছবি হলো একটি probability tree: প্রথম শাখায় partition, দ্বিতীয় শাখায় শর্তসাপেক্ষ সম্ভাবনা; একটি পথ ধরে গুণ করলে সেই পথের সম্ভাবনা, আর A-তে শেষ হওয়া সব পথ যোগ করলে P(A). নিচের stepper গুদামের প্রশ্নটি ১০,০০০ চালানের হিসাবে দেখায়।
1partition: 5000 · 3000 · 20002ঢাকা: 5000 × 2% = 1003চট্টগ্রাম: 3000 × 3% = 904রাজশাহী: 2000 × 5% = 1005P(D) = 290/10000 = 0.0296P(রাজশাহী | D) = 100/290
| ত্রুটিপূর্ণ | |
| পথ | |
| উত্তর |
- ভাগ। ১০,০০০ চালানের ৫,০০০টি ঢাকা, ৩,০০০টি চট্টগ্রাম, ২,০০০টি রাজশাহী থেকে। প্রতিটি চালান ঠিক একটি গুদামের, তাই তিনটি দল Ω-এর একটি partition.
- ঢাকার পথ। ৫,০০০টির ২% = ১০০টি ত্রুটিপূর্ণ। সম্ভাবনায়: P(D | ঢাকা) P(ঢাকা) = 0.02 × 0.5 = 0.010.
- চট্টগ্রামের পথ। ৩,০০০টির ৩% = ৯০টি। সম্ভাবনায় 0.03 × 0.3 = 0.009; এ পর্যন্ত মোট ১৯০টি।
- রাজশাহীর পথ। ২,০০০টির ৫% = ১০০টি। সম্ভাবনায় 0.05 × 0.2 = 0.010.
- যোগ। ত্রুটিপূর্ণ মোট ১০০ + ৯০ + ১০০ = ২৯০টি, তাই P(D) = 290/10000 = 29/1000 = 0.029. এটিই মোট সম্ভাবনার সূত্র।
- উল্টো প্রশ্ন। একটি ত্রুটিপূর্ণ চালান হাতে এলে সেটি রাজশাহীর হওয়ার সম্ভাবনা 100/290 = 10/29 ≈ 0.345. চালানের মাত্র ২০% রাজশাহীর, অথচ ত্রুটির প্রায় ৩৪.৫% সেখান থেকে। এই উল্টো হিসাবই Bayes-এর উপপাদ্য।
শেষ ধাপে ঢাকারও 100/290 = 10/29, আর চট্টগ্রামের 90/290 = 9/29; তিনটি মিলে 1, যেমন হওয়ার কথা (উপপাদ্য ১.২)। খেয়াল করুন, ঢাকার ত্রুটির হার সবচেয়ে কম হলেও চালান বেশি বলে ত্রুটির অংশ রাজশাহীর সমান। মান-নিয়ন্ত্রণের সিদ্ধান্তে শুধু হার নয়, পরিমাণও দেখতে হয়।
৪ · Bayes-এর উপপাদ্য আর base rate — fraud filter-এর হিসাব
বাজারঘরের একটি স্বয়ংক্রিয় fraud filter প্রতিটি অর্ডার পরীক্ষা করে সন্দেহজনক হলে সতর্কতা (alarm) দেয়। ধরুন (কাল্পনিক সংখ্যা): অর্ডারের ১% জালিয়াতি; জালিয়াতির ৯৫% filter ধরে, যাকে বলে sensitivity; আর সৎ অর্ডারের ৫%-এও ভুল করে সতর্কতা দেয়, অর্থাৎ false positive-এর হার ৫% ধরা হলো। একটি অর্ডারে সতর্কতা এল। এটি আসলে জালিয়াতি হওয়ার সম্ভাবনা কত? অনেকে দ্রুত বলেন, “৯৫% তো বটেই”। চলুন হিসাব করি।
B1, …, Bn Ω-এর একটি partition, প্রতিটি P(Bi) > 0, আর P(A) > 0 হলে প্রতিটি j-এর জন্য
P(Bj | A) = P(A | Bj) P(Bj) / ∑i P(A | Bi) P(Bi)
দুটি অনুমান H আর Hᶜ হলে: P(H | E) = P(E | H) P(H) / (P(E | H) P(H) + P(E | Hᶜ) P(Hᶜ)).
প্রমাণ:
- P(Bj | A) = P(Bj ∩ A)/P(A). — সংজ্ঞা ১.১, P(A) > 0
- লব P(Bj ∩ A) = P(A | Bj) P(Bj). — উপপাদ্য ২.১, P(Bj) > 0
- হর P(A) = ∑i P(A | Bi) P(Bi). ∎ — উপপাদ্য ৩.২
উপপাদ্যটি তিনটি শব্দে মনে রাখুন। P(H) হলো prior: প্রমাণ দেখার আগে অনুমানের সম্ভাবনা। P(E | H) হলো likelihood: অনুমান সত্য হলে এই প্রমাণ দেখার সম্ভাবনা। আর P(H | E) হলো posterior: প্রমাণ দেখার পরের সম্ভাবনা। Fraud filter-এ H = “জালিয়াতি”, E = “সতর্কতা”:
P(H | E) = (0.95 × 0.01) / (0.95 × 0.01 + 0.05 × 0.99) = 0.0095 / 0.059 = 19/118 ≈ 0.161
অর্থাৎ সতর্কতা পাওয়া অর্ডারের মাত্র ১৬%-এর মতো আসলে জালিয়াতি। কারণটি হলো base rate: জালিয়াতি খুব বিরল (১%), তাই বিশাল সংখ্যক সৎ অর্ডারের ছোট ৫% ভুলই সংখ্যায় আসল জালিয়াতিকে ছাপিয়ে যায়। Base rate উপেক্ষা করে “৯৫%” বলার ভুলকে বলে base rate fallacy.
Natural frequency — শতাংশ নয়, মানুষ গোনা
শতাংশের বদলে গোনা সংখ্যায় ভাবলে Bayes প্রায় স্বাভাবিক লাগে। এই কৌশলের নাম natural frequency; ১৯৯০-এর দশকে মনোবিজ্ঞানী Gerd Gigerenzer ও সহকর্মীদের গবেষণায় দেখা যায়, একই প্রশ্ন “১০০০-এর মধ্যে কয়জন” আকারে দিলে বহু মানুষ অনেক বেশি সঠিক উত্তর দেন। নিচের ছবি আর stepper ১০,০০০টি অর্ডার দিয়ে হিসাবটি দেখায়।
১০,০০০ অর্ডারের natural frequency tree
সতর্কতা পাওয়া অর্ডার ৯৫ + ৪৯৫ = ৫৯০টি; তার মধ্যে আসল জালিয়াতি মাত্র ৯৫টি।
1১০,০০০ অর্ডার21% জালিয়াতি: 100 · সৎ 9,900395% ধরা: 95 ⚠, 5 ছাড়45% ভুল ⚠: 495, ছাড় 9,4055মোট ⚠ = 95 + 495 = 590695/590 = 19/118 ≈ 0.161
| জালিয়াতি | |
| সৎ | |
| উত্তর |
- শুরু। ১০,০০০টি অর্ডার কল্পনা করুন। শতাংশের বদলে আমরা মানুষ বা অর্ডার গুনব; এটিই natural frequency.
- মূল হার। ১% জালিয়াতি: ১০০টি জালিয়াতি আর ৯,৯০০টি সৎ অর্ডার। এটিই prior, P(H) = 0.01.
- ধরা পড়া। জালিয়াতির ৯৫% ধরা পড়ে: ১০০টির ৯৫টিতে সতর্কতা, ৫টি ফাঁক গলে যায়।
- ভুল সতর্কতা। সৎ অর্ডারের ৫%-এ ভুল সতর্কতা: ৯,৯০০-এর ৫% = ৪৯৫টি; বাকি ৯,৪০৫টি নির্বিঘ্নে যায়।
- মোট সতর্কতা। ৯৫ + ৪৯৫ = ৫৯০টি, অর্থাৎ P(⚠) = 590/10000 = 0.059. এটি মোট সম্ভাবনার সূত্রের হর।
- শেষ ফল। ৫৯০টি সতর্কতার মাত্র ৯৫টি জালিয়াতি: 95/590 = 19/118 ≈ 0.161. সূত্রের উত্তরের সঙ্গে হুবহু মিল।
Odds রূপ — প্রমাণ জমানোর সহজ উপায়
একটি event-এর odds হলো P(H)/P(Hᶜ). Bayes-এর সূত্র H আর Hᶜ দুটির জন্য লিখে ভাগ করলে P(E) কেটে যায়:
posterior odds = prior odds × P(E | H)/P(E | Hᶜ)
ডানের ভগ্নাংশের নাম likelihood ratio. আমাদের filter-এ এটি 0.95/0.05 = 19, আর prior odds 1/99. তাই posterior odds 19/99, অর্থাৎ সম্ভাবনা 19/(19 + 99) = 19/118, একই উত্তর। সুবিধা হলো, দ্বিতীয় একটি স্বাধীন filter-ও যদি সতর্কতা দেয় (শর্ত: জালিয়াতি বা সৎ, যেকোনো শ্রেণি জানা থাকলে দুই filter স্বাধীনভাবে আচরণ করে, যা §৬-এর conditional independence), তবে আবার 19 দিয়ে গুণ করলেই হয়: 361/99, অর্থাৎ 361/460 ≈ 0.785. একটি সতর্কতায় ১৬%, আর দুটিতে প্রায় ৭৯% সম্ভাবনা।
এবার Python-এ হিসাবটি Fraction দিয়ে নিখুঁত করুন, তারপর seeded simulation দিয়ে মেলান, আর দেখুন base rate বদলালে উত্তর কীভাবে বদলায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from fractions import Fraction as F
import random
def posterior(prior, detect, false_alarm):
"""Bayes: P(fraud | alarm) from the three rates"""
p_alarm = detect * prior + false_alarm * (1 - prior) # total probability
return detect * prior / p_alarm, p_alarm
prior, detect, fa = F(1, 100), F(95, 100), F(5, 100)
post, p_alarm = posterior(prior, detect, fa)
print("P(alarm) =", p_alarm, " P(fraud | alarm) =", post, "=", f"{float(post):.4f}")
random.seed(39) # same numbers on every run
N = 100_000
alarms = fraud_alarms = 0
for _ in range(N):
fraud = random.random() < 0.01
alarm = random.random() < (0.95 if fraud else 0.05)
if alarm:
alarms += 1
fraud_alarms += fraud
print(f"simulation: {fraud_alarms} of {alarms} alarms are fraud = {fraud_alarms / alarms:.4f}")
print("base rate -> P(fraud | alarm)")
for r in (F(1, 1000), F(1, 100), F(1, 10), F(1, 2)):
p, _ = posterior(r, detect, fa)
print(f" {str(r):>6} {str(p):>8} {float(p):.4f}")
odds = prior / (1 - prior) * (detect / fa) ** 2 # 2 alarms, indep. given class
print("after two alarms:", odds / (1 + odds), f"= {float(odds / (1 + odds)):.4f}")আসল আউটপুট (ব্রাউজারের Python):
P(alarm) = 59/1000 P(fraud | alarm) = 19/118 = 0.1610
simulation: 994 of 5893 alarms are fraud = 0.1687
base rate -> P(fraud | alarm)
1/1000 19/1018 0.0187
1/100 19/118 0.1610
1/10 19/28 0.6786
1/2 19/20 0.9500
after two alarms: 361/460 = 0.7848
প্রথম লাইন নিখুঁত উত্তর: P(⚠) = 59/1000 আর posterior 19/118. Simulation-এ ১,০০,০০০টি অর্ডারে ৫,৮৯৩টি সতর্কতা, তার ৯৯৪টি জালিয়াতি, অনুপাত 0.1687. এটি 0.1610-এর কাছাকাছি, কিন্তু হুবহু নয়: প্রায় ৫,৯০০টি সতর্কতার নমুনায় এমন অনুপাতের স্বাভাবিক ওঠানামা মোটামুটি ±0.005, তাই এই পার্থক্য (প্রায় দেড় গুণ) অস্বাভাবিক নয়। নমুনা যত বড়, simulation তত কাছে আসে, যার নিখুঁত রূপ পর্ব ৪১-এর law of large numbers. টেবিলটি base rate-এর শক্তি দেখায়: একই filter, কিন্তু জালিয়াতি ০.১% হলে সতর্কতার মাত্র ১.৯% আসল, আর ৫০% হলে ৯৫% আসল জালিয়াতি। শেষ লাইন odds রূপের 361/460.
৫ · Independence — যখন একটি জানলে অন্যটির সম্ভাবনা বদলায় না
দুটি আলাদা মুদ্রা ছোড়া হলো। প্রথমটি হেড হয়েছে জানলে দ্বিতীয়টি হেড হওয়ার সম্ভাবনা বদলায় না। এই স্বজ্ঞাকে নিখুঁত করতে P(A | B) = P(A) লেখা যেত, কিন্তু তাতে P(B) > 0 শর্ত লাগে আর A, B-এর ভূমিকা অসম লাগে। তাই প্রতিসম সংজ্ঞাটি নেওয়া হয়।
A আর B স্বাধীন (independent), যদি P(A ∩ B) = P(A) · P(B).
(ক) P(B) > 0 হলে A, B স্বাধীন ⇔ P(A | B) = P(A). (খ) A, B স্বাধীন হলে A আর Bᶜ-ও স্বাধীন। (গ) P(A) > 0, P(B) > 0 আর A ∩ B = ∅ হলে A, B স্বাধীন নয়।
প্রমাণ:
- (ক) P(A | B) = P(A ∩ B)/P(B). এটি P(A)-এর সমান ⇔ P(A ∩ B) = P(A) P(B). — সংজ্ঞা ১.১, P(B) দিয়ে গুণ
- (খ) A = (A ∩ B) ∪ (A ∩ Bᶜ), দুটি অংশ পরস্পর বিচ্ছিন্ন, তাই P(A ∩ Bᶜ) = P(A) − P(A ∩ B). — যোগের স্বতঃসিদ্ধ
- স্বাধীনতা বসালে P(A ∩ Bᶜ) = P(A) − P(A)P(B) = P(A)(1 − P(B)) = P(A) P(Bᶜ). — complement-এর নিয়ম
- (গ) A ∩ B = ∅ হলে P(A ∩ B) = 0, কিন্তু P(A)P(B) > 0; গুণের সমতা ভাঙে। ∎ — P(∅) = 0
(গ) অংশটি একটি জনপ্রিয় বিভ্রান্তি দূর করে: “পরস্পর বিচ্ছিন্ন” আর “স্বাধীন” প্রায় উল্টো ধারণা। বিচ্ছিন্ন হলে একটি ঘটলে অন্যটি নিশ্চিতভাবে ঘটেনি, যা সবচেয়ে শক্তিশালী তথ্য। আরেকটি বিভ্রান্তি: independence শারীরিক আলাদাপনা নয়, একটি সংখ্যাগত সম্পর্ক। একটিমাত্র ছক্কায় E = “জোড়” = {2, 4, 6} আর S = {1, 2}: P(E ∩ S) = P({2}) = 1/6 = (1/2)(1/3). একই ছক্কা, তবু E আর S স্বাধীন। অথচ E আর G = {4, 5, 6} স্বাধীন নয়, কারণ P(E ∩ G) = 1/3 ≠ 1/4.
তিন বা বেশি event — pairwise বনাম mutual
A1, …, An pairwise independent, যদি প্রতিটি জোড়া Ai, Aj (i ≠ j) স্বাধীন হয়। এরা mutually independent, যদি অন্তত দুটি সূচকের প্রতিটি উপসেট S ⊆ {1, …, n}-এর জন্য P(∩i∈S Ai) = ∏i∈S P(Ai) হয়।
Mutual independence-এ কয়টি সমীকরণ যাচাই করতে হয়? n উপাদানের সেটের উপসেট 2nটি; তার মধ্যে খালি সেট আর n-টি এক-উপাদানের উপসেট বাদ দিলে 2n − n − 1টি (পর্ব ৩১)। n = 3-এ ৪টি: তিনটি জোড়া আর একটি ত্রয়ী। Pairwise শুধু প্রথম তিনটি চায়। শেষটি কি আপনাআপনি আসে? না।
Counterexample: দুটি ন্যায্য মুদ্রা ছুড়ুন; Ω = {HH, HT, TH, TT}, প্রতিটি 1/4. A = “প্রথমটি হেড”, B = “দ্বিতীয়টি হেড”, C = “ঠিক একটি হেড”। C আসলে A আর B-এর XOR (পর্ব ২): C = {HT, TH}. প্রতিটির সম্ভাবনা 1/2. A ∩ B = {HH}, A ∩ C = {HT}, B ∩ C = {TH}, প্রতিটি 1/4 = (1/2)(1/2); তাই তিনটি জোড়াই স্বাধীন। কিন্তু A ∩ B ∩ C = ∅, কারণ দুটিই হেড হলে “ঠিক একটি হেড” হতে পারে না: 0 ≠ 1/8. যেকোনো দুটি জানলে তৃতীয়টি পুরো জানা হয়ে যায়। নিচের কোড প্রতিটি সমীকরণ গুনে দেখায়।
from fractions import Fraction as F
from itertools import product, combinations
def check(omega, events):
"""print every product test for a family of events on equally likely omega"""
P = lambda E: F(len(E), len(omega))
names = list(events)
for k in range(2, len(names) + 1):
for group in combinations(names, k):
both = set(omega)
for g in group:
both &= events[g]
prod = 1
for g in group:
prod *= P(events[g])
ok = "==" if P(both) == prod else "!="
print(f" P({'∩'.join(group)}) = {P(both)} {ok} {prod}")
coins = list(product("HT", repeat=2)) # 4 equally likely outcomes
A = {w for w in coins if w[0] == "H"} # first coin heads
B = {w for w in coins if w[1] == "H"} # second coin heads
C = {w for w in coins if (w[0] == "H") ^ (w[1] == "H")} # exactly one head
print("two coins, C = A xor B:")
check(coins, {"A": A, "B": B, "C": C})
die = range(1, 7)
print("one die, E = even, S = {1, 2}:")
check(die, {"E": {2, 4, 6}, "S": {1, 2}})
print("one die, E = even, G = at least 4:")
check(die, {"E": {2, 4, 6}, "G": {4, 5, 6}})আসল আউটপুট (ব্রাউজারের Python):
two coins, C = A xor B:
P(A∩B) = 1/4 == 1/4
P(A∩C) = 1/4 == 1/4
P(B∩C) = 1/4 == 1/4
P(A∩B∩C) = 0 != 1/8
one die, E = even, S = {1, 2}:
P(E∩S) = 1/6 == 1/6
one die, E = even, G = at least 4:
P(E∩G) = 1/3 != 1/4
check ফাংশনটি সংজ্ঞা ৫.৩ হুবহু অনুসরণ করে: দুই বা বেশি event-এর প্রতিটি দলের intersection-এর সম্ভাবনা আর আলাদা সম্ভাবনার গুণফল মেলায়। মুদ্রার তিনটি জোড়া মেলে, কিন্তু ত্রয়ী মেলে না: pairwise হলেও mutual নয়। ছক্কার দুটি লাইন দেখায় যে একই পরীক্ষার event-ও স্বাধীন হতে পারে (E, S), আবার না-ও পারে (E, G); বিচারক শুধু গুণের সমীকরণ।
কম্পিউটার বিজ্ঞানে independence-এর সবচেয়ে বড় ব্যবহার হলো পুনরাবৃত্তি দিয়ে ভুলের সম্ভাবনা কমানো। Miller–Rabin পরীক্ষায় একটি যৌগিক সংখ্যা একটি এলোমেলো base-এ ভুল করে “সম্ভবত মৌলিক” পাস করার সম্ভাবনা সর্বোচ্চ 1/4 (পর্ব ২৫)। k-টি রাউন্ডে base যদি স্বাধীনভাবে বাছা হয়, তবে সব রাউন্ডে ভুলের সম্ভাবনা গুণ হয়ে সর্বোচ্চ (1/4)k. এখানে mutual independence-ই দরকার, কারণ k-টি event-এর একসঙ্গে ঘটার সম্ভাবনা চাই। আবার কিছু জায়গায় দুর্বল pairwise independence-ই যথেষ্ট, যেমন কয়েকটি hash function-এর পরিবার আর variance-এর হিসাব; এর গল্প পর্ব ৪১ আর ভাবনার প্রশ্নে।
৬ · Conditional independence আর naive Bayes spam filter
P(C) > 0 হলে A আর B, C দেওয়া থাকলে শর্তসাপেক্ষে স্বাধীন, যদি P(A ∩ B | C) = P(A | C) · P(B | C). অর্থাৎ উপপাদ্য ১.২-এর নতুন সম্ভাবনা মাপ Q = P( · | C)-তে A আর B স্বাধীন।
সাধারণ independence আর conditional independence একটি অন্যটিকে বোঝায় না; দুই দিকেই counterexample আছে।
- শর্তে স্বাধীন, কিন্তু সাধারণভাবে নয়। §৪-এর দুই filter-এর সতর্কতা A1, A2 শ্রেণি জানা থাকলে স্বাধীন ধরা হয়েছিল। তবু P(A1) = 0.059, আর মোট সম্ভাবনায় P(A1 ∩ A2) = 0.01 × 0.95² + 0.99 × 0.05² = 0.0115, যেখানে P(A1)² = 0.003481. প্রথম সতর্কতা জানলে দ্বিতীয়টির সম্ভাবনা 0.059 থেকে বেড়ে 23/118 ≈ 0.195 হয়, কারণ প্রথমটি জালিয়াতির সম্ভাবনা বাড়িয়ে দেয়। দুটি সতর্কতার “সাধারণ কারণ” শ্রেণিটি।
- সাধারণভাবে স্বাধীন, কিন্তু শর্তে নয়। দুটি ন্যায্য মুদ্রা: A = “প্রথমটি হেড”, B = “দ্বিতীয়টি হেড” স্বাধীন। কিন্তু C = “দুটির ফল একই” = {HH, TT} দেওয়া থাকলে P(A | C) = P(B | C) = 1/2, অথচ P(A ∩ B | C) = 1/2 ≠ 1/4: এখন প্রথমটি জানলে দ্বিতীয়টি পুরো জানা।
Naive Bayes — Bayes + chain rule + একটি সাহসী অনুমান
বাজারঘরের সাপোর্ট ইনবক্সে আসা বার্তা spam না ham (আসল বার্তা), তা ঠিক করতে চাই। একটি বার্তা শব্দের তালিকা w1, …, wm, আর শ্রেণি c ∈ {spam, ham}. Bayes বলে P(c | w1, …, wm) ∝ P(c) · P(w1, …, wm | c), যেখানে “∝” মানে “সমানুপাতিক”: হর P(w1, …, wm) দুই শ্রেণিতে একই, তাই শেষে দুই শ্রেণির মান যোগ করে ভাগ করলেই হয়। Chain rule-এ ডানের গুণফলটি m-টি জটিল শর্তসাপেক্ষ সম্ভাবনায় ভাঙে, যা অল্প ডেটা থেকে অনুমান করা অসম্ভব। Naive Bayes তাই একটি “সরল” (naive) অনুমান করে: শ্রেণি জানা থাকলে শব্দগুলো conditionally independent. তখন
P(c | w1, …, wm) ∝ P(c) · ∏i=1m P(wi | c)
প্রতিটি P(w | c) গোনা থেকে আসে: শ্রেণি c-এর বার্তায় শব্দ w কতবার এসেছে ÷ সেই শ্রেণির মোট শব্দ। কিন্তু কোনো শব্দ কোনো শ্রেণিতে একবারও না এলে তার সম্ভাবনা 0, আর পুরো গুণফল শূন্য হয়ে যায়। তাই প্রতিটি গণনায় 1 যোগ করা হয় আর হরে শব্দভান্ডারের আকার |V| যোগ হয়: P(w | c) = (count + 1)/(মোট + |V|). একে বলে Laplace smoothing (add-one smoothing). নিচে নিজের বানানো ১০টি ইংরেজি বার্তার ছোট ডেটাসেটে পুরো হিসাবটি Fraction দিয়ে।
from fractions import Fraction as F
from collections import Counter
train = [("spam", "win free coupon now"), ("spam", "free gift click now"),
("spam", "claim your free prize"), ("spam", "win cash now"),
("ham", "your order delivered today"), ("ham", "coupon applied to order"),
("ham", "delivery delayed today"), ("ham", "refund for your order"),
("ham", "order shipped from dhaka"), ("ham", "rate your delivery")]
words = {"spam": Counter(), "ham": Counter()}
docs = Counter()
for label, text in train:
docs[label] += 1
words[label].update(text.split())
vocab = set(words["spam"]) | set(words["ham"])
print("messages:", dict(docs), " vocabulary:", len(vocab))
def p_word(w, label): # Laplace (add-one) smoothing
return F(words[label][w] + 1, sum(words[label].values()) + len(vocab))
def classify(text):
score = {}
for label in ("spam", "ham"):
s = F(docs[label], len(train)) # prior P(label)
for w in text.split():
s *= p_word(w, label) # naive: words independent given label
score[label] = s
total = score["spam"] + score["ham"]
return {k: v / total for k, v in score.items()}
for msg in ("free coupon now", "coupon for your order", "free delivery today"):
post = classify(msg)
print(f"{msg!r:26} P(spam) = {str(post['spam']):>9} = {float(post['spam']):.3f}")আসল আউটপুট (ব্রাউজারের Python):
messages: {'spam': 4, 'ham': 6} vocabulary: 23
'free coupon now' P(spam) = 121500/128359 = 0.947
'coupon for your order' P(spam) = 273375/4443647 = 0.062
'free delivery today' P(spam) = 3375/10234 = 0.330
৪টি spam আর ৬টি ham, তাই prior 2/5 আর 3/5; শব্দভান্ডারে ২৩টি আলাদা শব্দ। “free” তিনটি spam-এ এসেছে, ham-এ একবারও না, তাই “free coupon now” প্রায় ৯৫% spam. “coupon for your order”-এর শব্দগুলো মূলত ham-এর, তাই spam-এর সম্ভাবনা মাত্র ৬% দাঁড়ায়। “free delivery today” মিশ্র: “free” spam-এর দিকে টানে, “delivery” আর “today” ham-এর দিকে, ফল প্রায় ৩৩% সম্ভাবনা। Fraction-এর ভগ্নাংশগুলো দেখায় হিসাবটি কোনো গোলমেলে দশমিক ছাড়াই নিখুঁত। বাস্তব filter-এ হাজার হাজার শব্দের ছোট সম্ভাবনা গুণ করলে সংখ্যা কম্পিউটারের দশমিকে শূন্য হয়ে যায়, তাই সেখানে log নিয়ে যোগ করা হয়। পুরো পদ্ধতি, বাংলা SMS-এর ডেটা আর মূল্যায়ন AI Foundations কোর্সের পর্ব ৫১-এ আছে; Bayes-এর যুক্তি নিয়ে আরও উদাহরণ সেই কোর্সের পর্ব ৫০-এ।
অনুমানটি প্রায় কখনো সত্য নয়: “free” আর “gift” একসঙ্গে আসার প্রবণতা রাখে। তবু naive Bayes প্রায়ই ভালো শ্রেণি বাছে, কারণ শ্রেণি ঠিক করতে সম্ভাবনার সঠিক মান নয়, শুধু কোন শ্রেণির মান বড় তা জানা দরকার। ফলে posterior-এর সংখ্যা (যেমন 0.947) অতিরিক্ত আত্মবিশ্বাসী হতে পারে, যদিও সিদ্ধান্তটি ঠিক থাকে।
৭ · প্রচলিত ভুল — উল্টো শর্ত, আদালতের যুক্তি আর দুই সন্তানের ধাঁধা
ভুল ১: P(A | B) আর P(B | A) গুলিয়ে ফেলা
§১-এ দেখেছেন P(দেরি | বাইরে) = 1/4, কিন্তু P(বাইরে | দেরি) = 10/19. Bayes এই দুইয়ের সম্পর্ক দেয়: P(B | A) = P(A | B) P(B)/P(A). দুটি সমান শুধু তখন, যখন P(A) = P(B), অথবা যখন P(A ∩ B) = 0 হয়। “বেশিরভাগ জালিয়াতি সতর্কতা পায়” আর “বেশিরভাগ সতর্কতা জালিয়াতি” এক কথা নয়; প্রথমটি ৯৫%, দ্বিতীয়টি মাত্র ১৬% সম্ভাবনা।
ভুল ২: Prosecutor's fallacy
বাজারঘরে একটি জালিয়াতির ঘটনায় অপরাধীর ডিভাইসের একটি বৈশিষ্ট্য পাওয়া গেল, যা নিরপরাধ গ্রাহকদের মধ্যে প্রতি ১০,০০০ জনে ১ জনের মেলে। ১০ লাখ গ্রাহকের তালিকা খুঁজে একজনের সঙ্গে মিল পাওয়া গেল। কেউ বললেন, “নিরপরাধ হলে মিলের সম্ভাবনা ১০,০০০-এ ১, তাই এই মানুষটি নিরপরাধ হওয়ার সম্ভাবনা ১০,০০০-এ ১।” এটিই prosecutor's fallacy: P(মিল | নিরপরাধ) ছোট বলে P(নিরপরাধ | মিল) ছোট ধরে নেওয়া। ১০ লাখের মধ্যে ঠিক একজন অপরাধী আর আগে থেকে সবাই সমান সন্দেহভাজন, এই সরল মডেলে Bayes দেয় P(অপরাধী | মিল) = 10000/1009999 ≈ 0.0099, মাত্র ১%-এর মতো। Natural frequency-তে: প্রায় ১০০ জন নিরপরাধের সঙ্গে কাকতালীয় মিল থাকবে, আর অপরাধী মাত্র ১ জন। মিলটি গুরুত্বপূর্ণ প্রমাণ (সন্দেহ ১০ লাখে ১ থেকে প্রায় ১০০-এ ১-এ ওঠে), কিন্তু একা যথেষ্ট নয়।
ভুল ৩: দুই সন্তানের ধাঁধা — তথ্য কীভাবে এল?
একটি পরিবারে দুটি সন্তান; প্রতিটি সন্তান ছেলে (B) বা মেয়ে (G) সমান সম্ভাব্য আর স্বাধীন (একটি সরল মডেল)। (ক) “অন্তত একটি ছেলে” জানা থাকলে দুটিই ছেলে হওয়ার সম্ভাবনা কত? (খ) “বড়টি ছেলে” জানা থাকলে? অনেকে দুই ক্ষেত্রেই 1/2 বলেন। Sample space গুনলে ছবিটি পরিষ্কার।
1Ω = {BB, BG, GB, GG}2“অন্তত একটি B”: GG বাদ3BB / {BB, BG, GB} = 1/34“বড়টি B”: {BB, BG} → 1/25এলোমেলো একজনকে দেখা → 1/2
| বাকি ফল | |
| ওজন | |
| P(BB | তথ্য) |
- সব ফল। বড় সন্তান আগে লিখে Ω = {BB, BG, GB, GG}; সরল মডেলে প্রতিটির সম্ভাবনা 1/4. BG আর GB আলাদা ফল, কারণ কে বড় তা আলাদা।
- তথ্য (ক)। “অন্তত একটি ছেলে” মানে GG বাদ। শর্তসাপেক্ষ সম্ভাবনার নতুন sample space {BB, BG, GB}, তিনটি সমান সম্ভাব্য।
- উত্তর (ক)। তিনটির মধ্যে শুধু BB-তে দুটিই ছেলে: P = 1/3. স্বজ্ঞার 1/2 ভুল, কারণ “অন্তত একটি” কোন সন্তান তা বলে না।
- তথ্য (খ)। “বড়টি ছেলে” মানে বাকি {BB, BG}. এখন উত্তর 1/2: নির্দিষ্ট একটি সন্তান জানা গেলে অন্যটি স্বাধীন।
- তথ্যের উৎস। যদি এলোমেলো একটি সন্তানকে দেখে জানা যায় সে ছেলে, তবে BB-তে তা নিশ্চিত (ওজন ¼ × 1), BG বা GB-তে অর্ধেক সময় (¼ × ½ = ⅛ করে)। P(BB | দেখা) = ¼ ÷ (¼ + ⅛ + ⅛) = 1/2. একই বাক্য, তথ্য পাওয়ার পদ্ধতি ভিন্ন হলে উত্তর ভিন্ন।
আরও অবাক করা একটি রূপ: “অন্তত একটি ছেলে আছে, যে মঙ্গলবারে জন্মেছে।” সপ্তাহের দিনগুলো সমান সম্ভাব্য ধরলে প্রতিটি সন্তানের ১৪ রকম (লিঙ্গ, দিন) জোড়া, পরিবারের ১৪ × ১৪ = ১৯৬টি সমান সম্ভাব্য ফল। নিচের কোড সব গুনে দেখায়, উত্তর 13/27 ≈ 0.48, যা 1/3-এর চেয়ে 1/2-এর অনেক কাছে; আর এলোমেলো একজনকে দেখার প্রক্রিয়া simulation-এ চালায়।
from fractions import Fraction as F
from itertools import product
import random
fam = list(product("BG", repeat=2)) # (older, younger), 4 equally likely
def cond(event, given, omega):
G = [w for w in omega if given(w)]
return F(sum(1 for w in G if event(w)), len(G))
both = lambda w: w[0] == "B" and w[1] == "B"
print("at least one boy:", cond(both, lambda w: "B" in w, fam))
print("older is a boy: ", cond(both, lambda w: w[0] == "B", fam))
days = range(7) # 0 = Tuesday
kids = list(product(product("BG", days), repeat=2)) # 14 x 14 = 196
tue_boy = lambda w: ("B", 0) in w
print("a boy born on Tuesday:", cond(lambda w: w[0][0] == w[1][0] == "B", tue_boy, kids),
" cases:", sum(map(tue_boy, kids)))
random.seed(2) # one random child is shown
seen_boy = bb = 0
for _ in range(100_000):
f = (random.choice("BG"), random.choice("BG"))
if random.choice(f) == "B":
seen_boy += 1
bb += f == ("B", "B")
print(f"random child seen is a boy: {bb}/{seen_boy} = {bb / seen_boy:.4f}")আসল আউটপুট (ব্রাউজারের Python):
at least one boy: 1/3
older is a boy: 1/2
a boy born on Tuesday: 13/27 cases: 27
random child seen is a boy: 24734/49664 = 0.4980
প্রথম দুই লাইন stepper-এর (ক) আর (খ)। তৃতীয় লাইনে ১৯৬টির মধ্যে ২৭টি পরিবারে মঙ্গলবারে জন্মানো অন্তত একটি ছেলে আছে (14 + 14 − 1 = 27, inclusion–exclusion), তার ১৩টিতে দুটিই ছেলে (7 + 7 − 1 = 13 গোনায়)। শর্ত যত নির্দিষ্ট হয়, তত সেটি “একটি নির্দিষ্ট সন্তান” চেনানোর কাছাকাছি যায়, তাই উত্তর 1/2-এর দিকে সরে। শেষ লাইনে seeded simulation: এলোমেলো একজনকে দেখে ছেলে পাওয়া গেলে দুটিই ছেলে হওয়ার অনুপাত 0.4980, তাত্ত্বিক 1/2-এর খুব কাছে, 1/3-এর কাছে নয়।
মূল শিক্ষা: শর্তসাপেক্ষ সম্ভাবনায় “কী জানা গেল” যথেষ্ট নয়, “কীভাবে জানা গেল” সেটিও মডেলের অংশ। পর্ব ৩৮-এর Monty Hall সমস্যাও একই কারণে বিভ্রান্তিকর: উপস্থাপক জেনে-বুঝে দরজা খোলেন বলেই উত্তর বদলায়। আর একটি পুরোনো ভুল: ন্যায্য মুদ্রায় পরপর পাঁচবার হেড এলে পরেরটি “এবার টেল হবেই” ভাবা, যাকে বলে gambler's fallacy. স্বাধীন ছোড়ায় পরের ছোড়ার সম্ভাবনা আগের ফলের ওপর নির্ভর করে না: P(H | আগের পাঁচটি H) = P(H) = 1/2.
৮ · পরীক্ষার অঙ্ক আর সম্ভাবনার একটি ভুল প্রমাণ
বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর লিখিত পরীক্ষায় এই পর্বের ধাঁচে যে অঙ্ক আসে, তার কয়েকটি পূর্ণ সমাধান। প্রতিটি সংখ্যা scratch-এ Fraction দিয়ে গুনে মেলানো।
অঙ্ক ১: দুটি ছক্কা, যোগফল জানা
দুটি ন্যায্য ছক্কা ছোড়া হলো, যোগফল 8. অন্তত একটিতে 6 পড়ার সম্ভাবনা কত?
- নতুন sample space: যোগফল 8 এমন ক্রমযুক্ত জোড়া (2, 6), (3, 5), (4, 4), (5, 3), (6, 2), মোট ৫টি, সমান সম্ভাব্য।
- অন্তত একটি 6: (2, 6) আর (6, 2), ২টি।
- উত্তর 2/5. (শর্ত ছাড়া অন্তত একটি 6-এর সম্ভাবনা 11/36 ≈ 0.31, আর এখানে 0.4.)
অঙ্ক ২: দুটি বাক্স, উল্টো প্রশ্ন
বাক্স ১-এ ৩টি লাল আর ২টি নীল কুপন, বাক্স ২-এ ১টি লাল আর ৪টি নীল। একটি বাক্স সমান সম্ভাবনায় বেছে একটি কুপন তোলা হলো; সেটি লাল। বাক্সটি ১ নম্বর হওয়ার সম্ভাবনা কত?
- মোট সম্ভাবনা: P(লাল) = (1/2)(3/5) + (1/2)(1/5) = 3/10 + 1/10 = 2/5.
- Bayes: P(বাক্স ১ | লাল) = (3/10)/(2/5) = 3/4.
অঙ্ক ৩: স্বাধীন কি না
P(A) = 0.5, P(B) = 0.4, P(A ∪ B) = 0.7. A আর B কি স্বাধীন? P(A | B) কত?
- Inclusion–exclusion (পর্ব ৩৮): P(A ∩ B) = 0.5 + 0.4 − 0.7 = 0.2.
- P(A)P(B) = 0.5 × 0.4 = 0.2 = P(A ∩ B), তাই স্বাধীন।
- P(A | B) = 0.2/0.4 = 0.5 = P(A), উপপাদ্য ৫.২(ক)-এর সঙ্গে মিল।
প্রমাণের ভুল ধরুন: “বিচ্ছিন্ন ঘটনা স্বাধীন”
একজন লিখলেন: “দাবি: A আর B পরস্পর বিচ্ছিন্ন হলে স্বাধীন। প্রমাণ: A আর B-এর কোনো সাধারণ ফল নেই, তাই B ঘটা A সম্পর্কে কোনো তথ্য দেয় না। ফলে P(A | B) = P(A), আর উপপাদ্য ৫.২(ক) অনুযায়ী তারা স্বাধীন। ∎” ভুলটি নিজে খুঁজুন।
ভুল কোথায়: দ্বিতীয় বাক্যটি একটি অপ্রমাণিত স্বজ্ঞা, আর তা উল্টো। B ঘটলে A ঘটেনি, এটি জানা যায়; তাই P(A | B) = P(A ∩ B)/P(B) = 0/P(B) = 0, যা P(A) > 0 হলে P(A)-এর সমান নয়। Counterexample: একটি ছক্কায় A = {1}, B = {2}: P(A ∩ B) = 0, কিন্তু P(A)P(B) = 1/36. সঠিক বক্তব্য উপপাদ্য ৫.২(গ): দুটির সম্ভাবনা ধনাত্মক হলে বিচ্ছিন্ন ঘটনা কখনোই স্বাধীন নয়। (একটির সম্ভাবনা 0 হলে দুই পাশই 0, তখন তারা স্বাধীন; এই কোণটিও মনে রাখুন।) শিক্ষা: “তথ্য দেয় না” জাতীয় কথা প্রমাণ নয়; সংজ্ঞার সমীকরণে বসিয়ে দেখুন।
আরও গভীরে: P(B) = 0 হলেও কিছু ক্ষেত্রে শর্ত বসানো দরকার হয়, যেমন continuous মডেলে “X ঠিক 2.5 হলে”; সেখানে Kolmogorov-এর measure-theoretic conditional expectation লাগে, আর সীমা কীভাবে নেওয়া হয় তার ওপর উত্তর বদলাতে পারে (Borel–Kolmogorov paradox নামে পরিচিত)। Conditional independence-এর জাল দিয়ে বহু চলকের মডেল ছোট করে লেখা হয়, যাকে Bayesian network বলে; কোন চলক কোনটির থেকে শর্তে স্বাধীন তা গ্রাফ দেখে পড়ার নিয়ম d-separation. আর pairwise independence নিয়ে কম্পিউটার বিজ্ঞানে একটি পুরো তত্ত্ব আছে: অল্প কয়েকটি এলোমেলো বিট থেকে অনেকগুলো pairwise independent বিট বানিয়ে randomized algorithm-কে derandomize করা।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- একটি রোগ ২% মানুষের; পরীক্ষা ৯০% রোগী ধরে, ১০% সুস্থকে ভুলে positive বলে। Positive হলে রোগ থাকার সম্ভাবনা? 0.018/0.116 = 9/58 ≈ 0.155.
- দুই সন্তানের অন্তত একটি ছেলে; দুটিই ছেলে হওয়ার সম্ভাবনা? 1/3 (বড়টি ছেলে বললে 1/2).
- পরস্পর বিচ্ছিন্ন, ধনাত্মক সম্ভাবনার দুটি event কি স্বাধীন? কখনো না: P(A ∩ B) = 0 ≠ P(A)P(B).
- তিনটি event-এর mutual independence-এ কয়টি সমীকরণ? 2³ − 3 − 1 = 4.
- ৬০% পণ্য কারখানা X-এর (ত্রুটি ১%), ৪০% Y-এর (ত্রুটি ২%); একটি পণ্য ত্রুটিপূর্ণ হওয়ার সম্ভাবনা? 0.006 + 0.008 = 0.014.
৯ · AI-এর যুগে — সম্ভাবনার প্রমাণ আর উত্তর যাচাই
সম্ভাবনার প্রশ্নে AI সহকারী প্রায়ই চমৎকার ভাষায় উত্তর দেয়, কিন্তু ভুল লুকিয়ে থাকে মডেল বাছাইয়ে বা একটি শর্তের দিক উল্টে যাওয়ায়। এই পর্বের বিষয়ে কয়েকটি ভুল নিয়মিত দেখা যায়:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| P(E | H)-কে P(H | E) বলা, base rate বাদ দিয়ে “৯৫%” উত্তর | ১০,০০০ জনের natural frequency টেবিল নিজে বানান |
| Pairwise থেকে mutual independence দাবি, বা “বিচ্ছিন্ন তাই স্বাধীন” | দুটি মুদ্রা আর XOR-এর মতো ছোট Ω-তে সব সমীকরণ গুনুন |
| “না ফিরিয়ে” তোলায় স্বাধীনতা ধরে (17/20)3 লেখা | C(n, k) দিয়ে একই উত্তর আসে কি না মেলান |
| Two-child বা Monty Hall-এ তথ্য পাওয়ার প্রক্রিয়া উপেক্ষা | প্রক্রিয়াটি কোডে লিখে seeded simulation চালান |
| Bayes-এ partition অসম্পূর্ণ, ফলে posterior-গুলোর যোগ 1 নয় | সব posterior যোগ করে 1 আসে কি না দেখুন |
| শর্ত বাদ দিয়ে উপপাদ্য (P(B) > 0) বা বানানো গবেষণা আর পরিসংখ্যান | প্রতিটি শর্ত আলাদা করে চান; উৎস নিজে খুলে মেলান |
AI-এর কাছে সম্ভাবনার সমাধান চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে পরীক্ষা করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
সম্ভাবনার ভুল ধরার সবচেয়ে সস্তা উপায় হলো সংখ্যা গোনা: ১০,০০০ জনের টেবিল, অথবা ছোট Ω-এর প্রতিটি ফল। AI যত আত্মবিশ্বাসী ভাষাই দিক, এক মিনিটের গণনা প্রায় প্রতিটি উল্টো শর্ত আর হারানো base rate ধরে ফেলে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Bayes নিজে কি “Bayes-এর উপপাদ্য” আজকের রূপে লিখেছিলেন? এই ধারণা কার হাতে কীভাবে আজকের চেহারা পেল?
Thomas Bayes ছিলেন ইংল্যান্ডের একজন প্রেসবিটেরিয়ান যাজক আর শৌখিন গণিতবিদ, যিনি ১৭৬১ সালে মারা যান। তাঁর মৃত্যুর পর বন্ধু Richard Price তাঁর কাগজপত্র থেকে একটি প্রবন্ধ খুঁজে পান, সম্পাদনা করেন আর ১৭৬৩ সালে Royal Society-তে পাঠান; প্রবন্ধটির নাম “An Essay towards solving a Problem in the Doctrine of Chances” নামের লেখা। সেখানে Bayes একটি নির্দিষ্ট প্রশ্নের উত্তর খোঁজেন: কোনো ঘটনা কয়েকবার ঘটেছে আর কয়েকবার ঘটেনি দেখলে, তার অজানা সম্ভাবনা একটি নির্দিষ্ট পরিসরে থাকার সম্ভাবনা কত। অর্থাৎ ফল থেকে কারণের দিকে, উল্টো দিকে যুক্তি। আজকের ছোট সূত্র P(H | E) = P(E | H)P(H)/P(E) তিনি এই আকারে লেখেননি; তাঁর যুক্তি ছিল একটি বিলিয়ার্ড টেবিলে বল গড়ানোর জ্যামিতিক মডেলে, আর একটি সমান (uniform) prior ধরে।
সাধারণ রূপটি দাঁড় করান ফরাসি গণিতবিদ Pierre-Simon Laplace. তিনি ১৭৭৪ সালের একটি প্রবন্ধে, সম্ভবত Bayes-এর লেখা না জেনেই, “কারণের সম্ভাবনা” নীতিটি বলেন, আর পরে বহু প্রয়োগে (জ্যোতির্বিজ্ঞানের পর্যবেক্ষণ, জন্মের ছেলে-মেয়ের অনুপাত) এটি ব্যবহার করেন; তাঁর বড় বই Théorie analytique des probabilités ১৮১২ সালে প্রকাশিত। বহু ইতিহাসবিদের মতে আজ যাকে “Bayesian” পদ্ধতি বলা হয়, তার বেশিরভাগ কাজ Laplace-এর, আর নামটি এসেছে মূলত বিংশ শতাব্দীতে।
এই পর্বের দৃষ্টিতে উপপাদ্যটি আসলে খুব সরল: সংজ্ঞা ১.১ দুইভাবে লিখে সমান করা, আর হরে মোট সম্ভাবনা। বিতর্কটি গণিত নিয়ে নয়, prior নিয়ে: বিজ্ঞানে অজানা একটি পরিমাণের ওপর সম্ভাবনা বসানো কতটা ন্যায্য, তা নিয়ে বিংশ শতাব্দী জুড়ে “Bayesian” আর “frequentist” চিন্তাধারার দীর্ঘ তর্ক চলেছে। Discrete math-এর পাঠকের জন্য শিক্ষাটি হলো, Bayes-এর উপপাদ্য নিজে প্রমাণিত সত্য; কিন্তু তাতে কোন prior বসানো হলো, সেটি একটি মডেলিং সিদ্ধান্ত, যা স্পষ্ট করে বলতে হয়।
মূল উপলব্ধি: সূত্রটি দুই লাইনের প্রমাণ, কিন্তু উল্টো দিকে যুক্তি করার ধারণাটি দুই শতাব্দী ধরে Bayes, Price আর Laplace-এর হাত ঘুরে আজকের আকার পেয়েছে, আর prior বাছাই এখনো সচেতন সিদ্ধান্ত।
প্র ০২আদালতে সম্ভাবনার ভুল ব্যবহার কীভাবে গুরুতর অবিচার ঘটাতে পারে? “prosecutor's fallacy” আর independence-এর ভুল অনুমান একসঙ্গে কোথায় দেখা গেছে?
“Prosecutor's fallacy” নামটি সাধারণত মনোবিজ্ঞানী William Thompson আর Edward Schumann-এর ১৯৮৭ সালের একটি প্রবন্ধের সঙ্গে যুক্ত করা হয়, যেখানে তাঁরা দেখান মানুষ “নিরপরাধ হলে এই প্রমাণ পাওয়ার সম্ভাবনা” আর “এই প্রমাণ পেলে নিরপরাধ হওয়ার সম্ভাবনা” প্রায়ই গুলিয়ে ফেলে। §৭-এর উদাহরণে প্রথমটি ১০,০০০-এ ১, কিন্তু বড় জনসংখ্যা থেকে খুঁজে পেলে দ্বিতীয়টি প্রায় ৯৯% পর্যন্ত হতে পারে। পার্থক্যটি আসে prior থেকে: খোঁজার আগে একজন নির্দিষ্ট মানুষের অপরাধী হওয়ার সম্ভাবনা কত ছিল।
সবচেয়ে বহুল আলোচিত উদাহরণ যুক্তরাজ্যের Sally Clark মামলা। তাঁর দুটি শিশুসন্তান শৈশবেই মারা যায়, আর ১৯৯৯ সালে তিনি হত্যার দায়ে দণ্ডিত হন। বিচারে একজন বিশেষজ্ঞ সাক্ষী দাবি করেন, এমন পরিবারে একটি শিশুর আকস্মিক মৃত্যুর (SIDS) সম্ভাবনা প্রায় ৮,৫০০-এ ১, তাই দুটির সম্ভাবনা তার বর্গ, প্রায় ৭.৩ কোটিতে ১। এখানে দুটি ভুল একসঙ্গে। প্রথমত, বর্গ করা মানে দুটি মৃত্যুকে স্বাধীন ধরা; অথচ একই পরিবারে জিনগত বা পরিবেশগত সাধারণ কারণ থাকতে পারে, ঠিক যেমন §৬-এ দুটি সতর্কতা সাধারণ কারণের জন্য স্বাধীন নয়। দ্বিতীয়ত, ছোট সংখ্যাটিকে নির্দোষ হওয়ার সম্ভাবনা হিসেবে উপস্থাপনের ঝুঁকি: আসলে তুলনা করতে হতো দুটি বিকল্প ব্যাখ্যার (দুটি স্বাভাবিক মৃত্যু বনাম দুটি হত্যা) সম্ভাবনা, আর দুই শিশু হত্যাও অত্যন্ত বিরল। Royal Statistical Society ২০০১ সালে পরিসংখ্যানের এই অপব্যবহার নিয়ে প্রকাশ্য বিবৃতি দেয়, আর আপিলে ২০০৩ সালে দণ্ড বাতিল হয় (বাতিলের প্রধান কারণ ছিল চিকিৎসা-প্রমাণ গোপন থাকা, তবে পরিসংখ্যানের সমালোচনাও রায়ে আসে)।
এই মামলা পড়ার সময় সংবেদনশীল থাকুন: এটি একটি বাস্তব পরিবারের ট্র্যাজেডি। গণিতের শিক্ষাটি স্পষ্ট: গুণ করার আগে স্বাধীনতা যাচাই, আর P(E | H)-কে কখনো P(H | E) বলবেন না। একই ভুল আজ ডেটা-চালিত সিস্টেমেও ঘটে, যেমন ফেসিয়াল রিকগনিশনের একটি “মিল”-কে প্রায় নিশ্চিত পরিচয় ধরে নেওয়া।
মূল উপলব্ধি: ছোট likelihood ছোট posterior নয়, আর স্বাধীনতা না জেনে সম্ভাবনা গুণ করা যায় না; এই দুই ভুল একসঙ্গে মানুষের জীবনে গভীর ক্ষতি করেছে।
প্র ০৩দুই সন্তানের ধাঁধার উত্তর 1/3 না 1/2, তা নিয়ে দশকের পর দশক তর্ক কেন হয়েছে? এখানে গণিত ভুল, নাকি প্রশ্ন অস্পষ্ট?
ধাঁধাটি জনপ্রিয় হয় Martin Gardner-এর মাধ্যমে, যিনি Scientific American পত্রিকার গাণিতিক খেলার কলামে ১৯৫৯ সালে এটি প্রকাশ করেন। প্রথমে তিনি “অন্তত একটি ছেলে” প্রশ্নে 1/3 উত্তর দেন, পরে নিজেই স্বীকার করেন যে প্রশ্নটি অস্পষ্ট: তথ্যটি কীভাবে পাওয়া গেল তার ওপর উত্তর নির্ভর করে। যদি দুই সন্তানের সব পরিবার থেকে “অন্তত একটি ছেলে আছে” এমন পরিবার বেছে নেওয়া হয়, উত্তর 1/3. কিন্তু যদি একটি পরিবারে এলোমেলোভাবে একজন সন্তানের দেখা মেলে আর সে ছেলে হয়, উত্তর 1/2. এই পর্বের stepper আর কোড দুটিই দেখিয়েছে।
পরে মনোবিজ্ঞানী Maya Bar-Hillel আর Ruma Falk (১৯৮২ সালের দিকে) দেখান, এমন ধাঁধায় মানুষের ভুলের মূলে থাকে “তথ্য-প্রক্রিয়া” উপেক্ষা করা, অর্থাৎ শুধু “কী জানলাম” দেখা, “কেন এটিই জানলাম” নয়। ২০১০ সালে Gary Foshee নামে একজন ধাঁধা-নির্মাতা Gardner-এর স্মরণে আয়োজিত একটি সম্মেলনে “মঙ্গলবারে জন্মানো ছেলে” রূপটি উপস্থাপন করেন বলে বিভিন্ন সূত্রে উল্লেখ আছে, যার উত্তর 13/27 আবার অনেককে চমকে দেয়।
গণিতের ভাষায় তর্কটি sample space আর সম্ভাবনা মাপ বাছাই নিয়ে, শর্তসাপেক্ষ সম্ভাবনার সূত্র নিয়ে নয়। একবার মডেল ঠিক হলে (কোন ফল, কোন ওজন, কোন event-এ শর্ত) উত্তর অনন্য, আর ১৯৬টি ফল গুনে বা simulation-এ নিশ্চিত করা যায়। তর্ক বাঁধে কারণ সাধারণ ভাষার একটি বাক্য একাধিক মডেলে অনুবাদ হয়। বাস্তব জীবনেও এমন হয়: একটি জরিপে “উত্তরদাতাদের ৬০% রাজি” শুনলে আগে জানতে হয় উত্তরদাতা কীভাবে বাছা হলো।
আরেকটি সূক্ষ্মতা: “ছেলে বা মেয়ে সমান সম্ভাব্য আর স্বাধীন” নিজেই একটি সরল মডেল। বাস্তব জন্মে অনুপাত হুবহু ৫০:৫০ নয় আর যমজের মতো নির্ভরতাও আছে; ধাঁধার শিক্ষা মডেলের ভেতরে, বাস্তব জনসংখ্যার দাবি নয়।
মূল উপলব্ধি: শর্তসাপেক্ষ সম্ভাবনায় তথ্যের উৎস মডেলের অংশ; অস্পষ্ট প্রশ্নের একাধিক সঠিক উত্তর থাকতে পারে, তাই আগে sample space আর শর্ত স্পষ্ট করে লিখুন।
প্র ০৪Pairwise independence যদি mutual independence-এর চেয়ে দুর্বল হয়, তবে কম্পিউটার বিজ্ঞানে কেন এটি এত মূল্যবান?
Pairwise কিন্তু mutual নয়, এমন উদাহরণের ধারণা পুরোনো; একটি চতুস্তলকের (tetrahedron) চার পাশে রং দেওয়া একটি উদাহরণ রুশ গণিতবিদ Sergei Bernstein-এর নামে পরিচিত, আর §৫-এর দুই মুদ্রা ও XOR তারই আরেক রূপ। প্রথম দেখায় এটি শুধু একটি সতর্কবার্তা: “সব জোড়া স্বাধীন” দেখে নিশ্চিন্ত হবেন না। কিন্তু কম্পিউটার বিজ্ঞানে উল্টো দিকটিই কাজে লাগে: অনেক প্রমাণে পূর্ণ independence লাগে না, pairwise-ই যথেষ্ট, আর pairwise independent এলোমেলোতা বানানো অনেক সস্তা।
একটি উদাহরণ: k-টি সত্যিকারের এলোমেলো বিট থেকে প্রতিটি অশূন্য উপসেটের XOR নিলে 2k − 1টি বিট পাওয়া যায়, যারা প্রত্যেকে ন্যায্য আর জোড়ায় জোড়ায় স্বাধীন, কিন্তু mutually নয়। মাত্র k বিটের “বীজ” থেকে সূচকীয় সংখ্যক বিট! পর্ব ৪১-এ দেখবেন, স্বাধীন চলকের যোগফলের variance আলাদা variance-এর যোগ, আর এর প্রমাণে শুধু জোড়ায় জোড়ায় স্বাধীনতা লাগে। তাই Chebyshev-এর অসমতা দিয়ে যে প্রমাণ, তা pairwise independent নমুনাতেই চলে। ফলে randomized algorithm-কে অল্প কয়েকটি বীজের ওপর চালিয়ে সব বীজ পরীক্ষা করলে নিশ্চিত (deterministic) algorithm পাওয়া যায়, যাকে derandomization বলে।
Hashing-এও একই ধারণা। J. Lawrence Carter আর Mark Wegman ১৯৭০-এর দশকের শেষে universal hashing-এর ধারণা দেন, আর পরের কাজে “strongly universal” পরিবারের কথা আসে, যেখানে আলাদা দুটি key-এর hash মান জোড়ায় জোড়ায় স্বাধীন আর সমবণ্টিত। p মৌলিক আর a, b এলোমেলোভাবে {0, …, p − 1} থেকে বাছা হলে h(x) = (a·x + b) mod p ধরনের সরল সূত্রই এমন পরিবার দেয় (পর্ব ২৬-এ hashing-এর সংখ্যাতত্ত্ব)। Hash table-এ প্রত্যাশিত collision গোনার জন্য দুটি key-এর আচরণই যথেষ্ট, তাই pairwise independence দিয়েই গ্যারান্টি মেলে; পর্ব ৪২-এ এর হিসাব আসবে। বাস্তবে কোন পরিবার কতটা স্বাধীনতা দেয় আর কোথায় তা যথেষ্ট নয় (যেমন কিছু hashing কৌশলে আরও বেশি স্বাধীনতা লাগে), তা নিয়ে এখনো গবেষণা চলে।
মূল উপলব্ধি: দুর্বল স্বাধীনতা মানে কম এলোমেলো বিট; যে প্রমাণে শুধু জোড়ার আচরণ লাগে, সেখানে pairwise independence দিয়ে সস্তায় আর কখনো নিশ্চিতভাবে কাজ সারা যায়।
প্র ০৫Naive Bayes-এর মূল অনুমান প্রায় সবসময় ভুল, তবু spam filter হিসেবে এটি এত সফল হলো কেন?
Email-এ Bayes-ভিত্তিক filter-এর প্রথম দিকের গবেষণার মধ্যে প্রায়ই উল্লেখ করা হয় Mehran Sahami ও সহকর্মীদের ১৯৯৮ সালের একটি প্রবন্ধ, যেখানে junk e-mail ছাঁকতে Bayesian পদ্ধতি পরীক্ষা করা হয়। ২০০২ সালে প্রোগ্রামার ও লেখক Paul Graham-এর “A Plan for Spam” প্রবন্ধটি ধারণাটিকে ব্যাপক জনপ্রিয় করে; এরপর বহু email প্রোগ্রাম আর মুক্ত সফটওয়্যারে শব্দ-গোনা ভিত্তিক Bayesian filter আসে। (Graham-এর পদ্ধতি হুবহু পাঠ্যবইয়ের naive Bayes নয়, তবে মূল ধারণা একই: প্রতিটি শব্দ spam-এর পক্ষে বা বিপক্ষে কতটা প্রমাণ দেয়।)
অনুমানটি কেন ভুল তা স্পষ্ট: “free” আর “gift”, বা “order” আর “delivery” একসঙ্গে আসে, তাই শ্রেণি জানা থাকলেও শব্দগুলো স্বাধীন নয়। ফলে naive Bayes একই দিকের প্রমাণ বারবার গুনে posterior-কে চরম দিকে (0 বা 1-এর কাছে) ঠেলে দেয়। তবু শ্রেণি বাছাই প্রায়ই ঠিক থাকে, কারণ সিদ্ধান্তে লাগে শুধু কোন শ্রেণির স্কোর বড়। Pedro Domingos আর Michael Pazzani ১৯৯৭ সালের একটি প্রবন্ধে বিশ্লেষণ করেন, কোন অবস্থায় অনুমান ভাঙলেও এই তুলনা ঠিক থাকে। সুবিধাগুলোও বড়: প্রশিক্ষণ মানে শুধু গোনা, অল্প ডেটায় কাজ করে, নতুন বার্তা এলে গণনা হালনাগাদ করা সহজ, আর প্রতিটি শব্দের অবদান পড়া যায়।
বাস্তবে আরও দুটি কারিগরি দিক জরুরি। প্রথমত, কোড ব্লকে দেখা Laplace smoothing; না দিলে প্রশিক্ষণে না দেখা একটি শব্দই পুরো গুণফলকে শূন্য করে দেয়। দ্বিতীয়ত, হাজার শব্দের ছোট সম্ভাবনার গুণফল floating point-এ শূন্য হয়ে যায় (underflow), তাই log নিয়ে যোগ করা হয়। আর spam প্রেরকেরা filter ফাঁকি দিতে শব্দ বদলায়, তাই আধুনিক ব্যবস্থা naive Bayes-এর সঙ্গে আরও অনেক সংকেত আর মডেল মেলায়। তবু অনেক ক্ষেত্রে নতুন মডেলের তুলনার একটি দ্রুত, শক্ত baseline হিসেবে এটি এখনো ব্যবহৃত হয়।
মূল উপলব্ধি: ভুল অনুমানের মডেলও কাজের হতে পারে, যদি আপনি জানেন সেটি কী ঠিক করে (শ্রেণির ক্রম) আর কী ঠিক করে না (সম্ভাবনার সঠিক মান)।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: A আর B স্বাধীন হলে প্রমাণ করুন Aᶜ আর Bᶜ-ও স্বাধীন। (উপপাদ্য ৫.২(খ) ব্যবহার করতে পারেন, অথবা De Morgan-এর নিয়ম দিয়ে সরাসরি।)
পদ্ধতি ১ (উপপাদ্য ৫.২(খ) দুবার):
- A, B স্বাধীন ⇒ A, Bᶜ স্বাধীন। — উপপাদ্য ৫.২(খ)
- স্বাধীনতার সংজ্ঞা প্রতিসম, তাই Bᶜ, A স্বাধীন; আবার একই উপপাদ্যে Bᶜ, Aᶜ স্বাধীন। ∎ — প্রতিসাম্য, উপপাদ্য ৫.২(খ)
পদ্ধতি ২ (সরাসরি):
- Aᶜ ∩ Bᶜ = (A ∪ B)ᶜ. — De Morgan, পর্ব ১৫
- P(Aᶜ ∩ Bᶜ) = 1 − P(A ∪ B) = 1 − P(A) − P(B) + P(A)P(B). — complement, inclusion–exclusion, স্বাধীনতা
- ডান পাশ = (1 − P(A))(1 − P(B)) = P(Aᶜ)P(Bᶜ). ∎ — উৎপাদকে বিশ্লেষণ
-
হিসাব: বাজারঘরের ইনবক্সে ২০% বার্তা spam. “free” শব্দটি ৬০% spam-এ আর ৫% ham-এ থাকে। (ক) “free” থাকলে বার্তাটি spam হওয়ার সম্ভাবনা কত? (খ) “free” না থাকলে? উত্তর ভগ্নাংশে দিন আর ১০,০০০ বার্তার natural frequency দিয়ে মেলান।
(ক) P(free) = 0.2 × 0.6 + 0.8 × 0.05 = 0.12 + 0.04 = 0.16; P(spam | free) = 0.12/0.16 = 3/4.
(খ) P(free নেই) = 0.2 × 0.4 + 0.8 × 0.95 = 0.08 + 0.76 = 0.84; P(spam | free নেই) = 0.08/0.84 = 2/21 ≈ 0.095.
Natural frequency: ১০,০০০ বার্তায় ২,০০০ spam (১,২০০টিতে “free”, ৮০০টিতে নেই) আর ৮,০০০ ham (৪০০টিতে “free”, ৭,৬০০টিতে নেই)। “free” আছে ১,৬০০টিতে, তার ১,২০০ spam = 3/4; নেই ৮,৪০০টিতে, তার ৮০০ spam = 2/21. দুটি উত্তরই scratch-এ Fraction দিয়ে মেলানো।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
from fractions import Fraction as F from itertools import product dice = list(product(range(1, 7), repeat=2)) A = [d for d in dice if sum(d) == 7] B = [d for d in dice if d[0] == 3] AB = [d for d in A if d in B] P = lambda E: F(len(E), 36) print(P(A), P(B), P(AB)) print(P(AB) == P(A) * P(B), P(AB) / P(B))1/6 1/6 1/36 True 1/6যোগফল 7 হয় ৬টি জোড়ায়, তাই P(A) = 6/36 = 1/6; প্রথম ছক্কা 3 হয় ৬টি জোড়ায়, P(B) = 1/6. দুটিই ঘটে শুধু (3, 4)-এ, P(A ∩ B) = 1/36 = (1/6)(1/6), তাই স্বাধীন, আর P(A | B) = 1/6 = P(A). অবাক হওয়ার মতো: প্রথম ছক্কা যা-ই হোক, যোগফল 7 করার মতো দ্বিতীয় ছক্কার ঠিক একটি মান থাকে। যোগফল 8 নিলে এটি ভাঙে (প্রথমটি 1 হলে অসম্ভব)। আউটপুট CPython-এ চালিয়ে মেলানো।
-
প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: A, B, C pairwise independent হলে mutually independent. প্রমাণ: P(A ∩ B ∩ C) = P(A ∩ (B ∩ C)). A, B-এর সঙ্গে স্বাধীন আর C-এর সঙ্গেও স্বাধীন, তাই A, B ∩ C-এর সঙ্গেও স্বাধীন। ফলে P(A ∩ B ∩ C) = P(A) P(B ∩ C) = P(A) P(B) P(C). ∎” কোথায় ভুল?
- ভুল ধাপ: “A, B-এর সঙ্গে আর C-এর সঙ্গে আলাদাভাবে স্বাধীন, তাই B ∩ C-এর সঙ্গেও স্বাধীন”। এর কোনো প্রমাণ নেই, আর এটি মিথ্যা। B আর C একসঙ্গে ঘটলে যে তথ্য আসে, তা আলাদা আলাদা তথ্যের চেয়ে বেশি হতে পারে।
- Counterexample: দুটি মুদ্রা, A = প্রথমটি হেড, B = দ্বিতীয়টি হেড, C = ঠিক একটি হেড। প্রতিটি জোড়া স্বাধীন, কিন্তু B ∩ C = {TH}, আর A ∩ B ∩ C = ∅: P = 0 ≠ 1/8. B ∩ C জানলে A নিশ্চিতভাবে ঘটেনি।
- শিক্ষা: mutual independence-এর সংজ্ঞায় ত্রয়ীর সমীকরণটি আলাদা শর্ত; জোড়ার সমীকরণ থেকে তা আসে না। প্রমাণে “স্পষ্টতই” লেখা প্রতিটি ধাপ ছোট উদাহরণে পরীক্ষা করুন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমNatural frequency দিয়ে “সতর্কতা পেলে জালিয়াতির সম্ভাবনা” বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- একটি বড় সংখ্যা ধরা, যেমন ১০,০০০টি অর্ডার
- Base rate দিয়ে ভাগ: কয়টি জালিয়াতি, কয়টি সৎ
- Sensitivity দিয়ে জালিয়াতির মধ্যে সতর্কতা গোনা
- False positive-এর হার দিয়ে সৎ অর্ডারের মধ্যে ভুল সতর্কতা গোনা
- দুই দলের সতর্কতা যোগ করে মোট সতর্কতা
- জালিয়াতির সতর্কতা ÷ মোট সতর্কতা
P(A) = 0.3, P(B) = 0.5 আর P(A ∩ B) = 0.15 হলে P(A | B) কত?
- 0.15
- 0.3
- 0.5
- 0.45
একটি রোগ ২% মানুষের আছে। একটি পরীক্ষা রোগীদের ৯০%-কে positive বলে, আর সুস্থদের ১০%-কেও ভুলে positive বলে। একজনের ফল positive এলে তাঁর রোগ থাকার সম্ভাবনা প্রায় কত?
- ৯০%
- ৫০%
- প্রায় ১৫.৫%
- ২%
একটি পরিবারে দুটি সন্তান, প্রতিটি ছেলে বা মেয়ে সমান সম্ভাব্য আর স্বাধীন। “অন্তত একটি ছেলে” জানা থাকলে দুটিই ছেলে হওয়ার সম্ভাবনা কত?
- 1/3
- 1/2
- 1/4
- 2/3
A আর B পরস্পর বিচ্ছিন্ন (A ∩ B = ∅), আর P(A) > 0, P(B) > 0. তাদের independence সম্পর্কে কোনটি সত্য?
- সবসময় স্বাধীন
- P(A) = P(B) হলে স্বাধীন
- তথ্য যথেষ্ট নয়
- কখনোই স্বাধীন নয়
তিনটি event A, B, C mutually independent দেখাতে মোট কয়টি গুণের সমীকরণ যাচাই করতে হয়?
- ৩টি
- ৪টি
- ৭টি
- ৮টি
একটি দোকানের পণ্যের ৬০% কারখানা X থেকে (ত্রুটির হার ১%) আর ৪০% কারখানা Y থেকে আসে (ত্রুটির হার ২%), এমন ধরা হলো। এলোমেলো একটি পণ্য ত্রুটিপূর্ণ হওয়ার সম্ভাবনা কত?
- 0.015
- 0.03
- 0.014
- 0.008
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- শর্তসাপেক্ষ সম্ভাবনা: P(A | B) = P(A ∩ B)/P(B), P(B) > 0; B-ই নতুন sample space, আর P( · | B) নিজেই একটি সম্ভাবনা মাপ।
- গুণ, chain আর মোট সম্ভাবনা: P(A ∩ B) = P(B)P(A | B); ধাপে ধাপে গুণ; partition-এর পথগুলো যোগ করলে P(A) = ∑ P(A | Bi)P(Bi).
- Bayes: posterior = likelihood × prior ÷ মোট; odds রূপে posterior odds = prior odds × likelihood ratio. Base rate কখনো বাদ নয়; সন্দেহ হলে ১০,০০০ জন গুনুন।
- Independence: P(A ∩ B) = P(A)P(B); বিচ্ছিন্ন হলে (ধনাত্মক সম্ভাবনায়) স্বাধীন নয়; pairwise থেকে mutual আসে না (দুই মুদ্রা আর XOR); conditional independence আলাদা ধারণা, যার ওপর naive Bayes দাঁড়িয়ে।
- ভুল এড়ান: শর্তের দিক উল্টাবেন না, likelihood-কে posterior বলবেন না, আর তথ্য কীভাবে এল তা মডেলে রাখুন। প্রতিটি উত্তর Fraction-এ গুনে আর seeded simulation-এ মেলান।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৪০ · Random variable আর প্রত্যাশা — linearity-র জাদুপরবর্তী পর্বRandom variable, pmf, expectation আর indicator variable.
- পর্ব ৩৮ · বিচ্ছিন্ন সম্ভাবনা — sample space, event আর Laplace-এর সংজ্ঞাপুনরালোচনাস্বতঃসিদ্ধ, complement, union bound আর Monty Hall.
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- AI Foundations · পর্ব ৫০ · Bayes-এর উপপাদ্য — প্রমাণ পেলে বিশ্বাস হালনাগাদপ্রয়োগAI-তে Bayes-এর যুক্তি আর বিশ্বাস হালনাগাদ।
- AI Foundations · পর্ব ৫১ · Naive Bayes — বাংলা SMS-কে spam না ham বলাকোডে প্রয়োগপূর্ণ naive Bayes classifier আর তার মূল্যায়ন।
- AI Foundations · পর্ব ৩৫ · AI-এর জন্য সম্ভাবনা — event, conditional আর independenceডেটায় সম্ভাবনাpandas-এর টেবিলে conditional probability.