基于朴素贝叶斯分类算法实现垃圾邮箱分类

贝叶斯决策理论

在机器学习中,朴素贝叶斯是基于贝叶斯决策 的一种简单形式,下面给出贝叶斯的基本公式,也是最重要的公式:

这里写图片描述

  1. 其中X是一个m*n的矩阵,m为他的样本数,n为特征的个数,即我们要求的是:在已知的样本情况下的条件概率。
  2. 示例)表示的是条件概率
  3. 示例)为先验概率

为什么需要朴素贝叶斯

这里有两个原因:

  1. 由统计学知识,如果每个特征需要N个样本,那么对于10个特征需要示例个样本,这个数据无疑是非常大的,会随着特征的增大而迅速的增大。如果特征之间独立,那么样本数就可以减少到10*N,所谓的独立及时每个特征与其他的特征没有关系,当然这个假设很强,因为我们知道实际中是很难的。
  2. 因为独立同分布,因此在计算条件概率的时,可以避免了求联合概率,因此可以写成:

下面给算法的实现过程(打公式太难,不喜勿喷):
这里写图片描述

上述算法的修正

1. 最后概率可能为0

在进行分类是,多个概率乘积得到类别,但是如果有一个概率为0,则最后的结果为0,因此未来避免未出现的属性值,在估计概率时同城要进行“平滑”, 常用的是“拉普拉斯修正”(Laplacian correction),具体来说,在计算示例)的时候,将分子加1,分母加上类别数N.同样在计算 示例)的时候在分子加1,分母加上Ni,其表示第i个属性的可能的取值数。

2. 值过小可能会溢出

在实际中对概率取对数的形式,可以防止相乘是溢出。

垃圾邮件分类

在email/spam文件夹中有25封垃圾邮件,在email/ham中有25封正常邮件,将其进行垃圾邮件分类。

分词

首先遇到的问题是怎样把一封邮件进行分词,即将其划分成一个个单词的形式。可以想到用正则表达式,关于正则表达式可以参考网上的资料,这里给出python的程序,实现怎样将一个长的字符冲进行分词的操作。

def textParse(bigString):
    import re          #导入正则表达式的库
    listOfTokens=re.split(r'\W*',bigString)   #返回列表
    return [tok.lower() for tok in listOfTokens if len(tok)>2]

示例:

#见最后的总程序
#可见它将一封邮件进行了分词
[yqtao@localhost ml]$ python bayes.py   
['peter', 'with', 'jose', 'out', 'town', 'you', 'want', 'meet', 'once', 'while', 'keep', 'things', 'going', 'and', 'some', 'interesting', 'stuff', 'let', 'know', 'eugene']

这里的re.split(r'\W*',bigString),表示以除了数字,字母和下划线的符合进行划分,return 的是一个列表推到式生成的列表,其中将单词长度小于等于2的过滤掉,并且将其变成小写字母。

生成词汇表

将所有的邮件进行分词后生成一个dataSet,然后生成一个词汇表,这个词汇表是一个集合,即每个单词只出现一次,词汇表是一个列表形式如:
[“cute”,”love”,help”,garbage”,”quit”…]

def createVocabList(dataSet):
    vocabSet=set([])
    for docment in dataSet:
        vocabSet=vocabSet| set(docment) #union of tow sets
    return list(vocabSet) #convet if to list 

生成词向量

每一封邮件的词汇都存在了词汇表中,因此可以将每一封邮件生成一个词向量,存在几个则为几,不存在为0,例如:[“love”,”garbage”],则他的词向量为

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值