MCM520 ← 资料站首页 朴素贝叶斯 · 深度手册 打开交互阅读器 →

朴素贝叶斯 · 深度手册

分类:机器学习 | 难度:★☆☆ 入门 | 编号:nb

一、这是什么(一句话用途)

文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好)

二、核心思想

朴素贝叶斯是最经典的概率生成式分类器。它的"朴素"在于一个强假设:给定类别后,各特征相互独立。现实中这几乎不成立,但神奇的是即便假设被违反,分类效果往往依然不错,且训练极快、需要的样本很少,在文本分类(词袋特征高维稀疏)上尤其好用。它先由训练集估计"类先验概率" P(c)P(c) 和"每类下各特征取值的概率" P(xi∣c)P(x_i\mid c),预测时对新样本算每类的后验,取最大者。本质上它把"联合分布"拆解为易估计的小块,是典型的"以算代存"。

三、数学原理与推导

由贝叶斯定理,类别后验

P(c∣x)=P(x∣c)P(c)P(x) P(c\mid \mathbf{x})=\frac{P(\mathbf{x}\mid c)P(c)}{P(\mathbf{x})}

条件独立假设下 P(x∣c)=∏iP(xi∣c)P(\mathbf{x}\mid c)=\prod_i P(x_i\mid c),于是

c^=arg⁡max⁡c P(c)∏iP(xi∣c) \hat{c}=\arg\max_c\ P(c)\prod_i P(x_i\mid c)

分母 P(x)P(\mathbf{x}) 与 cc 无关可省。离散特征用频率估计 P(xi∣c)=Nc,xi+αNc+α∣V∣P(x_i\mid c)=\frac{N_{c,x_i}+\alpha}{N_c+\alpha|V|}(拉普拉斯平滑 α\alpha 防 0)。连续特征常假设高斯:

P(xi∣c)=12πσc,iexp⁡ ⁣(−(xi−μc,i)22σc,i2) P(x_i\mid c)=\frac{1}{\sqrt{2\pi}\sigma_{c,i}}\exp\!\left(-\frac{(x_i-\mu_{c,i})^2}{2\sigma_{c,i}^2}\right)

取对数避免下溢:log⁡P(c∣x)=log⁡P(c)+∑ilog⁡P(xi∣c)\log P(c\mid\mathbf{x})=\log P(c)+\sum_i\log P(x_i\mid c)。

四、建模 / 求解步骤

  1. 估计类先验 P(c)
  2. 估计各类条件概率 P(x_i|c)(平滑/高斯)
  3. 新样本算各类对数后验
  4. 取最大后验类别
  5. 输出概率与置信

五、关键公式速查

ĉ = argmax_c P(c)·∏ P(x_i|c);连续特征用高斯;离散用拉普拉斯平滑

六、典型示例

邮件词频 → 算'垃圾/正常'两类后验 → 判为概率更高的一类。

完整算例(数字演示,照着算一遍)

场景:邮件分类,特征 含'免费'(是/否)、含'发票'(是/否)。训练得 P(垃圾|免费)=0.8, P(正常|免费)=0.2 等。

某邮件:含'免费'不含'发票' → P(垃圾)∝0.8·(1−0.1)=0.72 > P(正常)∝0.2·0.9=0.18。

结论:判为垃圾邮件。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","nb.csv"))
X = df[["x1","x2"]].to_numpy(dtype=float); y = df["label"].to_numpy(dtype=float)
X = (X-X.mean(0))/X.std(0)
classes = np.unique(y)
stats = {c:(X[y==c].mean(0), X[y==c].var(0)+1e-6) for c in classes}
priors = {c:(y==c).mean() for c in classes}
def gauss(x, mu, var): return 1/np.sqrt(2*np.pi*var)*np.exp(-(x-mu)**2/(2*var))
acc = 0
for xi, yi in zip(X, y):
    s = {c: np.log(priors[c]) + sum(np.log(gauss(xi[j], stats[c][0][j], stats[c][1][j])) for j in range(2)) for c in classes}
    acc += (max(s, key=s.get) == yi)
print("朴素贝叶斯分类准确率=%.3f" % (acc/len(y)))

配套文件:py_nb.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% 朴素贝叶斯(高斯)示例(MATLAB/Octave)
df = readtable('..\datasets\nb.csv');
X = table2array(df(:,1:2)); y = table2array(df(:,3));
X = (X-mean(X,1))./std(X,1);
classes = unique(y); acc = 0;
gauss = @(x,mu,sg) (1./sqrt(2*pi*sg)).*exp(-(x-mu).^2./(2*sg));
for i=1:height(X)
  sc = zeros(size(classes));
  for k=1:length(classes)
    c=classes(k); idx=(y==c);
    mu=mean(X(idx,:),1); sg=var(X(idx,:),1)+1e-6; pri=mean(y==c);
    sc(k)=log(pri)+sum(log(gauss(X(i,:),mu,sg)));
  end
  pred=classes(sc==max(sc)); acc=acc+(pred==y(i));
end
fprintf('朴素贝叶斯分类准确率=%.3f\n', acc/height(X));

配套文件:m_nb.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

两维特征 + 二分类标签(两类近似高斯可分)。用于高斯朴素贝叶斯:估计各类每维均值/方差与先验,算后验概率分类。

  • 字段:x1, x2, label
  • 行数:40 行
  • 下载:nb.csv

十、常见误区与避坑清单

  • 特征强相关时假设偏
  • 需平滑防零概率
  • 类别不平衡看先验

十一、结果怎么解读

输出各类概率,最大者即预测类。

十二、常与谁搭配

与逻辑回归、决策树、支持向量机互为分类基线;可用主成分分析降维预处理。

十三、论文写作技巧(怎么把它写进论文)

把 朴素贝叶斯 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

开篇说明是数据驱动预测,给出特征工程与样本规模。对比传统统计模型,点出 朴素贝叶斯 能自动捕捉非线性 / 交互效应,但也要诚实说明需要调参与防过拟合。

2. 结果怎么写(图表与指标)

给学习曲线(样本量 vs 性能)、交叉验证平均 ± 标准差表、特征重要性排序图。多个模型横向对比误差。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 朴素贝叶斯 进行文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt 朴素贝叶斯 to 文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

必须做交叉验证而非单次划分;报告方差而不仅是均值;说明超参搜索范围,避免「炼丹」嫌疑。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

针对信贷违约预测,本文采用 朴素贝叶斯,经 5 折交叉验证平均 AUC=0.91±0.02,特征重要性显示收入稳定性与负债比为关键因子,模型在独立测试集上保持稳健。

For credit default prediction, we adopt 朴素贝叶斯 and obtain AUC=0.91±0.02 under 5-fold cross-validation; feature importance highlights income stability and debt ratio as key drivers, with stable performance on a held-out test set.

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。