机器学习实战(4)朴素贝叶斯学习笔记_20170707

来源:互联网 发布:淘宝哪个店卖高仿aj好 编辑:程序博客网 时间:2024/06/09 14:16
机器学习之朴素贝叶斯实战:
    朴素贝叶斯————基于贝叶斯定理与特征条件独立假设的分类方法
    对于给定数据集,首先计算基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出
后验概率最大的输出y。
    用p1(x,y)表示数据(x,y)属于类别1的概率
    用p2(x,y)表示数据(x,y)属于类别2的概率
    如果p1>p2,那么类别为1;反之,类别为2

    推广: argmax p(ci   | x,y),使后验概率最大的ci,则(x,y)就属于ci类

其中源码第49~55行理解:

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):    p1 = sum(vec2Classify * p1Vec) + log(pClass1)       p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)    if p1 > p0:        return 1    else:         return 0
这是贝叶斯分类函数的代码

四个输入:要分类的向量vec2Classify 以及贝叶斯训练函数计算得到的三个概率值;

其中vec2Classify得到方式

    testEntry = ['love', 'my', 'dalmation']                                         # 测试样本    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))    # setOfWordsVec函数用来检查测试样本是否在训练的词组中    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)   # thisDoc = vec2Classify 这时是一个{0,1}集合的数组
接下来解释 p1和p0的计算

   p1 = sum(vec2Classify * p1Vec) + log(pClass1)      p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
已知:p( ci | w ) = p( w | ci ) * p( ci ) / p( w )

因为p( w )是定量,所以要求使之值最大的ci,即求p( w | ci ) * p ( ci )的最大值

分类函数中 ci = {0,1} 由于朴素贝叶斯假设所有特征都相互独立,则有

p( w | ci) = p( w0, w1, ... , wn | ci) = p( w0 | ci ) * p( w1 | ci ) * .... * p( wn | ci )

取对数(不影响函数单调性):

ln p ( w | ci)  = sum ( ln p( wn | ci ))    ( n = 1, 2, .... )

所有原式取对数,ln( p( w | ci) * p( ci ) ) = sum ( ln p( wn | ci) ) + ln p( ci )

p(1) = pClass1 所以 p(0) = 1 - pClass1


原创粉丝点击