朴素贝叶斯法

一、全概率公式与贝叶斯公式

下面是是全概率公式和贝叶斯公式的定义(张宇概率九讲)

贝叶斯定理是在事件已经发生后,反过来讨论事件在那个条件下发生的概率。下面以一个例题来讲解全概率公式和贝叶斯公式

二、朴素贝叶斯算法

朴素贝叶斯算法属于生成模型,需要对p(x|y)进行建模,如下图所示:

p(y)称为先验概率,他给出的是属于那一个类别的概率,这个一般比较好计算。p(x|y)是likelihood,就是下面的条件概率,这个不好求。p(y|x)是后验概率。

在计算条件概率时,提出了条件独立假设,因为这个假设,才有了朴素贝叶斯的名字。

正常计算条件概率的时候,应该是下面的式子:

但是,这样计算复杂度太大,X有N个特征,假设每一个特征都有两个取值,则所有的可能性为2^N,这样计算明显太过复杂,于是引入条件独立假设:

这样计算,可能性只有2N种可能,大大简化了计算,虽然在现实生活中这个条件不成立,但是它的效果还不错。这也是这个模型为什么能用的原因吧。

下面是整个朴素贝叶斯的流程图:

下面以例题为例讲解朴素贝叶斯:

三、贝叶斯估计

四、用朴素贝叶斯分类宠物评论是否是含有侮辱性词语

首先创建数据集

def loadDataSet():
    """
        创建数据和标签,这是一个用来区分是否有侮辱性文字的例子
        1表示言论中有侮辱性字样,0表示言论中没有侮辱性字样
    """
    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

根据数据中的单词,创建词集

def createVocabList(dataSet):
    """
        将所有上面数据中出现的单词整合到一个set中,去掉重复的单词
        其中|表示的是两个Set取交集
    """
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet|set(document)
    return list(vocabSet)

对于新的数据,需要把数据转换成一个向量

def setOfWords2Vec(vocabList,inputSet):
    """
        将InputSet中的单词转化为向量
        returnVec是和vocabList一样长的list,如果inputSet中的单词存在voabList中,
        则标记为1存入returnVec中
    """
    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

进行测试

listIPosts,listClasses = loadDataSet()
myVocabList = createVocabList(listIPosts)

创建的词表如下:

将my dog has flea problems help please转换为对应的词向量

setOfWords2Vec(myVocabList,listIPosts[0])

下面是将my dog has flea problems help please转换为对应的特征向量。

                                           

下面开始计算用朴素贝叶斯进行分类

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    #计算P(Ci)
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = np.ones(numWords)
    p1Num = np.ones(numWords)
    p0Denom = 2.0
    p1Denom = 2.0
    计算P(Wi|c=1)和P(Wi|c=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求和就是结果
    p1Vect = np.log(p1Num/p1Denom)
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive

下面是对它进行预测:

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1 = sum(vec2Classify*p1Vec) + np.log(pClass1)
    p0 = sum(vec2Classify*p0Vec) + np.log(1.0 - pClass1)
    if p1>p0:
        return 1
    else:
        return 0

将所有内容进行整合,进行预测:

def testingNB():
    lisOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(lisOPosts)
    trainMat = []
    for postinDoc in lisOPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
    p0v,p1v,pAb =trainNB0(np.array(trainMat),np.array(listClasses))
    testEntry = ['love','my','dalmation']
    thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'clasified as:',classifyNB(thisDoc,p0v,p1v,pAb))
    testEntry = ['stupid','garbage']
    thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'clasified as:',classifyNB(thisDoc,p0v,p1v,pAb))

预测结果为

参考资料:1>李航统计机器学习

                    2>机器学习实战

                    3>CS229课程资料

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值