朴素贝叶斯(有实例,matlab实现)

来源:互联网 发布:正规淘宝刷销量平台 编辑:程序博客网 时间:2024/06/08 18:59

1 贝叶斯定理

(1)P(H|X):在条件X下,H的后验概率。对于一封具体的邮件,它是垃圾邮件的概率

(2)P(H):只与总体概率分布有关,与抽样无关,是先验概率。在大量的邮件中(大总体)。垃圾邮件的概率

(3)这里写图片描述:有一封具体的邮件,它是垃圾邮件的概率=(在已知垃圾邮件中包含已给邮件某种特征的概率*垃圾邮件的先验概率)/其特征出现的先验概率

2 朴素贝叶斯,只做最原始的假设:特征相互独立假设

这里写图片描述

当得到的某个这里写图片描述时,可以将其删除,也可以采用拉普拉斯校准法,将每个计数加一,避免概率值为0。

例:以下是数据集,我们要预测是否购买电脑,选取了4个属性,同时将数据集重新编码。

这里写图片描述

这里写图片描述

在matlab中运行该程序,得到testdata=[1 3 1 2]这一个样本应分为第一类,也就是说在学生当中,年龄小但经济实力好,当然学生信用基本都好,他们购买电脑可能性大。由于数据量少,正确率不做分析。

clear;clc;load('buycomputer.mat');load('class.mat');M=size(data);count1=0;count2=0;m=M(1);n=M(2);for i=1:n    c = size(unique(data(:,i)));    b(i)=c(1);endcount_1=zeros(n,max(b));%n为属性个数,max(b)为各个属性的最大取值数量,因为要考虑属性的不平衡count_2=zeros(n,max(b));data=double(data);for i=1:m    x=data(i,:);    if class(i)==1        count1=count1+1;        for j=1:n    %指示第j个属性            for k=1:b(j)    %第j个属性为哪个值                if x(j)==k                    count_1(j,k)=count_1(j,k)+1;                    break;                end            end        end    elseif class(i)==2        count2=count2+1;        for j=1:n    %指示第j个属性            for k=1:b(j)    %第j个属性为哪个值                if x(j)==k                    count_2(j,k)=count_2(j,k)+1;                    break;                end            end        end    endendy1=count1/m;y2=count2/m;for i=1:4    for j=1:b(i)        y_1(i,j)=count_1(i,j)/count1;        y_2(i,j)=count_2(i,j)/count2;    endendy_1=y_1+1;y_2=y_2+1;testdata=[1 3 1 2];w=size(testdata,1);for i=1:w       test=testdata(i,:);    p1=y1*y_1(1,test(1))*y_1(2,test(2))*y_1(3,test(3))*y_1(4,test(4));    p2=y2*y_2(1,test(1))*y_2(2,test(2))*y_2(3,test(3))*y_2(4,test(4));    if p1>p2        ans=1    else        ans=2    endendans =     1

3 总结

贝叶斯算法可用于各种分类场景,但更常见的是应用于文本挖掘,这得益于它可以处理具有大量特征的多分类问题,比如垃圾邮件的分类,网页的自动分类等。但由于有前提假设在先,若在实际场景中违背了这假设,将会影响正确率,当然可以通过增大样本量来提高正确率,但如果样本已无法增加,就应该考虑其他方法。还有一个问题是样本的数据类型,若是连续的,可以将其转化为分类变量,但界限如何划分应着重考虑;也可直接使用连续变量计算概率方法求解。