机器学习笔记(一)朴素贝叶斯的Python代码实现

本文回顾了作者在研究生期间学习的计算生物学课程中遇到的贝叶斯算法,并通过《机器学习实战》一书中的代码,决定重新实践这些算法,以此加深理解。文章首先介绍了贝叶斯准则,并以区分网络用语是否文明为例,展示了朴素贝叶斯算法的应用和Python代码实现。
摘要由CSDN通过智能技术生成

上研究生的时候,一心想读生物信息学的方向,由此也选修了生物数学,计算生物学等相关课程。给我印象最深的是给我们计算生物学的主讲老师,他北大数学系毕业,后来做起了生物和数学的交叉学科研究。课上讲的一些算法比如贝叶斯,马尔科夫,EM等把我给深深折磨了一遍。由于那时候不会编程,对于这些算法的理解只有停留在理论层面。课程结束了,学习也就结束了。最后毕业了,自己没能把生物坚持下去,转而成为了一只程序猿……
偶然间,翻开了自己买的一本机器学习实战的书(Machine learning in Action),看到里面有里面也有代码实现,甚是喜欢,同时也勾起我那段算法学习时光。于是我决定将书中的代码都敲一遍,修炼修炼内功。第一篇就从听出茧子的贝叶斯算法开始吧。
贝叶斯算法的一个核心就是贝叶斯准则:
p(c|x)=p(x|c)*p(c)/p(x)
如果想知道在x条件下c发生的概率,上面的公式提供给了我们一个逆向求解的过程,就是如果我们知道了在c条件下发生x的概率(核心),再加上p(c)和p(x),就可以得到我们想要的结果。这也是上面公式的魅力所在。
在书中,作者给的第一个例子是用贝叶斯方法区分某个网络用语是否文明的。代码如下:

# coding=utf-8
from numpy import *
def loadDataSet():
    postingList=[['my','dog','has','flea','problem','help','please'],['maybe','not','take','him','to','dog','park','stupid'],
                 ['my','dalmation','is','so','cute','i','love','him'],['stop','posting','stupid','worthless','garbage'],
                 ['mr','licks','ate','my','steak','how','to','stop','him'],['quit','buying','worthless','dog','food','stupid']
                 ]
    classVec=[0,1,0,1,0,1] #1代表侮辱性文字
    return postingList,classVec

#创建当地数据库,生成一个大池子
def createVocabList(dataSet):
    vocabSet=set([])
    for document in dataSet:
        #取dataset的交集,去除重复的单词
        vocabSet=vocabSet|set(document)
    return list(vocabSet)

#将字符串转换成向量对象
def setOfWords2Vec(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]=1
        else:
            print("the word:%s is not in my Vocabulary"%word)
    return returnVec
def trainNBO(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    p0Num=ones(numWords)#将矩阵的初始值都设为1,防止一个值为0,相乘以后都为0的情况.ones()为numpy的函数
    p1Num=ones(numWords)
    p0Denom=0.0
    p1Denom=0.0
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
            print("p1Num%s"%p1Num)
            p1Num+=trainMatrix[i]
            print("trainMatrix%s"%trainMatrix[i])
            p1Denom+=sum(trainMatrix[i])
            print("p1Num%s"%p1Num)

        else:
            print("p0Num%s"%p0Num)
            p0Num+=trainMatrix[i]
            print("trainMatrix%s"%trainMatrix[i])
            p0Denom+=sum(trainMatrix[i])
            print("p0Num%s"%p0Num)
    print("p1Num%s"%p1Num);
    print("p0Num%s"%p0Num)
    #分别计算在侮辱性语言前提下每个单词出现的概率以及在非侮辱性前提下这个单词出现的概率(p(x|c1)和p(x|c0))

    p1Vect=log(p1Num/p1Denom)        #设定用log()是为了许多很小的数相乘使得结果过小而超过语言的识别范围
    p0Vect=log(p0Num/p0Denom)        #change to log()
    return  p0Vect,p1Vect,pAbusive
def classifyNB(vec2classify,p0Vect,p1Vect,pClass1):
    p1=sum(vec2classify*p1Vect)+log(pClass1)#相当于log(p(c1)*p(x1/c1)*p(x2/c1))
    p0=sum(vec2classify*p0Vect)+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=trainNBO(trainMat,listClasses)
    testEntry=['love','my','dalmation']
    thisDoc=array(setOfWords2Vec(myVocablist,testEntry))
    print ("testEntry,classified as%s"%classifyNB(thisDoc,p0V,p1V,pAb))
    testEntry=['stupid','garbage','hello']
    thisDoc=array(setOfWords2Vec(myVocablist,testEntry))
    print("testEntry,classified as %s"%classifyNB(thisDoc,p0V,p1V,pAb))

if __name__ == '__main__':

    testingNB()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值