贝叶斯决策理论
在机器学习中,朴素贝叶斯是基于贝叶斯决策 的一种简单形式,下面给出贝叶斯的基本公式,也是最重要的公式:
- 其中X是一个m*n的矩阵,m为他的样本数,n为特征的个数,即我们要求的是:在已知的样本情况下的条件概率。
)表示的是条件概率
)为先验概率
为什么需要朴素贝叶斯
这里有两个原因:
- 由统计学知识,如果每个特征需要N个样本,那么对于10个特征需要
个样本,这个数据无疑是非常大的,会随着特征的增大而迅速的增大。如果特征之间独立,那么样本数就可以减少到10*N,所谓的独立及时每个特征与其他的特征没有关系,当然这个假设很强,因为我们知道实际中是很难的。
- 因为独立同分布,因此在计算条件概率的时,可以避免了求联合概率,因此可以写成:
下面给算法的实现过程(打公式太难,不喜勿喷):
上述算法的修正
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”],则他的词向量为