《机器学习实战》(笔记)— 朴素贝叶斯

作者:杨润炜
日期:2018/2/22 22:45

朴素贝叶斯

学习内容

  • 1.了解贝叶斯公式及作用
  • 2.实现朴素贝叶斯

我的理解

  • 贝叶斯是一种基于概率论的分类方法。首先需要了解什么是条件概率,它表示在某条件下事件发生的概率,写作p(c|x),表示在x条件下,c发生的概率。贝叶斯公式为:
    p(c|x) = p(x|c)p(c) / p(x)
    这个公式告诉我们怎样交换条件概率中的条件与结果。实际场景中我们可以通过数据集知道在各个类别的前提下,特征的概率是多少,这样我们就能利用贝叶斯公式算出在知道样本数据特征的情况下,计算出该样本对应的各个类别的概率,然后取概率最大的作为此数据最可能的类别。

  • 这里用贝叶斯实现对留言文本进行二分类识别。
    获取数据集:代码略。
    数据向量化:

    1. # 将数据集里出现的词去重后放到一维向量中
    2. def createVocabList(dataSet):
    3. vocabSet = set([])
    4. for document in dataSet:
    5. vocabSet = vocabSet | set(document)
    6. return list(vocabSet)
    7. # 将输入文档inputSet转化为文档向量,此向量的每一元素为0或1,分别表示词汇表中的单词在输入文档中是否出现。
    8. def setOfWords2Vec(vocabList, inputSet):
    9. returnVec = [0]*len(vocabList)
    10. for word in inputSet:
    11. if word in vocabList:
    12. returnVec[vocabList.index(word)] = 1
    13. else: print "the word: %s is not in my Vocabulary!" % word
    14. return returnVec

    朴素贝叶斯的训练函数:
    为降低概率为0的影响,将所有词出现的出现数初始为1,计算的分母初始为2;为了防止条件概率的乘积导致数值下溢出为0,需要对乘积结果取自然对数。

    1. def trainNB0(trainMatrix,trainCategory):
    2. numTrainDocs = len(trainMatrix)
    3. numWords = len(trainMatrix[0])
    4. # 因为这里是二分类,所以只计算其中一个分类的概率
    5. pAbusive = sum(trainCategory)/float(numTrainDocs)
    6. # 数据集中两个类别的概率向量,即是在某类别发生的情况下,各个词对应的条件概率
    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(p0Num/p0Denom)
    18. return p0Vect,p1Vect,pAbusive

    朴素贝叶斯分类函数:

    1. def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    2. p1 = sum(vec2Classify * p1Vec) + log(pClass1)
    3. p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    4. if p1 > p0:
    5. return 1
    6. else:
    7. return 0
    8. def testingNB():
    9. # 加载数据集
    10. listOPosts,listClasses = loadDataSet()
    11. # 数据向量化
    12. myVocabList = createVocabList(listOPosts)
    13. trainMat=[]
    14. for postinDoc in listOPosts:
    15. trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    16. # 计算各类别的概率微量
    17. p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
    18. # 测试样本
    19. testEntry = ['love', 'my', 'dalmation']
    20. thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    21. print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    22. testEntry = ['stupid', 'garbage']
    23. thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    24. print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

    运行结果:

    1. >>> import bayes
    2. >>> bayes.testingNB()
    3. ['love', 'my', 'dalmation'] classified as: 0
    4. ['stupid', 'garbage'] classified as: 1

    完整代码请查看:朴素贝叶斯

意义

了解贝叶斯这一普遍有效的概率论分类方法的原理和实现。

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/95.html
邮箱:glowrypauky@gmail.com
QQ: 892413924