本系列文章由云端暮雪编辑,转载请注明出处
多谢合作!
基础介绍
今天介绍一种简单高效的分类器——朴素贝叶斯分类器(Naive Bayes Classifier)。
相信学过概率论的同学对贝叶斯这个名字应该不会感到陌生,因为在概率论中有一条重要的公式,就是以贝叶斯命名的,这就是“贝叶斯公式”:
贝叶斯分类器就是基于这条公式发展起来的,之所以这里还加上了朴素二字,是因为该分类器对各类的分布做了一个假设,即不同类的数据样本之间是相互独立的。这样的假设是非常强的,但并不影响朴素贝叶斯分类器的适用性。1997年,微软研究院的 Domingos 和 Pazzani 通过实验证明,即使在其前提假设不成立的情况下,该分类器依然表现出良好的性能。对这一现象的一个解释是,该分类器需要训练的参数比较少,所以能够很好的避免发生过拟合(overfitting)。
实现说明
下面我们一步步来实现贝叶斯分类器。
分类器的训练分两步:
计算先验概率;
计算似然函数;
应用过程只需利用训练过程中得到的先验概率和似然函数计算出后验概率即可。
所谓先验概率,其实就是每个类出现的概率,这个是个简单的统计问题,即把训练数据集中不同类所占的比值都计算出来即可。
训练似然函数与此类似,就是看各个特征对应的值属于某个类的概率值。
至于后验概率,一般不会真的去完整计算,而是只计算贝叶斯公式右边分子部分,因为分母部分知识归一因子,对特定的问题是一个常数值。
代码示例
对朴素贝叶斯分类器有了最基本的认识之后,下面我们开始尝试用 MATLAB 设计一个出来。
首先计算先验概率:
function priors = nbc_Priors(training)
%NBC_PRIORS calculates the priors for each class by using the training data
%set.
%% priors = nbc_Priors(training)
%% Input:
% training - a struct representing the training data set
% training.class - the class of each data
% training.features - the feature of each data
%% Output:
% priors - a struct representing the priors of each class
% priors.class - the class labels
% priors.value - the priors of its corresponding classes
%% Running these code to get some examples:
%nbc_mushroom
%% Edited by X. Sun
% My homepage: http://pamixsun.github.io/
%%
% Check the input arguments
if nargin
error(message('MATLAB:UNIQUE:NotEnoughInputs'));
end