PRML/PRMLT项目中的朴素贝叶斯高斯分类器预测实现解析
概述
本文将深入解析PRML/PRMLT项目中nbGaussPred.m
文件的实现原理,该文件实现了基于高斯分布的朴素贝叶斯分类器的预测功能。朴素贝叶斯分类器是一种简单但高效的分类算法,特别适用于高维数据集。
朴素贝叶斯分类器基本原理
朴素贝叶斯分类器基于贝叶斯定理,并假设特征之间相互独立("朴素"的由来)。在高斯朴素贝叶斯中,每个类别的每个特征都被建模为一个高斯分布(正态分布)。
分类决策公式为:
y = argmax P(y=k) * ∏ P(x_i|y=k)
其中P(y=k)是类先验概率,P(x_i|y=k)是第i个特征在第k类下的条件概率。
函数输入输出
输入参数
model
: 训练好的模型结构,包含三个字段:mu
: 各特征在各类别下的均值矩阵(d×k)var
: 各特征在各类别下的方差矩阵(d×k)w
: 类别先验概率向量(1×k)
X
: 待预测数据矩阵(d×n),d为特征维度,n为样本数量
输出参数
y
: 预测的类别标签(1×n)
关键实现步骤解析
-
参数提取与验证:
mu = model.mu; var = model.var; w = model.w; assert(all(size(mu)==size(var)));
从模型中提取均值、方差和先验概率,并验证均值和方差矩阵维度一致。
-
计算马氏距离:
lambda = 1./var; ml = mu.*lambda; M = bsxfun(@plus,lambda'*X.^2-2*ml'*X,dot(mu,ml,1)');
这部分代码高效地计算了马氏距离的平方,分解为:
lambda'*X.^2
: 相当于∑(x_i^2/σ_i^2)-2*ml'*X
: 相当于-2∑(μ_i*x_i/σ_i^2)dot(mu,ml,1)'
: 相当于∑(μ_i^2/σ_i^2)
-
归一化常数计算:
c = d*log(2*pi)+2*sum(log(var),1)';
计算高斯分布中的归一化常数,对应:
d*log(2π) + ∑log(σ_i^2)
-
对数似然计算:
R = -0.5*bsxfun(@plus,M,c);
将马氏距离和归一化常数结合,得到对数似然值。
-
类别预测:
[~,y] = max(bsxfun(@times,exp(R),w),[],1);
将对数似然转换为概率后乘以类别先验概率,选择概率最大的类别作为预测结果。
数学推导与优化
该实现通过数学变换避免了直接计算高斯概率密度函数,转而使用对数域计算,既提高了数值稳定性,又减少了计算量。具体推导如下:
原始高斯概率密度函数:
P(x|y=k) = (1/(2πσ^2)^(d/2)) * exp(-1/2 * (x-μ)^T Σ^(-1) (x-μ))
取对数后:
log P(x|y=k) = -d/2 log(2π) - 1/2 log|Σ| - 1/2 (x-μ)^T Σ^(-1) (x-μ)
在朴素贝叶斯假设下(Σ为对角矩阵),上式简化为:
log P(x|y=k) = -d/2 log(2π) - 1/2 ∑log(σ_i^2) - 1/2 ∑(x_i-μ_i)^2/σ_i^2
这正是代码中R
的计算过程。
实际应用建议
-
数据预处理:在使用该分类器前,建议对数据进行标准化处理,避免某些特征因尺度差异过大而主导分类结果。
-
方差平滑:对于小样本数据,可以添加一个小常数到方差估计中,防止方差为零导致数值问题。
-
特征选择:朴素贝叶斯对不相关特征敏感,建议先进行特征选择。
-
多分类问题:该实现天然支持多分类问题,无需额外处理。
总结
nbGaussPred.m
文件实现了一个高效的高斯朴素贝叶斯分类器预测函数,通过巧妙的数学变换和矩阵运算优化了计算过程。理解这一实现不仅有助于使用该分类器,也为实现其他概率分类器提供了参考模板。
朴素贝叶斯分类器虽然简单,但在许多实际应用中表现出色,特别是在文本分类、垃圾邮件过滤等领域。其训练速度快、内存需求低的特性使其非常适合大规模数据集的应用场景。