1.贝叶斯决策理论
贝叶斯决策理论的核心思想是选择具有最高概率的决策.
如果p(1|x,y)>p(2|x,y),那么类别是1;
如果p(1|x,y)<p(2|x,y),那么类别是2;
贝叶斯概率引入先验知识和逻辑推理来处理不确定命题;
另一种概率解释是频数概率,只从数据本身获得结论,并不考虑逻辑推理以及先验知识.
p(Ci|x)=p(Ci)*p(x|Ci)/p(x)
p(x|Ci)=p(x1,x2,x3,...,xn|Ci)=p(x1|Ci)p(x2|Ci).....p(xn|Ci)
p(x1|Ci)计算由极大似然估计得到,即分母为样本属于类别Ci的样本数量,分子为样本既属于Ci且样本中出现了x1的样本数量,分子/分母得到的就是p(x1|Ci).
2.朴素贝叶斯
一般过程:
(1)准备数据:数值型或布尔型数据,将每个文本片段表示成一个词条向量,值(0/1)代表词典中相对应的单词在此文档中出现.整个过程需要维护一个词典,里面存储需要考虑的单词.
(2)训练算法"计算不同的独立的特征的条件概率
(3)测试算法:计算错误率
(4)使用算法:一个常见的朴素贝叶斯应用是文本分类.可以在任意的分类场景中使用朴素贝叶斯分类器,不一定是文本.
2个假设:
(1)特征之间相互独立,即一个特征或者单词出现的可能性与它和其他单词相邻没有关系;解释了'朴素';
(2)每个特征同等重要:朴素贝叶斯分类器一般有2种实现方式,一种是基于贝努利模型实现,一种基于多项式模型实现.前者不考虑词在文档中出现的频率,只考虑出不出现.后者考虑的是词在文档中出现的次数.
分类器训练算法代码如下:
<span style="font-size:14px;">def trainNB(trainMatrix,trainCategory):
trainNum = len(trainMatrix)
wordNum = len(trainMatrix[0])
pO1 = sum(trainCategory)/float(trainNum) #the probablity of class=1
p0num = ones(wordNum);p1num = ones(wordNum)
wordNums0 = 2.0; wordNums1 = 2.0
for i in range(trainNum):
if (trainCategory[i] == 1):
p1num += trainMatrix[i] #统计在类别为1的情况下,词典中每个词出现的次数
wordNums1 += sum(trainMatrix[i])
else:
p0num += trainMatrix[i] #统计在类别为0的情况下,词典中每个词出现的次数
wordNums0 += sum(trainMatrix[i])
p1Vec = log(p1num/wordNums1) #统计在类别为1的情况下,词典中每个词出现的概率p(wi|c=1)
p0Vec = log(p0num/wordNums0) #统计在类别为0的情况下,词典中每个词出现的概率p(wi|c=0)
return p0Vec,p1Vec,pO1</span>
p0Vec,p1Vec,pO1分别表示:
在标签为正常邮件中,词典中每个词的出现概率;
在标签为垃圾邮件中,词典中每个词出现概率;
邮件集中垃圾邮件的概率.
p(ci|w)=p(w|ci)p(ci)/p(w),由于对同一个文档,p(w)的概率是一定的,故在分类时,只需要计算p(w|ci)p(ci);
由于'朴素'假设,因此p(w|ci)=p(w1,w2,...,wn|ci)=p(w1|ci)p(w2|ci)....p(wn|ci);
p(ci)为邮件标签是i的概率;
test code is below:
<span style="font-size:14px;">def classifyNB(vec2classify,p0Vec,p1Vec,pClass1):
p0 = sum(vec2classify * p0Vec) + log(1.0 - pClass1)
p1 = sum(vec2classify * p1Vec) + log(pClass1)
if (p1 > p0):
return 1
else :
return 0</span>
3.注意事项
(1)在计算p(w1|ci)p(w2|ci)....p(wn|ci)过程中,若其中一个概率为0,则最后的乘积也为0,为避免这种情况的发生,采用拉普拉斯平滑,将所有词的出现次数初始化为1,并将分母初始化为2;
拉普拉斯平滑公式:p(y=ck)=(q+类别为k的总数)/(总数据量+N*q) N为类的个数 q=1
此处用的拉普拉斯平滑公式:p(w1|ci)=(q+类别为i且出现w1的样本数量)/(样本中属于类别i的样本数量+N*q) N为类的个数 q=1
(2)下溢出问题:这是由于太多很小的数相乘造成的;当计算乘积p(w1|ci)p(w2|ci)....p(wn|ci)时,由于大部分因子都非常小,所以程序会下溢出得到不正确的答案.这个问题的解决办法是对乘积取自然对数,通过求对数会避免下溢出或者浮点数舍入导致的错误,同时,采用自然对数进行处理不会有任何损失.
(3)词集模型:将每个单词出现与否作为一个特征;
词袋模型:将每个单词出现次数作为一个特征;
4. 优缺点
(1)优点:对小规模数据表现很好,适合多分类任务,适合增量式训练.
(2)缺点: 对输入数据的表达形式很敏感.
5. 参考
[1]常见面试之机器学习算法思想简单梳理:http://www.cnblogs.com/tornadomeet/p/3395593.html