朴素贝叶斯算法

介绍概率和条件概率:

 假设一个盒子里装了3个灰球和4个黑球,则黑球的概率是4/7,灰球的概率是3/7,这就是我们学习过的概率。

现将这7个球分别放在A,B两个盒子里边,其中,A盒子里边装2个灰球,2个黑球,B盒子里边装1个灰球,2个黑球,此时,如果我们计算从B中取出灰球的概率,这个就是条件概率。

计算方法:

P(灰|B)=P(灰 and B )/P(B)=1/7 *7/3=1/3

P(灰 and  B)=B中灰球个数/两个桶的总数 =1/7

另一种有效计算条件概率的方法称为贝叶斯准则:

                                                 P(c|x)P(x)=P(x|c)P(c)

若我们知道P(x|c),求P(c|x),则可以变形为

                                p(c|x)=P(x|c)P(c)/P(x)

朴素贝叶斯算法主要用于文档的自动分类,文档之间的特征都是假设独立的,一个特征或者单词出现的可能性与它和其他单词相邻没有关系。这也是‘朴素’一词的含义。借鉴别人的博客里边的例子,如果我们不假设特征独立,那我们计算条件概率就容易出现0,这对于我们本身的目的是不符合的,这也是一个大胆的尝试。

(1)准备数据:

def loadDataSet():
    postingList = [  ['my','dog','has','flea','problems','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]
    return postingList,classVec

创建一个空集,取两个集合的并集,set去掉重复的词

def createVocabList(dataSet):
    vocabSet =set([])
    for document in dataSet :
        vocabSet =vocabSet | set(document)#求两个集合的并集
    return list(vocabSet)

对输入的数据进行遍历,如果该词在数据集中存在,那就把值设置为1,得到一个0,1的列表

def setOfWords2Vec(vocabList,inputSet):
    returnVec =[0]*len(vocabList) #将所有的数据设置为0
    for word in inputSet:
        if word in vocabList:#如果输入的词在词表中出现则设置为1
            returnVec[vocabList.index(word)]=1
        else : print ("the word : %s is not in my Vocabulary !" % word)
    return returnVec

(2)算法实现

我们已经将一组单词转化为一组数字,就可以计算概率,公式为

                            w是向量

也可以写成

我们把单词分类为侮辱类和非侮辱类,分别设置为1和0,则

                                              

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs= len (trainMatrix)
    numWords =len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = np.ones(numWords);p1Num=np.ones(numWords)
    p0Denom = 2.0;plDenom = 2.0
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
            p1Num+=trainMatrix[i]   #该词对应的个数
            plDenom += sum(trainMatrix[i])  #该文档的总词数
        else :
            p0Num+=trainMatrix[i]
            p0Denom +=sum(trainMatrix[i])
    p1Vect = log(p1Num/plDenom)  #取对数解决程序的下溢或计算不正确
    p0Vect = log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive
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
    
def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat = []
    for postingDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postingDoc))
    p0V,p1V,pAb=trainNB0(np.array(trainMat),np.array(listClasses))
    testEntry =['love','my','dalmation']
    thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as :',classifyNB(thisDoc,p0V,p1V,pAb))
    testEntry = ['stupid','garbage']
    thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry, 'classified a : ',classifyNB(thisDoc,p0V,p1V,pAb))
testingNB()

这里解释一下:

词集模型:我们将每个词的出现与否作为一个特征,这被描述为词集模型

词袋模型:统计某个词出现的概率,在词袋中,每个单词可以出现多次,词集中,只能出现一次

词袋模型的代码:

def bagOfWords2VecMN(vocabList,inputSet):
    returnVec =[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList
替换 setOfWords2Vec()函数。                    







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱缘之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值