您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页朴素贝叶斯分类

朴素贝叶斯分类

来源:爱go旅游网
实验一 使用Naïve Bayes算法构建垃圾邮件分类器

一、实验目的

1、学习和掌握Naïve Bayes算法;

2、编程实现Naïve Bayes算法垃圾邮件分类器,并报告其错误率。

二、实验原理

1、向量空间模型

邮件是一个无结构的文本,需要把它表示成一个向量才能进行计算。一般采用向量空间模型来实现邮件向量化。

定义长度为l的词汇表V ={w1,. . ,wj,. . ,wl},对于长度为m,由单词(称为一个Token)ωk顺序组成的邮件d{ω1,. . . ωm},定义一个向量λ < x1,. . . ,xi,. . . ,xl >,其中xi = ti ( λ)/(l λ),其中ti ( λ)是第i 个Token 在λ 中的出现次数,(l λ)是λ 中的Token 总数。

2、用贝叶斯网络形式化概率分布器

一个贝叶斯分类器就是用于分类任务的贝叶斯网络,它包含了一个代表类别变量的节点C,以及代表特征变量的节点Xi。给定一个实例x( 特征变量的一组值x1,x2,. . . ,xn),贝叶斯网络能让我们计算出每个可能的类别ck的概率P(C = ck | X = x),而分类的任务就是找出使得P(C = ck | X = x)最大的ck。根据贝叶斯定理

这个式子中,P(X = x)对每个类别ck都相同,不需要考虑。先验概率P(C = ck)可以用样本空间中属于类别ck中的向量总数占样本空间中的向量总数的比例表示。最关键的就是计算P(X = x | C = ck)。

3、朴素贝叶斯分类算法

朴素贝叶斯分类算法采用了变量独立假设的最初形式,也是限制最多的一种形式,它假设每个特征变量Xi在给定类别变量C 下都是独立的,则有:

在计算过程中,取训练样本中xi的最大似然估计作为给定ck下的P(Xi = xi),即:

其中,nck是类别ck的样本数, 的样本数。

在计算

用取对数的方法将其化为:

时经常等于0,故采。

是类别ck中特征变量Xi值等于xi

朴素贝叶斯的效率很高,设m 是分类变数的个数,N 是训练样本的个数,则学习朴素贝叶斯模型的时间是O(mN),运行时进行分类的时间是O(m)。

三、实验设计

1、从文本抽取特征向量

从文本中抽取特征向量的工作已经被提前做好,所以你只要将其装载到设计好的矩阵中(在文本文类任务中称其为document-word矩阵)。在document-word矩阵中,第i行表示第i个文档/邮件,第j列表示第j个不同的字段。因而,矩阵中第(i,j)个入口表示的就是在第i个文档中,第j个字段出现的次数。

2、在nb_train.m中编写如下代码

%LEARN_NAIVE_BAYES_TEXT(Example,V)

%此函数学习概率项P(w|v),描述了从类别v中的一个文档中随机抽取的一个单词为w的概率

%也学习类别的先验概率P(V) Spam=0;%垃圾邮件数 News=0;%有用邮件数 for i=1:numTrainDocs

if trainCategory(i)==0 News=News+1;

else

Spam=Spam+1; end end

%PS :类别V中为有垃圾件的先验概率P(Spam) %PN :类别V中为有用邮件的先验概率P(News) PS=Spam/numTrainDocs;%得到垃圾邮件的概率 PN=News/numTrainDocs;%得到有用邮件的概率

%Pwj记录类别V中的学习概率P(w|v) %NK 记录单词w出现的次数

%N 记录目标值为v的不同单词位置的总数 %flag 标记是邮件分类情况

Pwj=zeros(2,numTokens); Nk=zeros(2,numTokens); Nn=zeros(2,1);

for i=1:numTrainDocs

if trainCategory(i)==0 flag=1; else

flag=2; end

for j=1:numTokens

Nn(flag,1)=Nn(flag,1)+trainMatrix(i,j); Nk(flag,j)=Nk(flag,j)+trainMatrix(i,j); end end

for i=1:2

for j=1:numTokens

Pwj(i,j)=(Nk(i,j)+1)/(Nn(i,1)+numTokens); end end

3、在nb_test.m中添加如下代码

%Yes为分类正确的概率 %No为分类错误的概率 for i=1:numTestDocs

Yes=log10(PS);No=log10(PN); for j=1:numTokens

for k=1:testMatrix(i,j)

Yes=Yes+log10(Pwj(1,j)); No=No+log10(Pwj(2,j)); end end

if Yes>No

output(i)=0; else

output(i)=1; end end

三、实验结果

1、在MATLAB Command Window下输入: >> run('nb_train') >> run('nb_test') 得到如下结果:

2、当训练集样本数量为50时:

即错误率为0.0450。

3、当训练集样本数量为400时:

即错误率为0.0163。

4、当训练集样本数量分别为50、100、200、400、800、1400时有:

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务