机器人与人工智能爱好者论坛

 找回密码
 立即注册
查看: 13521|回复: 1
打印 上一主题 下一主题

机器学习实战之——朴素贝叶斯算法学习总结

[复制链接]

8

主题

21

帖子

149

积分

版主

Rank: 7Rank: 7Rank: 7

积分
149
跳转到指定楼层
楼主
发表于 2016-1-10 16:14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小谢 于 2016-1-10 16:04 编辑

     机器学习实战之——朴素贝叶斯算法学习总结

1、贝叶斯准则:
P(A|B)=P(B|A)P(A) / P(B)

例如:一座别墅在过去的 20 年里一共发生过 2 次被盗,别墅的主人有一条狗,狗平均每周晚上叫 3 次,在盗贼入侵时狗叫的概率被估计为 0.9,问题是:在狗叫的时候发生入侵的概率是多少?

将狗叫事件看作A,盗贼入侵事件看作B。那么P(A)=3/7。P(B)=2/(20*365)=2/7300。已知盗贼入侵时狗叫的概率是0.9。则P(A|B)=0.9。
根据贝叶斯准则:P(A/B)=P(B|A)P(A)/P(B) ==> P(B|A)=P(A/B)P(B)/P(A)
                P(B|A)=0.9*(2/7300)/(3/7)=0.00058


2、使用python进行文本分类:
创建词表到向量的转换函数
  1.   def loadDataSet():
  2.       postingList=[['my','dog','has','flea','problems','help','please'],
  3.                           ['maybe','not','take','him','to','dog','park','stupid'],
  4.                           ['my','dalmation','is','so','cute','i','love','him'],
  5.                           ['stop','posting','stupid','worthless','garbage'],
  6.                           ['mr','licks','ate','my','steak','how','to','stop','him'],
  7.                           ['quit','buying','worthless','dog','food','stupid']]
  8.     classVec=[0,1,0,1,0,1]  #1代表侮辱性文字  0代表正常言论
  9.     return postingList,classVec</font>
复制代码

  1. #创建一个不重复词的列表
  2. def createVocabList(dataSet):
  3.     vocabSet=set([])
  4.     for document in dataSet:
  5.         #创建两个集合的并集
  6.         vocabSet=vocabSet | set(document)
  7.     return list(vocabSet)</font>
复制代码

  1. # 词集模型
  2. # vocabList 表示词汇表,inputSet 某个输入文档
  3. def setOfWords2Vec(vocabList,inputSet):
  4.     # 构建一个与vocabList等长的向量
  5.     returnVec=[0]*len(vocabList)
  6.     #遍历文档中所有单词,如果出现了词汇表中的单词,则将输出的文档向量中对应值设为1
  7.     for word in inputSet:
  8.         if word in vocabList:
  9.             returnVec[vocabList.index(word)]=1
  10.         else: print "the word: %s is not in my Vocabulary!" % word
  11.     # 输出文档向量
  12.     return returnVec</font>
复制代码
运行代码:
      $ python   
      >>> import bayes
      >>> listOposts,listClasses = bayes.loadDataSet()
      >>> myVocabList = bayes.createVocabList(listOposts)
      >>> myVocabList
          ['cute', 'love', 'help', 'garbage', 'quit', 'food', 'problems', 'is', 'park', 'stop', 'flea', 'dalmation', 'licks', 'not', 'him', 'buying', 'posting', 'has',               'worthless', 'ate', 'to',
      >>> bayes.setOfWords2Vec(myVocabList,listOposts[0])
          [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]
      >>> bayes.setOfWords2Vec(myVocabList,listOposts[3])
          [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

朴素贝叶斯分类器训练函数
  1. # 该函数只适用二分类问题
  2. # trainMatrix 文档矩阵,trainCategory 类别标签  
  3. def trainNBO(trainMatrix,trainCategory):
  4.       numTrainDocs=len(trainMatrix)
  5.       numWords=len(trainMatrix[0])
  6.       pAbusive=sum(trainCategory)/float(numTrainDocs)
  7.       p0Num=ones(numWords);p1Num=ones(numWords)
  8.       p0Denom=2.0;p1Denom=2.0
  9.       for i in range(numTrainDocs):
  10.              if trainCategory[i]==1:
  11.                   p1Num +=trainMatrix[i]
  12.                   p1Denom +=sum(trainMatrix[i])
  13.             else:
  14.                  p0Num +=trainMatrix[i]
  15.                  p0Denom +=sum(trainMatrix[i])
  16.     p1Vect=log(p1Num/p1Denom)
  17.     p0Vect=log(p1Num/p0Denom)
  18.     return p0Vect,p1Vect,pAbusive</font>
复制代码

  1. # 朴素贝叶斯分类函数
  2. def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
  3.       #对应元素相乘加类别对数概率
  4.       p1=sum(vec2Classify * p1Vec) + log(pClass1)
  5.       p0=sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
  6.       if p1>p0:
  7.           return 1
  8.       else : return 0</font>
复制代码

  1. 测试分类函数
  2. def testingNB():
  3.       listOPosts,listClasses=loadDataSet()
  4.       myVocabList = createVocabList(listOPosts)
  5.       trainMat=[]
  6.     for postinDoc in listOPosts:
  7.       trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
  8.       p0V,p1V,pAb=trainNBO(array(trainMat),array(listClasses))
  9.       testEntry=['love','my','dalmation']
  10.       thisDoc=array(setOfWords2Vec(myVocabList,testEntry))
  11.       print testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb)
  12.       testEntry=['stupid','garbage']
  13.       thisDoc=array(setOfWords2Vec(myVocabList,testEntry))
  14.       print testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb)
  15. </font>
复制代码

运行代码
    $ python
    >>> import bayes
    >>> bayes.testingNB()
        ['love', 'my', 'dalmation'] classified as: 1
        ['stupid', 'garbage'] classified as: 1


3、使用朴素贝叶斯过滤垃圾邮件
  1. # 接受大字符串并转换为字符串列表
  2. def textParse(bigString):
  3.      import re
  4.      listOfTokens = re.split(r'\w*',bigString)
  5.      #去掉小于两个字符的字符串,并将所有字符串转换为小写
  6.     return [tok.lower() for tok in listOfTokens if len(tok) >2 ]
复制代码
输出随机选择的电子邮件上的分类错误率
  1. def spamTest():
  2.      docList=[];classList =[];fullText =[]
  3.      # 导入文本文件并将他们解析为词列表
  4.      for i in range(1,26):
  5.          wordList = textParse(open('email/spam/%d.txt' % i).read())
  6.          docList.append(wordList)
  7.          fullText.extend(wordList)
  8.          classList.append(1)
  9.          wordList=textParse(open('email/ham/%d.txt' % i).read())
  10.          docList.append(wordList)
  11.          fullText.extend(wordList)
  12.          classList.append(0)
  13.          vocabList = createVocabList(docList)
  14.         #随机抽取10个文件并添加到测试集同时也将他们从训练集中删除
  15.          trainingSet = range(50);testSet=[]
  16.     for i in range(10):
  17.          randIndex = int(random.uniform(0,len(trainingSet)))
  18.          testSet.append(trainingSet[randIndex])
  19.          del(trainingSet[randIndex])
  20.          trainMat=[];trainClasses=[]
  21.         #随机选择数据的一部分作为训练集,剩余部分作为测试以达到交叉验证的效果
  22.    for docIndex in trainingSet:
  23.         trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
  24.         trainClasses.append(classList[docIndex])
  25.         p0V,p1V,pSpam=trainNBO(array(trainMat),array(trainClasses))
  26.         errorCount = 0
  27.    for docIndex in testSet:
  28.         wordVector = setOfWords2Vec(vocabList,docList[docIndex])
  29.         if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
  30.         errorCount +1
  31.     print 'the error rate is:',float(errorCount)/len(testSet)
复制代码
运行代码:
      $ python
      >>> import bayes
      >>> bayes.spamTest()
          the error rate is: 0.0


4、使用朴素贝叶斯分类器从个人广告中获取区域倾向
  1. # 遍历词汇表并统计每个词在文本中出现的次数,然后从高到底排序,返回排序最好的30个单词
  2. def calcMostFreq(vocabList,fullText):
  3.       import operator
  4.       freqDict ={}
  5.       for token in vocabList:
  6.            freqDict[token]=fullText.count(token)
  7.            sortedFreq = sorted(freqDict.iteritems(),key=operator.itemgetter(1),reverse=True)
  8. return sortedFreq[:30]
复制代码

  1. #与spamTest功能基本类似,区别在于这里访问的是RSS源而不是文件
复制代码

运行代码
    $ python
    >>> import bayes
    >>> ny=feedparser.parse('http://newyork.craigelist.org/stp/index.rss')
    >>> sf=feedparser.parse('http://sfbay.craigelist.org/stp/index.rss')
    >>> bayes.getTopWords(ny,sf)








bayes.rar

26.02 KB, 下载次数: 2, 下载积分: 金钱 -1

回复

使用道具 举报

0

主题

2

帖子

20

积分

注册会员

Rank: 2

积分
20
沙发
发表于 2016-11-7 15:14:04 | 只看该作者
谢 谢 楼  主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|陕ICP备15012670号-1    

GMT+8, 2024-5-9 06:11 , Processed in 0.060245 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表