一、实验目的
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时有:
因篇幅问题不能全部显示,请点此查看更多更全内容