當你走進一家咖啡館,看到一個朋友面前放着半杯咖啡。

經典統計學家可能會説:根據歷史數據,80%的人在這裏點美式咖啡。

而貝葉斯主義者:讓我用新證據更新一下我的信念,既然杯子只有半滿,説明他可能剛來不久,而且眉頭微皺,可能咖啡不太合口味...

貝葉斯定理的數學表達式:

翻譯成人話就是:新證據出現後,我對某個假設的信念需要更新。其中P(A)是先驗概率(原來的信念),P(B|A)是似然(假設成立時看到證據的可能性),P(A|B)是後驗概率(看到證據後更新的信念)。

歷史發展

貝葉斯定理的創始人托馬斯·貝葉斯可謂生前寂寂無名,死後眾人崇拜的典型。

這位18世紀的英國統計學家在1763年去世後,他的朋友才將他的論文發表出來。

可悲的是,當時這工作幾乎石沉大海。

直到法國數學家拉普拉斯重新發現並完善了這個理論,貝葉斯公式才開始嶄露頭角。

但即使如此,在其後的兩百年間,它仍然是統計學界的非主流,頻率主義統計才是當時的王者。

貝葉斯定理的逆襲之路

  • 18世紀:貝葉斯提出基本思想,拉普拉斯完善公式
  • 二戰期間:被用於密碼破譯和軍事決策,開始展現實用價值
  • 20世紀後期:隨着計算機科學發展,在人工智能領域大放異彩
  • 21世紀大數據時代:成為機器學習、數據挖掘的核心工具之一

有趣的是,貝葉斯定理的崛起與大數據發展幾乎是同步的。

這不禁讓我想起自己在讀書研究中的體會:當數據足夠多時,先驗信念的影響力會逐漸減弱,數據自己會説話

機器學習中的貝葉斯

1. 樸素貝葉斯分類器:簡單卻強大

雖然名字叫樸素,因為它假設特徵之間相互獨立,但這個算法在文本分類、垃圾郵件過濾等領域表現驚人。

比如垃圾郵件過濾:算法會計算每個單詞在垃圾郵件和正常郵件中出現的概率,然後根據貝葉斯公式組合這些信息。

當你收到一封包含免費贏取獎金等詞的郵件時,系統會計算P(垃圾郵件|這些詞),從而做出判斷。

2. 語音識別:貝葉斯的聽覺系統

著名科學家賈里尼克將語音識別問題轉化為一個貝葉斯推斷問題:給定聲音信號,推測最可能對應的文字序列。

這種思路打破了之前基於語法規則的方法的瓶頸,讓Siri、小愛同學等智能助手成為可能。

3. 貝葉斯深度學習

傳統的深度學習模型像黑盒子,而貝葉斯深度學習則試圖將概率思維引入神經網絡,提供不確定性估計和更好的可解釋性。這在醫療診斷、自動駕駛等需要高可靠性的領域尤為重要。

代碼實現

代碼感受貝葉斯思維~

現在,讓我們動手實現一個簡單的貝葉斯分類器。

使用手寫數字識別作為例子,也是機器學習入門的經典案例。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns


# 加載手寫數字數據集(8x8像素的數字圖像)
digits = load_digits()
X = digits.data  # 特徵向量(64維)
y = digits.target  # 標籤(0-9)

print(f'數據集形狀: {X.shape}')
print(f'樣本數量: {len(y)}')
print(f'數字類別: {np.unique(y)}')

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 創建並訓練樸素貝葉斯模型
model = GaussianNB()
model.fit(X_train, y_train)

# 預測測試集
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'\n模型準確率: {accuracy:.4f}')

# 可視化部分預測結果
plt.figure(figsize=(12, 8))

# 顯示前10個測試樣本的預測結果
for i in range(10):
    plt.subplot(2, 5, i + 1)
    plt.imshow(X_test[i].reshape(8, 8), cmap=plt.cm.gray_r)
    prediction = y_pred[i]
    true_label = y_test[i]
    color = 'green'if prediction == true_label else'red'
    plt.title(f'真實: {true_label}, 預測: {prediction}', color=color, fontsize=12)
    plt.axis('off')

plt.suptitle('手寫數字識別結果(綠色正確,紅色錯誤)', fontsize=14)
plt.tight_layout()
plt.show()

# 繪製混淆矩陣熱力圖
plt.figure(figsize=(10, 8))
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=range(10), yticklabels=range(10))
plt.xlabel('預測標籤')
plt.ylabel('真實標籤')
plt.title('手寫數字識別混淆矩陣')
plt.show()

# 輸出詳細分類報告
print('\n分類報告:')
print(classification_report(y_test, y_pred))

# 可視化貝葉斯概率估計過程(以第一個測試樣本為例)
first_sample = X_test[0:1]
predicted_probabilities = model.predict_proba(first_sample)

plt.figure(figsize=(10, 6))
classes = range(10)
plt.bar(classes, predicted_probabilities[0], color='skyblue', alpha=0.7)
plt.axvline(x=y_test[0], color='red', linestyle='--', label=f'真實標籤 ({y_test[0]})')
plt.axvline(x=y_pred[0], color='green', linestyle='--', label=f'預測標籤 ({y_pred[0]})')
plt.xlabel('數字類別')
plt.ylabel('預測概率')
plt.title('貝葉斯分類器對第一個測試樣本的概率估計')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

1.手寫數字的圖像及其識別結果(綠色表示正確,紅色表示錯誤)

先驗、似然、後驗:貝葉斯定理的核心三要素 !!_垃圾郵件

2.混淆矩陣熱力圖,顯示模型在各類別上的表現

先驗、似然、後驗:貝葉斯定理的核心三要素 !!_貝葉斯分類器_02

3.貝葉斯分類器對每個類別的概率估計可視化

先驗、似然、後驗:貝葉斯定理的核心三要素 !!_貝葉斯分類器_03

  • 我們使用高斯樸素貝葉斯分類器,它假設每個特徵服從正態分佈
  • 模型會計算每個數字類別的先驗概率P(數字)
  • 對於新樣本,計算後驗概率P(數字|像素特徵)
  • 選擇後驗概率最大的數字作為預測結果