机器学习实战之朴素贝叶斯

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值