python实现朴素贝叶斯算法的简单示例

前端之家收集整理的这篇文章主要介绍了python实现朴素贝叶斯算法的简单示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!

算法优缺点

优点:在数据较少的情况下依然有效,可以处理多类别问题

缺点:对输入数据的准备方式敏感

适用数据类型:标称型数据

算法思想:

朴素贝叶斯

比如我们想判断一个邮件是不是垃圾邮件,那么我们知道的是这个邮件中的词的分布,那么我们还要知道:垃圾邮件中某些词的出现是多少,就可以利用贝叶斯定理得到。

朴素贝叶斯分类器中的一个假设是:每个特征同等重要

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类

函数

loadDataSet()

创建数据集,这里的数据集是已经拆分好的单词组成的句子,表示的是某论坛的用户评论标签1表示这个是骂人的

createVocabList(dataSet)

找出这些句子中总共有多少单词,以确定我们词向量的大小

setOfWords2Vec(vocabList,inputSet)

将句子根据其中的单词转成向量,这里用的是伯努利模型,即只考虑这个单词是否存在

bagOfWords2VecMN(vocabList,inputSet)

这个是将句子转成向量的另一种模型,多项式模型,考虑某个词的出现次数

trainNB0(trainMatrix,trainCatergory)

计算P(i)和P(w[i]|C[1])和P(w[i]|C[0]),这里有两个技巧,一个是开始的分子分母没有全部初始化为0是为了防止其中一个的概率为0导致整体为0,另一个是后面乘用对数防止因为精度问题结果为0

classifyNB(vec2Classify,p0Vec,p1Vec,pClass1)

根据贝叶斯公式计算这个向量属于两个集合中哪个的概率高

  1. # @param 朴素贝叶斯算法的python实现
  2. # @author 编程之家 jb51.cc|www.512Pic.com
  3. #coding=utf-8
  4. from numpy import *
  5. def loadDataSet():
  6. postingList=[['my','dog','has','flea','problems','help','please'],['maybe','not','take','him','to','park','stupid'],['my','dalmation','is','so','cute','I','love','him'],['stop','posting','stupid','worthless','garbage'],['mr','licks','ate','my','steak','how','stop',['quit','buying','food','stupid']]
  7. classVec = [0,1,1] #1 is abusive,0 not
  8. return postingList,classVec
  9. #创建一个带有所有单词的列表
  10. def createVocabList(dataSet):
  11. vocabSet = set([])
  12. for document in dataSet:
  13. vocabSet = vocabSet | set(document)
  14. return list(vocabSet)
  15. def setOfWords2Vec(vocabList,inputSet):
  16. retVocabList = [0] * len(vocabList)
  17. for word in inputSet:
  18. if word in vocabList:
  19. retVocabList[vocabList.index(word)] = 1
  20. else:
  21. print 'word ',word,'not in dict'
  22. return retVocabList
  23. #另一种模型
  24. def bagOfWords2VecMN(vocabList,inputSet):
  25. returnVec = [0]*len(vocabList)
  26. for word in inputSet:
  27. if word in vocabList:
  28. returnVec[vocabList.index(word)] += 1
  29. return returnVec
  30. def trainNB0(trainMatrix,trainCatergory):
  31. numTrainDoc = len(trainMatrix)
  32. numWords = len(trainMatrix[0])
  33. pAbusive = sum(trainCatergory)/float(numTrainDoc)
  34. #防止多个概率的成绩当中的一个为0
  35. p0Num = ones(numWords)
  36. p1Num = ones(numWords)
  37. p0Denom = 2.0
  38. p1Denom = 2.0
  39. for i in range(numTrainDoc):
  40. if trainCatergory[i] == 1:
  41. p1Num +=trainMatrix[i]
  42. p1Denom += sum(trainMatrix[i])
  43. else:
  44. p0Num +=trainMatrix[i]
  45. p0Denom += sum(trainMatrix[i])
  46. p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零
  47. p0Vect = log(p0Num/p0Denom)
  48. return p0Vect,p1Vect,pAbusive
  49. def classifyNB(vec2Classify,pClass1):
  50. p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult
  51. p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
  52. if p1 > p0:
  53. return 1
  54. else:
  55. return 0
  56. def testingNB():
  57. listOPosts,listClasses = loadDataSet()
  58. myVocabList = createVocabList(listOPosts)
  59. trainMat=[]
  60. for postinDoc in listOPosts:
  61. trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
  62. p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
  63. testEntry = ['love','dalmation']
  64. thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
  65. print testEntry,'classified as: ',classifyNB(thisDoc,p0V,pAb)
  66. testEntry = ['stupid','garbage']
  67. thisDoc = array(setOfWords2Vec(myVocabList,pAb)
  68. def main():
  69. testingNB()
  70. if __name__ == '__main__':
  71. main()
  72. # End www.jb51.cc

猜你在找的Python相关文章