朴素贝叶斯算法函数

贝叶斯算法

定义

  1. 贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主管偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。

  2. 朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。
    朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。

算法原理

素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入X求出使得后验概率最大的输出Y。
设有样本数据集 (https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center),对应样本数据的特征属性集为在这里插入图片描述类变量为在这里插入图片描述,即在这里插入图片描述可以分为在这里插入图片描述

别。其中在这里插入图片描述相互独立且随机,则在这里插入图片描述的先验概率在这里插入图片描述在这里插入图片描述的后验概率在这里插入图片描述,由朴素贝叶斯算法可得,后验概率可

以由先验概率在这里插入图片描述 、证据在这里插入图片描述 、类条件概率 在这里插入图片描述计算出:
https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center

朴素贝叶斯基于各特征之间相互独立,在给定类别为 的情况下,上式可以进一步表示为下式:
https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center
由以上两式可以计算出后验概率为:
https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center
由于 的大小是固定不变的,因此在比较后验概率时,只比较上式的分子部分即可。因此可以得到一个样本数据属于类别 的朴素贝叶斯计算如下图所示:
https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center

function [class,class_prob] = gnb_classify(train,trainlabel,test)


%gnb_classify 朴素贝叶斯算法函数


%train 训练样本数据    trainlabel训练样本标签    test测试样本数据
%class 测试样本标签    class_prob预测准确率






labels = unique(trainlabel);
means = [];
stds = [];
fields = {'label','junzhi','fangcha','data'};
for i = 1:length(labels)
    index = find(trainlabel == labels(i));
    temp = {labels(i),mean(train(index,:)),std(train(index,:)),train(index,:)};
    train_class(i) = cell2struct(temp,fields,2);
    means = [means;train_class(i).junzhi];
    stds = [stds;train_class(i).fangcha];
end


for j = 1:length(test(:,1))
    tmp = test(j,:);
    iprob = exp(-(tmp-means).^2./(2*stds.^2))./(sqrt(2*pi.*stds));
    prob = prod(iprob,2);
    [class_prob(j,1),class_index(j,1)] =max(prob);
    class(j,1) = labels(class_index(j));
    
end


你可能感兴趣的:(朴素贝叶斯算法函数)