一、貝葉斯:從 “逆概” 問題走來的數學家
要理解樸素貝葉斯,得先回到它的 “源頭”—— 貝葉斯公式,以及它要解決的核心問題:逆概問題。
1. 貝葉斯的 “生不逢時”
托馬斯?貝葉斯(Thomas Bayes,約 1701-1761)是英國數學家,他生前為解決 “逆概” 問題寫了一篇文章,卻在死后才被世人認可。正是這篇文章,奠定了 “貝葉斯方法” 的基礎,成為如今機器學習、統計學、人工智能領域的核心思想之一。
2. 正向概率 vs 逆向概率:貝葉斯要解決的核心
我們先從兩個簡單的例子,理解 “正向” 與 “逆向” 的區別 —— 這是貝葉斯思想的關鍵。
正向概率:已知 “因”,求 “果” 的概率。 比如:袋子里有 N 個白球、M 個黑球(已知 “因”:黑白球比例),伸手摸一個,問摸出黑球的概率(求 “果”:事件概率)。 這是我們從小學習的概率問題,直接用 “符合條件的數量 / 總數量” 就能計算。
逆向概率:已知 “果”,求 “因” 的概率。 比如:事先不知道袋子里黑白球的比例(未知 “因”),但閉著眼摸出了 1 個黑球、2 個白球(已知 “果”:觀測結果),問袋子里黑白球可能的比例是多少? 這就是貝葉斯要解決的 “逆概” 問題 —— 通過觀測到的結果,反推背后 “原因” 的概率。
二、貝葉斯公式:用一個 “穿長褲” 的例子看懂推導
光說概念太抽象,我們用 PPT 里的 “校園男女生長褲 / 裙子” 例子,一步步推導出貝葉斯公式。這個例子特別直觀,新手也能跟上。
已知條件
- 校園里男生占 60%(P (Boy)=0.6),女生占 40%(P (Girl)=0.4);
- 男生全部穿長褲(P (長褲 | Boy)=1.0,“|” 表示 “在… 條件下”);
- 女生一半穿長褲、一半穿裙子(P (長褲 | Girl)=0.5)。
問題:迎面走來一個穿長褲的學生,他是女生的概率是多少?
也就是求?P (Girl | 長褲)—— 已知 “穿長褲” 這個 “果”,反推 “是女生” 這個 “因” 的概率。
step 1:計算 “穿長褲的男生” 和 “穿長褲的女生” 數量
假設校園總人數為 U,那么:
- 穿長褲的男生數量 = U × P (Boy) × P (長褲 | Boy) = U × 0.6 × 1.0 = 0.6U;
- 穿長褲的女生數量 = U × P (Girl) × P (長褲 | Girl) = U × 0.4 × 0.5 = 0.2U。
step 2:計算 “穿長褲的總人數”
穿長褲的總人數 = 穿長褲的男生 + 穿長褲的女生 = 0.6U + 0.2U = 0.8U。
step 3:推導 “穿長褲的人是女生” 的概率
“穿長褲的人是女生” 的概率 = 穿長褲的女生數量 / 穿長褲的總人數,代入上面的結果:
\(P(Girl|長褲) = \frac{U \times P(Girl) \times P(長褲|Girl)}{U \times P(Boy) \times P(長褲|Boy) + U \times P(Girl) \times P(長褲|Girl)}\)
這里發現一個關鍵:總人數 U 可以消掉!因為 U 是常數,不影響概率比例。于是公式簡化為:
\(P(Girl|長褲) = \frac{P(Girl) \times P(長褲|Girl)}{P(Boy) \times P(長褲|Boy) + P(Girl) \times P(長褲|Girl)}\)
step 4:提煉出通用的貝葉斯公式
觀察上面的簡化公式,分母其實是 “穿長褲” 這個事件的總概率 P (長褲)(即所有可能 “原因” 導致 “穿長褲” 的概率之和)。 由此推廣到通用場景:對于任意 “原因 H” 和 “結果 D”,貝葉斯公式為:
\(P(H|D) = \frac{P(H) \times P(D|H)}{P(D)}\)
公式中各個部分的含義:
- P (H|D):后驗概率(Posterior)—— 已知結果 D,反推原因 H 的概率(這是我們最終想求的);
- P (H):先驗概率(Prior)—— 在沒有觀測到結果 D 時,原因 H 本身發生的概率(比如 “女生占 40%”);
- P (D|H):似然概率(Likelihood)—— 在原因 H 成立的條件下,出現結果 D 的概率(比如 “女生穿長褲的概率 50%”);
- P (D):證據概率(Evidence)—— 結果 D 發生的總概率(所有原因導致 D 的概率之和,計算時可忽略,因為比較不同 H 時它是常數)。
三、樸素貝葉斯:“樸素” 在哪?
貝葉斯公式解決了 “逆概” 問題,但如果要處理多特征的分類任務(比如判斷一封郵件是否為垃圾郵件,郵件包含多個單詞),直接用貝葉斯公式會很復雜 —— 因為要計算 “多個特征同時出現” 的聯合概率。
這時候,樸素貝葉斯的 “樸素” 假設就派上用場了: 假設所有特征之間相互獨立,互不影響。
正是這個 “樸素” 的假設,把復雜的聯合概率簡化成了 “單個特征概率的乘積”,讓計算量大幅降低。比如判斷郵件是否為垃圾郵件時,“郵件包含‘中獎’” 和 “郵件包含‘轉賬’” 這兩個特征,被假設為獨立事件。
四、實例 1:拼寫糾正 —— 幫用戶 “猜” 對單詞
我們每天用輸入法時,偶爾會輸錯單詞(比如把 “top” 輸成 “tlp”),輸入法怎么知道我們真正想輸什么?樸素貝葉斯就是背后的 “猜詞邏輯” 之一。
問題定義
已知用戶輸入了一個不在字典中的單詞 D(比如 “tlp”),求 “用戶真正想輸入的單詞 h” 的概率,即 P (h|D)。我們需要找出概率最大的 h 作為糾正結果。
用樸素貝葉斯計算
根據貝葉斯公式:
\(P(h|D) = \frac{P(h) \times P(D|h)}{P(D)}\)
由于 P (D)(用戶輸入 D 的總概率)對所有候選 h 都是常數,比較不同 h 的概率時可忽略,因此只需計算:
\(P(h|D) \propto P(h) \times P(D|h)\)
其中:
- P (h):先驗概率—— 單詞 h 在日常使用中出現的頻率。比如 “top” 比 “tip” 更常用,所以 P (top) > P (tip);
- P (D|h):似然概率—— 想輸入 h,卻輸成 D 的概率(比如 “top” 輸成 “tlp” 的概率,取決于兩個單詞的字符差異,差異越小概率越大)。
舉個例子:用戶輸入 “tlp”,該糾正為 “top” 還是 “tip”?
- 先看 P (D|h):“tlp” 和 “top” 差 1 個字符(l→o),和 “tip” 也差 1 個字符(l→i),所以 P (D|top) ≈ P (D|tip);
- 再看 P (h):“top” 在語料中出現的頻率遠高于 “tip”,即 P (top) > P (tip);
- 因此,P (top)×P (D|top) > P (tip)×P (D|tip),最終糾正為 “top”。
五、實例 2:垃圾郵件分類 —— 給郵件 “貼標簽”
垃圾郵件分類是樸素貝葉斯最經典的應用之一。我們的目標是:給定一封郵件 D,判斷它是垃圾郵件(h+)還是正常郵件(h-)。
問題定義
需比較兩個后驗概率:P (h+|D)(郵件是垃圾郵件的概率)和 P (h-|D)(郵件是正常郵件的概率),哪個大就歸為哪一類。
step 1:拆解郵件特征
郵件 D 由多個單詞組成(比如 D 包含 “中獎”“轉賬”“領取” 三個單詞,記為 d1=“中獎”,d2=“轉賬”,d3=“領取”)。根據樸素貝葉斯的 “特征獨立” 假設:
\(P(D|h+) = P(d1|h+) \times P(d2|h+) \times P(d3|h+)\)
(即 “垃圾郵件中同時出現 d1、d2、d3” 的概率,等于 “垃圾郵件中出現 d1”“垃圾郵件中出現 d2”“垃圾郵件中出現 d3” 的概率乘積)。
step 2:計算關鍵概率
先驗概率 P (h+) 和 P (h-): 假設我們有一個郵件庫,里面有 1000 封郵件,其中 300 封是垃圾郵件,700 封是正常郵件。那么: P(h+) = 300/1000 = 0.3,P(h-) = 700/1000 = 0.7。
似然概率 P (d|h+) 和 P (d|h-): 統計單詞 d 在垃圾郵件 / 正常郵件中出現的頻率。比如:
- 垃圾郵件中 “中獎” 出現了 150 次,垃圾郵件總單詞數為 10000,所以 P (“中獎”|h+) = 150/10000 = 0.015;
- 正常郵件中 “中獎” 出現了 10 次,正常郵件總單詞數為 50000,所以 P (“中獎”|h-) = 10/50000 = 0.0002。
計算 P (D|h+) 和 P (D|h-): 假設郵件 D 包含 “中獎”“轉賬”,且 P (“轉賬”|h+) = 0.02,P (“轉賬”|h-) = 0.0005。那么: P(D|h+) = 0.015 × 0.02 = 0.0003; P(D|h-) = 0.0002 × 0.0005 = 0.0000001。
step 3:比較后驗概率
根據貝葉斯公式,忽略 P (D) 后: P(h+|D) ∝ P(h+) × P(D|h+) = 0.3 × 0.0003 = 0.00009; P(h-|D) ∝ P(h-) × P(D|h-) = 0.7 × 0.0000001 = 0.00000007。
顯然,P (h+|D) > P (h-|D),因此這封郵件被判定為垃圾郵件。
六、實戰演練:從訓練數據學樸素貝葉斯分類器
PPT 中給出了一個經典的訓練數據案例,我們來簡化理解如何用它學習分類器。
已知訓練數據
樣本序號 | 特征 X1(取值 {1,2,3}) | 特征 X2(取值 {S,M,L}) | 類別 Y({1,-1}) |
---|---|---|---|
1 | 1 | S | -1 |
2 | 1 | M | -1 |
3 | 1 | M | 1 |
4 | 1 | S | 1 |
5 | 1 | S | -1 |
6 | 2 | S | -1 |
7 | 2 | M | -1 |
8 | 2 | M | 1 |
9 | 2 | L | 1 |
10 | 2 | L | 1 |
11 | 3 | L | 1 |
12 | 3 | M | 1 |
13 | 3 | M | 1 |
14 | 3 | L | 1 |
15 | 3 | L | -1 |
任務:確定 x=(2, S) 的類別 Y
即求 P (Y=1|X1=2,X2=S) 和 P (Y=-1|X1=2,X2=S),哪個大歸哪類。
step 1:計算先驗概率 P (Y=1) 和 P (Y=-1)
- 總樣本數 15,Y=1 的樣本有 9 個,所以 P (Y=1)=9/15=0.6;
- Y=-1 的樣本有 6 個,所以 P (Y=-1)=6/15=0.4。
step 2:計算條件概率(似然)
根據樸素假設,P (X1=2,X2=S|Y=k) = P (X1=2|Y=k) × P (X2=S|Y=k)(k=1 或 - 1)。
對 Y=1: Y=1 的樣本中,X1=2 的有 3 個(樣本 8、9、10),所以 P (X1=2|Y=1)=3/9=1/3; Y=1 的樣本中,X2=S 的有 0 個,所以 P (X2=S|Y=1)=0/9=0; 因此,P (X1=2,X2=S|Y=1)= (1/3) × 0 = 0。
對 Y=-1: Y=-1 的樣本中,X1=2 的有 2 個(樣本 6、7),所以 P (X1=2|Y=-1)=2/6=1/3; Y=-1 的樣本中,X2=S 的有 3 個(樣本 1、5、6),所以 P (X2=S|Y=-1)=3/6=0.5; 因此,P (X1=2,X2=S|Y=-1)= (1/3) × 0.5 = 1/6 ≈ 0.1667。
step 3:比較后驗概率
- P(Y=1|x) ∝ 0.6 × 0 = 0;
- P(Y=-1|x) ∝ 0.4 × (1/6) ≈ 0.0667。
因此,x=(2, S) 的類別為Y=-1。
七、課堂練習:動手驗證你的理解
試試用上面的訓練數據,解決 PPT 中的兩個問題:
- 當 X1=1,X2=L 時,屬于哪一類?
- 當 X1=3,X2=L 時,屬于哪一類?
(提示:步驟和上面一致,先算先驗概率,再算條件概率,最后比較后驗概率。答案可以在評論區交流哦~)
八、總結:樸素貝葉斯的 “簡單與強大”
樸素貝葉斯之所以能成為經典算法,核心在于它的 “平衡”—— 簡單卻有效:
優點
- 計算快:無需迭代訓練,只需統計概率,適合大規模數據;
- 數據需求低:少量數據就能訓練,尤其適合樣本稀缺場景;
- 可解釋性強:基于概率公式,結果容易理解(比如 “因為包含‘中獎’,所以有 90% 概率是垃圾郵件”)。
缺點
- “樸素” 假設的局限性:現實中特征往往不獨立(比如 “中獎” 和 “轉賬” 常同時出現在垃圾郵件中),可能影響精度;
- 對高頻特征敏感:如果某個無關高頻詞(如 “的”“是”)未被過濾,可能干擾分類。
適用場景
- 文本分類(垃圾郵件、情感分析、新聞分類);
- 拼寫糾正、推薦系統;
- 小規模數據的快速分類任務。