机器学习之朴素贝叶斯分类器

朴素贝叶斯分类器

通过概率来判断输入的样本属于哪一种分类
比如我们要判断一个人挂不挂科,我们可以根据收集的样本建立如下列表
影响是否挂科可能有‘喝酒’,‘逛街’,‘学习’等因素。

考挂了(y)喝酒(x1)逛街(x2)学习(x3)
1110
0001
0101
1100
1010
0011
0010
1001

1表示该事件发生了,0表示该事件没发生。
比如第一个样本表示 喝酒 逛街 没有学习,最后挂科了。
现在我们要判断一个人
没喝酒(x1=0),没逛街(x2=0),学习(x3=1)->有没有挂科(y为0还是1),他挂科的概率是多少。
p表示概率
事件A=考挂了
事件B=喝酒
事件C=逛街
事件D=学习
p(A∧B)=事件A和事件B同时发生的概率
p(A|B)=事件B发生的情况下事件A发生的概率
p ( A ∣ B ) = p ( A ∧ B ) p ( B ) p(A|B)=\dfrac{p(A\land B)}{p(B)} p(AB)=p(B)p(AB)
p ( B ∣ A ) = p ( B ∧ A ) p ( A ) p(B|A)=\dfrac{p(B\land A)}{p(A)} p(BA)=p(A)p(BA)
p ( A ∣ B ) p ( B ) = p ( B ∣ A ) p ( A ) p(A|B)p(B)=p(B|A)p(A) p(AB)p(B)=p(BA)p(A)
p(B)右移得到贝叶斯公式
p ( A ∣ B ) = p ( B ∣ A ) p ( A ) p ( B ) p(A|B)=\dfrac{p(B|A)p(A)}{p(B)} p(AB)=p(B)p(BA)p(A)

应用到刚才的题目里面,即判断p(y=1|x1=0,x2=0,x3=1)和p(y=0|x1=0,x2=0,x3=1)哪一个概率大
代入贝叶斯公式 p ( y = 1 ∣ x 1 , x 2 , x 3 ) = p ( x 1 , x 2 , x 3 ∣ y ) p ( y ) p ( x 1 , x 2 , x 3 ) p(y=1|x1,x2,x3)=\dfrac{p(x1,x2,x3|y)p(y)}{p(x1,x2,x3)} p(y=1x1,x2,x3)=p(x1,x2,x3)p(x1,x2,x3y)p(y)
p ( y = 0 ∣ x 1 , x 2 , x 3 ) = p ( x 1 , x 2 , x 3 ∣ y ) p ( y ) p ( x 1 , x 2 , x 3 ) p(y=0|x1,x2,x3)=\dfrac{p(x1,x2,x3|y)p(y)}{p(x1,x2,x3)} p(y=0x1,x2,x3)=p(x1,x2,x3)p(x1,x2,x3y)p(y)
由于这两个式子分母一样,所有只要比较分子的大小。
根据马尔可夫假设 p ( x 1 , x 2 , x 3 ∣ y ) p ( y = 1 ) ≈ p ( x 1 ∣ y ) p ( x 2 ∣ y ) p ( x 3 ∣ y ) p ( y ) = 2 / 4 × 2 / 4 × 1 / 4 × 1 / 2 = 4 / 128 p ( x 1 , x 2 , x 3 ∣ y ) p ( y = 0 ) ≈ p ( x 1 ∣ y ) p ( x 2 ∣ y ) p ( x 3 ∣ y ) p ( y ) = 3 / 4 × 2 / 4 × 3 / 4 × 1 / 2 = 18 / 128 p(x1,x2,x3|y)p(y=1)\approx p(x1|y)p(x2|y)p(x3|y)p(y)\\=2/4\times2/4\times1/4\times1/2\\=4/128\\ p(x1,x2,x3|y)p(y=0)\approx p(x1|y)p(x2|y)p(x3|y)p(y)\\=3/4\times2/4\times3/4\times1/2\\=18/128 p(x1,x2,x3y)p(y=1)p(x1y)p(x2y)p(x3y)p(y)=2/4×2/4×1/4×1/2=4/128p(x1,x2,x3y)p(y=0)p(x1y)p(x2y)p(x3y)p(y)=3/4×2/4×3/4×1/2=18/128
可以看出p(y=0|x1,x2,x3)的概率更大,所以不会挂科(y=0)为判断结果。

使用朴素贝叶斯进行文本分类(python)

朴素贝叶斯分类器训练函数

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    p0Num=zeros(numWords);p1Num=zeros(numWords)    #初始化分子变量和分母变量
    p0Denom=0.0;p1Denom=0.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=p1Num/p1Denom         #计算条件概 率
    p0Vect=p0Num/p0Denom
    return  p0Vect,p1Vect,pAbusive

朴素贝叶斯分类函数

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    #计算两个类别的概率,返回概率更大的类别
    p1=sum(vec2Classify*p1Vec)+log(pClass1)#使用NumPy的数组来计算两个向量相乘的结果
    p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)
    if p1>p0:
        return  1
    else:
        return  0
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,'calssified as:',classifyNB(thisDoc,p0V,p1V,pAb)
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值