朴素贝叶斯
优点:在数据较少的情况下仍然有效,可以处理多类别问题
缺点:对于输入数据的准备方式较为敏感
适用数据类型:标称型数据
朴素贝叶斯决策理论的核心思想:选择具有最高概率的决策
朴素贝叶斯的一般过程
(1)收集数据:可以使用任何方法。
(2)准备数据:需要数值型或者布尔型数据。
(3)分析数据:有大量特征时,回值特征作用不大,此时使用直方图效果更好
(4)训练算法:计算不同的独立特征的条件概率
(5)测试算法:计算错误率
(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定是文本

 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 createVocabList(dataSet):
#创建一个空集
vocabSet = set([]) #create empty set
for document in dataSet:
#创建两个集合的并集
vocabSet = vocabSet | set(document) #union of the two sets
return list(vocabSet) #该函数的输入参数为词汇表及其某个文档,输出的是文档向量,向量的每一元素为1或0,
# 分别表示词汇表中的单词在输入文档中是否出现。
#函数首先创建一个和词汇表等长的向量,并将其元素都设置为0.接着,遍历文档中的所有单词,
# 如果出现了词汇表中的单词,则将输出的文档向量中对应值设为1.一切顺利的话,就不需要
# 检查某个词是否还在vocabList中,后边可能会用到这一操作
def setOfWords2Vec(vocabList, inputSet):
#创建一个维度都为0的向量
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] = 1
else: print ("the word: %s is not in my Vocabulary!" % word)
return returnVec
'''
该函数的伪代码如下:
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现文档中则增加该词条的计数值
增加所有词条的计数值
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到条件概率
返回每个类别的条件概率
''' #
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
#初始化概率
pAbusive = sum(trainCategory)/float(numTrainDocs)
p0Num = ones(numWords); p1Num = ones(numWords) #change to ones()
p0Denom = 2.0; p1Denom = 2.0 #change to 2.0
for i in range(numTrainDocs):
#向量相加
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
#对每个元素做除法
p1Vect = log(p1Num/p1Denom) #change to log()
p0Vect = log(p0Num/p0Denom) #change to log()
return p0Vect,p1Vect,pAbusive def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0 def bagOfWords2VecMN(vocabList, inputSet):
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] += 1
return returnVec def testingNB():
listOPosts,listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
trainMat=[]
for postinDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
testEntry = ['love', 'my', 'dalmation']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print(testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb))
testEntry = ['stupid', 'garbage']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print (testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb))
#如果一个词在文档中出现不止依次,这可能意味着包含该词是否出现的文档所不能表达的某种信息,
# 这种方法被称为词袋模型。
# # mySent='This book is the best book on Python or M.L. I have ever laid eyes upon.'
A=mySent.split()
print(A)

小结:

对于分类而言,使用概率有时要比使用硬规则更为有效。贝叶斯概率及贝叶斯准则提供了一种利用已知值来估计未知概率的有效方法。

可以通过特征之间的条件独立性假设,降低对数据量的需求。独立性假设是指一个词的出现概率并不依赖于文档中的其他词。当然我们也知道这个假设过于简单,这就是之所以称之为朴素贝叶斯的原因。尽管条件独立性假设并不正确,但是朴素贝叶斯仍然是一种有效的分类器。

最新文章

  1. 《像计算机科学家一样思考Java》—— 读后总结
  2. usr类库的使用(一般用在第三方类库使用系统库报错头文件找不到时)
  3. Javascript学习笔记:3种定义函数的方式
  4. 浅析jquery ui的datepicker组件
  5. 分享google的技能的11个级别,大家看看自己到哪个级别了?
  6. iOS开发小技巧--学会包装控件(有些view的位置由于代码或系统原因,位置或者尺寸不容易修改或者容易受外界影响)
  7. 防止ViewPager中的Fragment被销毁的方法,更加流畅
  8. java synchronized类锁,对象锁详解(转载)
  9. MapSearch 阅读随笔
  10. intellij idea 注释行如何自动缩进?
  11. WIFI(1)WIFI直连 + socket 可以用来实现类似蓝牙传输数据的功能
  12. android 10 事件
  13. IT痴汉的工作现状13-吓唬电话
  14. 深耕教育行业,RealSeer联合黑晶科技发布“AR超级教室”
  15. 2017-07-09(tar who last)
  16. Ocelot中文文档-转换Claims
  17. Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!
  18. PostgreSQL中JSON、JSONB基本操作符
  19. Innodb 状态的部分解释
  20. kindeditor编辑器上传图片

热门文章

  1. Validation failed for one or more entities. See ‘EntityValidationErrors’,一个或多个验证错误 解决方法
  2. Google,真的要离我们而去吗?
  3. FusionCharts使用教程:为JavaScript图表提供数据
  4. HDU1664 BFS + 数论 + 剪枝
  5. linux 命令——2 cd (转)
  6. linux 命令——31 /etc/group文件(转)
  7. raspberrypi&linux
  8. 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复
  9. 分析ELF的加载过程
  10. python_24_test