نظرية بايز بلغة واضحة
طبّق مثالًا ملموسًا لاختبار طبي لبناء حدس حول الاحتمالات السابقة والمرجّحة واللاحقة من دون رياضيات معقدة
نظرية بايز بلغة واضحة درس مجاني في Machine Learning Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Machine Learning Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Machine Learning Academy 4 دروس في المجموع.
ما نظرية Bayes؟
نظرية Bayes قاعدة رياضية لتحديث المعتقدات في ضوء أدلة جديدة. وهي تجيب عن السؤال التالي: إذا لاحظت X، فما مدى احتمال الفرضية H؟ والصيغة هي: P(H|X) = P(X|H) * P(H) / P(X). وبعبارة بسيطة، يساوي الاحتمال اللاحق لـ H بالنظر إلى X احتمال ملاحظة X إذا كانت H صحيحة، مضروبًا في الاحتمال القبلي لـ H، ومقسومًا على الاحتمال الإجمالي لملاحظة X. وتُعد نظرية Bayes أساسية في تعلّم الآلة والإحصاء والاستدلال العقلاني في ظل عدم اليقين.
# Bayes' theorem components:
# P(H|X) = Posterior -- What we want to know
# 'Probability of H given we observed X'
# P(X|H) = Likelihood -- How likely is X if H is true?
# P(H) = Prior -- Our belief in H before seeing X
# P(X) = Evidence -- Overall probability of observing X
# Rearranged:
# Posterior = (Likelihood * Prior) / Evidence
print('Posterior = (Likelihood * Prior) / Evidence')مثال على اختبار طبي
لنبنِ فهمًا حدسيًا من خلال مثال كلاسيكي. يصيب مرض نادر 1% من السكان. ويبلغ الاختبار دقة 95%: فإذا كنتم مصابين بالمرض، تكون نتيجة الاختبار إيجابية في 95% من الحالات؛ وإذا لم تكونوا مصابين، تكون نتيجته سلبية في 95% من الحالات (أي إن معدل الإيجابيات الكاذبة 5%). إذا كانت نتيجة اختباركم إيجابية، فما احتمال أن تكونوا مصابين بالمرض فعلًا؟ يقول الحدس لدى معظم الناس إن الاحتمال 95%، لكن نظرية Bayes تكشف أن الإجابة أقل بكثير؛ لأن المرض نادر جدًا، فإن معظم النتائج الإيجابية تكون في الواقع إيجابية كاذبة.
# Medical test: Bayes' theorem applied
P_disease = 0.01 # Prior: 1% have the disease
P_no_disease = 0.99 # 99% are healthy
P_pos_given_disease = 0.95 # True positive rate (sensitivity)
P_pos_given_no_disease = 0.05 # False positive rate
# P(positive) = total probability of a positive test
P_positive = (P_pos_given_disease * P_disease +
P_pos_given_no_disease * P_no_disease)
# Bayes: P(disease | positive)
P_disease_given_pos = (P_pos_given_disease * P_disease) / P_positive
print(f'P(disease | positive test) = {P_disease_given_pos:.2%}')
# Only ~16%! Not 95% -- the low prior dominatesشرح الاحتمال القبلي والمرجّح واللاحق
المصطلحات الثلاثة الأساسية في نظرية Bayes هي: الاحتمال القبلي P(H)، وهو اعتقادكم بشأن H قبل رؤية أي دليل؛ وفي المثال الطبي، هو انتشار المرض البالغ 1%. والاحتمال المرجّح P(X|H)، وهو مدى تفسير الفرضية H للدليل X؛ وفي المثال، هو معدل الإيجابيات الصحيحة البالغ 95%. والاحتمال اللاحق P(H|X)، وهو اعتقادكم المحدّث بعد دمج الدليل. ويصبح الاحتمال اللاحق الناتج عن ملاحظة واحدة هو الاحتمال القبلي للملاحظة التالية؛ إذ تصف نظرية Bayes عملية تعلّم مستمرة تُحدَّث فيها المعتقدات مع تراكم الأدلة.
# Sequential Bayesian updating
# Start with 1% prior, observe 3 positive tests
prior = 0.01
P_pos_given_disease = 0.95
P_pos_given_no_disease = 0.05
for test_num in range(1, 4):
likelihood_pos = P_pos_given_disease
P_positive = likelihood_pos * prior + P_pos_given_no_disease * (1 - prior)
posterior = (likelihood_pos * prior) / P_positive
print(f'After test {test_num}: P(disease) = {posterior:.3%}')
prior = posterior # Posterior becomes new prior
# Three positive tests raise probability substantiallyنظرية Bayes للتصنيف
في تصنيف تعلّم الآلة، تمنحنا نظرية Bayes احتمال كل فئة بالنظر إلى الميزات المرصودة: P(class | features) ∝ P(features | class) * P(class). ونتنبأ بالفئة ذات الاحتمال اللاحق الأعلى. ويُقدَّر P(class) من تكرارات الفئات في بيانات التدريب (الاحتمال القبلي). ويُقدَّر P(features | class) من توزيع الميزات داخل كل فئة (الاحتمال المرجّح). ويبسّط Naive Bayes حساب الاحتمال المرجّح بافتراض استقلال الميزات عند معرفة الفئة، وهو افتراض «ساذج» ينجح عمليًا بدرجة مفاجئة في كثير من الأحيان.
# Classification with Bayes' theorem
# Predict P(spam | email_features) vs P(ham | email_features)
# Prior (from training data)
P_spam = 0.3 # 30% of emails are spam
P_ham = 0.7 # 70% are ham
# Likelihood: P(features | class) from training
# (simplified: single word 'offer' seen)
P_offer_given_spam = 0.6 # 'offer' appears in 60% of spam
P_offer_given_ham = 0.1 # 'offer' appears in 10% of ham
# Unnormalised posteriors (ignore P(offer) -- same denominator)
posterior_spam = P_offer_given_spam * P_spam # 0.18
posterior_ham = P_offer_given_ham * P_ham # 0.07
print('Unnormalised: spam=', posterior_spam, 'ham=', posterior_ham)
print('Predicted class: spam' if posterior_spam > posterior_ham else 'ham')قانون الاحتمال الكلي
غالبًا ما يُحسب المقام في نظرية Bayes، P(X)، باستخدام قانون الاحتمال الكلي: P(X) = sum over all classes c of P(X|c) * P(c). ويضمن ذلك أن يكون مجموع الاحتمالات اللاحقة عبر جميع الفئات مساويًا للعدد 1. في المثال الطبي، P(positive) = P(positive|disease)*P(disease) + P(positive|no disease)*P(no disease). وفي تصنيف Naive Bayes، نتجاوز عادةً حساب P(X) لأنه متماثل بالنسبة إلى جميع الفئات؛ فنحن نقارن الاحتمالات اللاحقة غير المطبّعة فقط للعثور على الفئة الأكثر احتمالًا.
# Law of total probability: P(X) = sum_c P(X|c) * P(c)
classes = ['spam', 'ham', 'newsletter']
priors = [0.3, 0.5, 0.2] # Must sum to 1.0
P_word_given_class = [0.5, 0.1, 0.3] # Likelihood of 'free' in each class
# Total probability of seeing the word 'free'
P_free = sum(lik * pri for lik, pri in zip(P_word_given_class, priors))
print(f'P(free) = {P_free}')
# Posteriors (normalised)
for cls, pri, lik in zip(classes, priors, P_word_given_class):
posterior = lik * pri / P_free
print(f'P({cls} | free) = {posterior:.3f}')من الصيغة إلى الخوارزمية
تُترجم نظرية Bayes مباشرةً إلى خوارزمية تصنيف. وباستخدام مجموعة تدريب معنونة: الخطوة 1: قدّروا P(class) لكل فئة من تكرارات الفئات. الخطوة 2: قدّروا P(feature | class) لكل توليفة من ميزة وفئة. الخطوة 3: لعينة جديدة، احسبوا P(class | features) ∝ P(features | class) * P(class) لكل فئة. الخطوة 4: تنبؤوا بالفئة ذات الاحتمال اللاحق الأعلى. ويبسّط التقريب «الساذج» في Naive Bayes الخطوة 2، إذ يفترض أن P(features|class) = product of P(feature_i | class) for all features.
# Naive Bayes algorithm in pseudocode
# Training:
# For each class c:
# prior[c] = count(class==c) / total_samples
# For each feature f:
# likelihood[c][f] = P(feature_f | class==c) # from training data
# Prediction for new sample x:
# For each class c:
# log_prob[c] = log(prior[c])
# For each feature f:
# log_prob[c] += log(likelihood[c][f=x_f]) # naive: assume independence
# return argmax(log_prob) # class with highest log-posterior
print('Naive independence assumption: P(f1,f2,...|c) = P(f1|c)*P(f2|c)*...*P(fn|c)')لماذا تتجنب الاحتمالات اللوغاريتمية التدفق السفلي؟
عند ضرب العديد من الاحتمالات الصغيرة، تتدفق النتيجة سريعًا إلى 0 في حسابات الفاصلة العائمة، رغم أن قيمتها الرياضية عدد صغير لكنه غير صفري. فمثلًا، يعطي مستند يحتوي على 100 كلمة، لكل منها P(word|class)=0.01، القيمة 0.01^100 = 10^{-200}، وهي أقل من أصغر قيمة float64. يحوّل العمل في الفضاء اللوغاريتمي الضرب إلى جمع: log(a*b) = log(a) + log(b). وبما أننا نقارن الاحتمالات اللاحقة اللوغاريتمية، لا الاحتمالات اللاحقة الفعلية، فإن قرار argmax يظل مماثلًا. وتعمل تطبيقات Naive Bayes دائمًا في الفضاء اللوغاريتمي لتحقيق الاستقرار العددي.
import numpy as np
# Direct multiplication: underflows
probs = [0.1] * 100 # 100 features, each P=0.1
product = np.prod(probs)
print('Direct product:', product) # 0.0 -- underflow!
# Log space: numerically stable
log_sum = np.sum(np.log(probs))
print('Log sum:', log_sum) # -100 * log(10) -- valid
# Compare two classes
log_prob_A = np.sum(np.log([0.1] * 100))
log_prob_B = np.sum(np.log([0.2] * 100))
print('Class A log-prob:', log_prob_A)
print('Class B log-prob:', log_prob_B)
print('Predicted:', 'A' if log_prob_A > log_prob_B else 'B')المصنّف الأمثل وفق Bayes: المعيار الذهبي
المصنّف الأمثل وفق Bayes هو أفضل مصنّف ممكن نظريًا لتوزيع بيانات معيّن. فهو يتنبأ بالفئة ذات أعلى احتمال لاحق حقيقي P(class|features). ولا يستطيع أي مصنّف آخر تحقيق معدل خطأ متوقّع أقل على ذلك التوزيع. عمليًا، لا يمكننا استخدام المصنّف الأمثل وفق Bayes لأننا لا نعرف التوزيعات الحقيقية؛ ولا نستطيع إلا تقديرها من بيانات محدودة. وNaive Bayes هو تقريب للمصنّف الأمثل وفق Bayes في ظل افتراض الاستقلال. وعندما يصح هذا الافتراض، يكون Naive Bayes هو المصنّف الأمثل.
# The Bayes error rate is the irreducible error
# Even a perfect model cannot beat it on a given distribution
# Example: predicting coin flip from noisy signal
import numpy as np
np.random.seed(42)
# True label: 50/50 coin
y_true = np.random.choice([0, 1], size=1000)
# Signal: 70% correlated with true label
signal = np.where(np.random.rand(1000) < 0.7, y_true, 1-y_true)
# Optimal prediction: just use the signal
acc = (signal == y_true).mean()
print(f'Optimal classifier accuracy: {acc:.3f}')
print(f'Bayes error rate (irreducible): {1-0.70:.3f} = 30%')تطبيقات نظرية Bayes في العالم الحقيقي
ليست نظرية Bayes مجرد صيغة تُدرّس في الفصول الدراسية؛ فهي تشغّل العديد من الأنظمة الحقيقية. تحسب مرشحات البريد العشوائي P(spam | words) من تكرارات الكلمات في الرسائل العشوائية والمعروفة بأنها سليمة. وتحدّث أنظمة التشخيص الطبي احتمالات الإصابة بالأمراض مع وصول نتائج الاختبارات. وتستخدم محركات البحث الترتيب البايزي لدمج صلة الاستعلام بشعبية المستند. وتستخدم المركبات ذاتية القيادة الترشيح البايزي (مرشح Kalman ومرشح الجسيمات) لتتبّع موقعها بالاستناد إلى قراءات المستشعرات المشوشة. كما تستخدم اختبارات A/B في المجال الصناعي، بشكل متزايد، أطرًا بايزية تُخرج احتمال كون الخيار هو الأفضل بدلًا من قيم p.
# Real-world Bayes: A/B test - which version is better?
# After 100 conversions from 1000 visitors for version A
# and 120 conversions from 1000 visitors for version B:
from scipy import stats
# Beta distribution as posterior for conversion rate
alpha_A, beta_A = 100 + 1, 900 + 1 # Beta(successes+1, failures+1)
alpha_B, beta_B = 120 + 1, 880 + 1
# Monte Carlo: P(B is better than A)
samples_A = stats.beta(alpha_A, beta_A).rvs(100000)
samples_B = stats.beta(alpha_B, beta_B).rvs(100000)
P_B_better = (samples_B > samples_A).mean()
print(f'P(B is better than A): {P_B_better:.3f}')افتراض الاستقلال: متى يكون صالحًا؟
يفترض الجزء «الساذج» من Naive Bayes أن الميزات مستقلة شرطيًا عند معرفة الفئة. وبالنسبة إلى البيانات النصية، يعني ذلك افتراض أن وجود كل كلمة مستقل عن الكلمات الأخرى (عند معرفة الفئة). لكن الكلمات مثل 'credit' و'card' تظهر معًا في الواقع، أي إنها مترابطة. ومع ذلك، تُظهر الدراسات التجريبية أن Naive Bayes يعمل جيدًا رغم انتهاك افتراض الاستقلال، للأسباب التالية: (1) لا يحتاج ترتيب التصنيف إلا إلى الترتيب الصحيح للاحتمالات اللاحقة، لا إلى احتمالات دقيقة؛ (2) تتكامل الإشارات المستقلة جيدًا عند وجود ميزات كثيرة؛ (3) تمنع البساطة فرط التكيّف مع مجموعات البيانات الصغيرة.
# When does naive independence work?
# Even with correlated features, naive bayes often ranks classes correctly
import numpy as np
# Two correlated features that both indicate spam
words = {'buy': 0, 'now': 1, 'click': 2, 'here': 3}
# Spam email often has all four; ham rarely does
# Independence assumption ignores that 'buy' and 'now' co-occur
# But the combined signal is still strong for detecting spam
P_word_spam = [0.7, 0.6, 0.5, 0.6]
P_word_ham = [0.1, 0.1, 0.05, 0.1]
# For email with all 4 words
log_spam = np.sum(np.log(P_word_spam))
log_ham = np.sum(np.log(P_word_ham))
print('Log P(features|spam):', log_spam.round(2))
print('Log P(features|ham): ', log_ham.round(2))
print('Predicted: SPAM' if log_spam > log_ham else 'HAM')عامل Bayes: مقارنة الفرضيات
عامل بايز هو نسبة الترجيحين لفرضيتين متنافستين: BF = P(evidence | H1) / P(evidence | H0). بخلاف قيم p التي تخبركم فقط بما إذا كان ينبغي رفض الفرضية الصفرية، يحدّد عامل بايز كمّياً مقدار تفضيل الأدلة لإحدى الفرضيتين على الأخرى. تمثل BF > 10 أدلة قوية لصالح H1، وتمثل BF < 0.1 أدلة قوية لصالح H0، أما القيم بين 1/3 و3 فغير حاسمة. ويُستخدم عامل بايز بشكل متزايد في العلوم وقطاع الصناعة لاختبارات A/B وتقييم الفرضيات، لأنه يدمج المعلومات السابقة بصورة طبيعية ويقدم مقياساً قابلاً للتفسير لقوة الأدلة.
# Bayes Factor example: comparing two models
# H0: coin is fair (p=0.5)
# H1: coin is biased (p=0.7)
# Observed: 8 heads in 10 flips
from scipy.stats import binom
observed_heads = 8
n_flips = 10
# Likelihood under each hypothesis
L_H0 = binom.pmf(observed_heads, n_flips, p=0.5)
L_H1 = binom.pmf(observed_heads, n_flips, p=0.7)
BF = L_H1 / L_H0
print(f'P(8 heads | fair coin) = {L_H0:.4f}')
print(f'P(8 heads | p=0.7) = {L_H1:.4f}')
print(f'Bayes Factor (H1/H0) = {BF:.2f}')
print('BF > 3: moderate evidence for biased coin')تحقق سريع
اختبروا مدى فهمكم لمفاهيم تعلّم الآلة باستخدام Python الواردة في هذا الدرس.
مراجعة الدرس
تعلّمتم في هذا الدرس أن نظرية بايز تحدّث الاعتقادات السابقة باستخدام الأدلة لإنتاج اعتقادات لاحقة، وتعرّفتم إلى المكوّنات الثلاثة (الاعتقاد السابق، والترجيح، والاعتقاد اللاحق) وكيفية تفاعلها، وإلى سبب إمكان تغلّب الاعتقادات السابقة المنخفضة حتى على الاختبارات عالية الدقة، كما في مثال التشخيص الطبي. ننتقل بعد ذلك إلى استكشاف حقيبة الكلمات باستخدام CountVectorizer وTfidfVectorizer لتحويل النص إلى أرقام من أجل تصنيف Naive Bayes.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «نظرية بايز بلغة واضحة» مجاني؟
نعم — نص درس «نظرية بايز بلغة واضحة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Machine Learning Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Machine Learning Academy 4 دروس في المجموع.
ماذا ستتعلم في «نظرية بايز بلغة واضحة»؟
طبّق مثالًا ملموسًا لاختبار طبي لبناء حدس حول الاحتمالات السابقة والمرجّحة واللاحقة من دون رياضيات معقدة تتمرن على Machine Learning Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Machine Learning Academy؟
لا تُشترط خبرة سابقة. Machine Learning Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نظرية بايز بلغة واضحة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Machine Learning Academy هذا؟
نعم. كل درس في Machine Learning Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرية بايز بلغة واضحة
- حقيبة الكلمات: CountVectorizer وTfidfVectorizer
- تدريب مصنّف Multinomial Naive Bayes
- تنعيم لابلاس ومشكلة الاحتمال الصفري