机器学习----笔记之朴素贝叶斯(4)

1.算法思路:朴素贝叶斯分类属于贝叶斯分类的一种,朴素贝叶斯分类是依据贝叶斯定理并假设特征是条件独立的分类方法。具体的,首先根据数据集学习先验概率分布P(Y=y)和条件概率分布P(X=x|Y=y),然后得到联合概率密度P(X,Y),根据贝叶斯定理:P(X,Y)=P(X|Y)P(Y)=P(Y|X)P(X)和假设条件:输入特征条件独立,求得在给定X=x时,P(Y=y|X=x)概率最大的y值。

2.朴素贝叶斯法是典型的生成学习算法。朴素贝叶斯法的基本假设是条件独立性,这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少。

优点:朴素贝叶斯法的学习与预测大为简化,因而朴素贝叶斯法高效,且易于实现;

缺点:其缺点由于简化了模型,导致精确度损失,分类的性能不一定很高。

补充:在使用朴素贝叶斯进行分类时,若出现新的特征值而训练数据集中不存在该特征值,将会导致预测/分类失败,解决这一问题的方法是使用拉普拉斯平滑处理。具体的,等价于在随机变量各个取值的频数上赋予一个整数λ>0。当λ=0时,就是极大斯然估计;当 λ=1时,就成为拉普拉斯平滑。

3.python代码实现:

使用朴素贝叶斯进行文档分类:根据词句区分是否为侮辱性语句。

1)准备数据集

#_*_coding:utf-8_*_
from numpy import *

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

2)创建词语集合

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

3)根据词语集合将句子转化成词集向量或词袋向量

#词集模型
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 bagOfWords2VecMN(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]+=1
    return returnVec

4)训练数据集

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/float(numTrainDocs)#p(y=1)
    p0Num=ones(numWords);p1Num=ones(numWords)
    p0Denom=2.0;p1Denom=2.0
    for i in range(numTrainDocs):#对于每一行数据
        if trainCategory[i]==1:#如果类别标签为1
            p1Num+=trainMatrix[i]#累计到各个字的个数列表
            p1Denom+=sum(trainMatrix[i])#累计总字数
        else:
            p0Num+=trainMatrix[i]
            p0Denom+=sum(trainMatrix[i])
    #求P(x|y)
    p1Vect=log(p1Num/p1Denom)#log防止概率太小导致的下益出
    p0Vect=log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive
5)分类

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

6)测试

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,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry=['stupid','garbage']
    thisDoc=array(setOfWords2Vec(myVocabList,testEntry))
    print testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb)

4.总结:朴素贝叶斯分类方法思路比较简单,实现起来也比较容易,但是要真正利用好朴素贝叶斯来实现文本分类等还需要考虑多方面因素。比如下益出的问题,词袋模型代替词集模型,移除停用词,优化切分器等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值