進階貝氏機器學習

程式碼 一、

# 匯入需要用到的 Python 套件
import gdown
import pandas as pd

# 從 Google Drive 下載 CSV 檔
# 用 gdown 需要提供檔案 ID,或用 --fuzzy 讓它自動判斷
url = "https://drive.google.com/file/d/12PipZYWO_I1uY83CLoMPJoEvGAOUa8cj/view?usp=drive_link"

# --fuzzy 可以讓 gdown 自動從分享連結抓到正確下載網址
gdown.download(url, "lecture_example.csv", fuzzy=True)

# 用 pandas 讀取剛剛下載的 CSV 檔
df = pd.read_csv("lecture_example.csv", encoding="utf-8-sig")

# 確認前 5 筆資料
df.head()
結果顯示

程式碼 二、

# 定義事件 E
# 條件:句子開頭是「有一隻杰泥龜在湖畔」
E = df["句子"].astype(str).str.startswith("有一隻杰泥龜在湖畔")

# 檢查事件 E 判斷是否正確
print(E.head(10))    # 顯示前 10 筆 True/False(True 代表該筆資料符合條件)
print(E.sum())     # 計算符合條件(True)的總數
結果顯示

程式碼 三、

# 基本統計

total = len(df)         # 全部資料筆數 N(總共有多少句子資料)
n_E = E.sum()          # 事件 E 的筆數:True 當 1、False 當 0,相加就是符合條件的總數
p_E = n_E / total       # Evidence:P(E) = n(E) / N,事件 E 出現的比例

# 輸出檢查
print("total =", total)     # 總句子數 N
print("n_E =", n_E)       # 符合事件 E 的數量(句首「有一隻」、寶可夢=杰泥龜、地點=湖畔)
print("p_E =", p_E)       # 事件 E 的機率,應該等於 n_E / total
結果顯示

程式碼 四、

# 逐「動作」計算 prior, likelihood, posterior(Bayes 更新)
# 要計算的三個動作清單(或改成 df["動作"].unique().tolist())
actions = ["奔跑", "潛水", "訓練"]

# 先建立一個空清單,之後把每個動作的結果裝進來
rows_actions = []

for act in actions:
    print(act)
結果顯示

程式碼 五、

# === 程式碼 五:逐一「動作」計算 Prior / Likelihood / Posteri
for act in actions:
    n_A = (df["動作"] == act).sum()# n(A):該動作在整份資料中出現的次數

    # Prior:P(A) = n(A) / N
    # 在不知道任何條件時,這個動作出現的比例
    p_prior = n_A / total if total > 0 else float("nan")

    # n(A ∧ E):同時滿足「動作=act 且事件 E 為 True」的筆數
    n_joint = ((df["動作"] == act) & E).sum()

    # Likelihood:P(E | A) = n(A ∧ E) / n(A)
    # 在已知「動作=act」的條件下,事件 E 發生的機率
    p_likelihood = n_joint / n_A if n_A > 0 else float("nan")

    # Posterior:P(A | E) = P(E|A) * P(A) / P(E)
    # 在已知事件 E 發生後,這個動作的後驗機率
    p_posterior = (p_likelihood * p_prior) / p_E if p_E > 0 else float("nan")


    print(f"\n正在計算: {act}")
    print("n_A =", n_A)              # 全部資料中,這個動作的數量
    print("n_joint =", n_joint)          # 同時滿足事件 E 的這個動作數
    print(f"p_prior = {p_prior:.2f}")       # 先驗機率
    print(f"p_likelihood = {p_likelihood:.2f}")  # 似然
    print(f"p_posterior = {p_posterior:.2f}")   # 後驗機率
結果顯示