【机器学习实战】第四章:朴素贝叶斯

朴素贝叶斯

优点:在数据较少的情况下仍然有效,可以出来多类别问题。
缺点:对于输入数据的准备方式较为敏感。
适用数据类型:标称型数据

贝叶斯

贝叶斯概率引入先验知识和逻辑推理来处理不确定命题。另一种概率解释称为频数,它只从数据本身获得结论,并不考虑逻辑推理及先验知识。

条件概率

p(c|x) = p(x|c)p(c)/p(x)

朴素贝叶斯的一般过程:

1.收集数据:可以使用任何方法。
2.准备数据:需要数值型或者布尔型数据
3.分析数据:有大量特征是,汇总特征作用不大,此时使用直方图效果更好。
4.训练算法:计算不同的独立特征的条件概率
5.测试算法:计算错误率
6.使用算法:一个常见的朴素贝叶斯应用是文档分类。可以是任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本

特征相互独立

指的是统计意义上的独立,即一个特征或者单词出现的可能性与它和其他单词相邻没有任何关系。

朴素贝叶斯实现方式

1.基于贝努力模型实现
2.基于多项式模型实现

使用Python进行文本分类

伪代码:
计算每个类别中的文档数目
对每篇训练文档:
 对每个类别:
   如果词条出现在文档中→增加该词条的计数值
   增加所有词条的计数值
对每个类别:
 对每个词条:
   将该词条的数目除以总词条数目得到条件概率
返回每个类别的条件概率

bayes.py
from numpy import *

def loadDataSet():
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
    return postingList,classVec

def createVacab(Data):
	Vaca = set([])
	for document in Data:
		Vaca = Vaca | set(document)
	return list(Vaca)

def wordOf2V(Data,Vaca):
	returnV = [0]*len(Vaca)
	for word in Data:
		if word in Vaca:
			returnV[Vaca.index(word)] = 1
		else:
			print(word," is not in Vocab")
	return returnV

def trainNB0(Mat,classVec):
	docNum = len(Mat)
	docl = len(Mat[0])
	pAB = sum(classVec) / docNum
	p0num =  ones(docl)
	p1num = ones(docl)
	p0demo = 0
	p1demo = 0
	for i in range(docNum):
		if classVec[i] == 1:
			p1num +=Mat[i]
			p1demo +=sum(Mat[i])
		else:
			p0num +=Mat[i]
			p0demo +=sum(Mat[i])
	return p0num/p0demo,p1num/p1demo,pAB

def classfifNB(dataMat,p0V,p1V,pAB):
	p1 = sum(dataMat*p1V) + log(pAB)
	p0 = sum(dataMat*p0V) + log(1.0-pAB)
	if p1>p0:
		return 1
	else:
		return 0

postingList,classVec = loadDataSet()
Vocab = createVacab(postingList)
Mat = []
for i in postingList:
	Mat.append(wordOf2V(i,Vocab))
p0V,p1V,pAB = trainNB0(Mat,classVec)
test = ['I','love','you']
vtest = wordOf2V(test,Vocab)
print(classfifNB(vtest,p0V,p1V,pAB))
test = ['stupid','garbage']
vtest=wordOf2V(test,Vocab)
print(classfifNB(vtest,p0V,p1V,pAB))
可能会存在下溢问题,由于太多很小的数相乘造成的。一种解决办法是对乘积取自然对数

朴素贝叶斯词袋模型
我们将每个词的出现与否作为一个特征,这可以被描述为词集模型。如果一个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息。
def bagOfWords2VecMN(vocablist,inputset):
	returnVec = [0]*len(vocablist)
	for word in inputset:
		if word in vocablist:
			returnVec[vocablist.index(word)] += 1
	return returnVec



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值