高斯朴素贝叶斯
学习各类别先验与每个连续特征的类别条件高斯分布,在对数空间比较后验。
学习前需要掌握
背景与问题
概率分类可以先学各类别下数据长什么样,再结合类别先验反推类别。朴素贝叶斯用条件独立简化联合分布,使参数量随特征数线性增长。
概念定义
高斯朴素贝叶斯假设给定类别后各特征条件独立,每类每特征服从一个高斯分布,利用先验与这些似然计算后验类别概率。
直观理解
先问“如果属于这一类,出现这些特征有多合理”,再比较各类解释,而不是直接学一条分界线。
核心原理
训练为每类估计样本比例、特征均值与方差。预测对每类累加 log prior 与各维高斯 log likelihood,再在类别间归一化。使用对数避免多项小概率相乘下溢,平滑项则避免零方差除零。
“朴素”独立是给定类别之后的条件独立,既不要求全体数据边际独立,也不表示这种假设通常完全真实。重复或强相关特征会重复计入证据,使输出概率过度自信,即使类别排序尚可。
GaussianNB 适用于连续高斯近似特征,文本计数更常用 MultinomialNB,二元出现特征可考虑 BernoulliNB。选择变体应匹配输入统计,概率校准与真实分布变化仍需验证。
一维高斯似然得到 sigmoid 形后验
- 类别 0 样本为 -1、1,类别 1 样本为 1、3
- 均值分别为 0、2,方差均为 1,先验各 0.5
- 查询 x=1.5
正类概率约为 0.731059,负类约为 0.268941。
这里两类方差相同,所以对数似然差中的二次项抵消,形成线性分数。若方差不同,边界可以是二次的,不应把高斯朴素贝叶斯都视为线性分类器。
代码保留默认极小方差平滑,打印六位小数便于比较。样本只是构造高斯参数的输入,不是大样本估计精度或校准的证据。
数学表达
核心表达
最后一项对类别相同,可在 argmax 时省略;计算后验概率时仍需归一化。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1根据计数、二元或连续输入选择贝叶斯变体。
- 2仅用训练部分估计先验、均值、方差与平滑。
- 3核对对数似然和类别顺序,再验证区分能力与校准。
代码对应位置
示例 1一维高斯似然得到 sigmoid 形后验的最小验证:使用完整构造输入核对一维高斯似然得到 sigmoid 形后验,输出只表示本例计算。
计算与实现步骤
- 根据计数、二元或连续输入选择贝叶斯变体。
- 仅用训练部分估计先验、均值、方差与平滑。
- 核对对数似然和类别顺序,再验证区分能力与校准。
代码实现
示例 1
一维高斯似然得到 sigmoid 形后验的最小验证
example_01.py用途:使用完整构造输入核对一维高斯似然得到 sigmoid 形后验,输出只表示本例计算。
import numpy as np
from sklearn.naive_bayes import GaussianNB
x = np.array([[-1.], [1.], [1.], [3.]])
y = np.array([0, 0, 1, 1])
model = GaussianNB().fit(x, y)
print("means:", model.theta_.flatten().tolist())
print("variances:", [round(v, 6) for v in model.var_.flatten()])
print("posterior:", [round(v, 6) for v in model.predict_proba([[1.5]])[0]])代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对一维高斯似然得到 sigmoid 形后验,输出只表示本例计算。
y- 目标标签或连续目标值。
model- 组合预处理和估计器的模型对象。
Step 1 · 1–8 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.naive_bayes import GaussianNB
x = np.array([[-1.], [1.], [1.], [3.]])
y = np.array([0, 0, 1, 1])
model = GaussianNB().fit(x, y)
print("means:", model.theta_.flatten().tolist())
print("variances:", [round(v, 6) for v in model.var_.flatten()])
print("posterior:", [round(v, 6) for v in model.predict_proba([[1.5]])[0]])代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
means: [0.0, 2.0] variances: [np.float64(1.0), np.float64(1.0)] posterior: [np.float64(0.268941), np.float64(0.731059)]
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 独立假设当事实
- 概率未经校准
- 方差接近零
实际应用
- 小数据的快速概率基线
- 对比生成式与判别式分类思路
常见错误
- 独立假设当事实
- 概率未经校准
- 方差接近零
推荐学习资料
参考库不会生成虚假资源或无效外部链接。