朴素贝叶斯

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。朴素贝叶斯,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

朴素贝叶斯是 一种经典的分类算法

贝叶斯定理

        条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。

P(A|B)=P(AB)/P(B)  由此可以得P(AB)=P(A|B)*P(B)

即同理 P(AB)=P(B|A)*P(A)

即P(A|B)=P(B|A)*P(A)/P(B)

        全概率公式:表示若事件{A_1},{A_2}, \cdots ,{A_n}构成一个完备事件组且都有正概率,则对任意一个事件B都有公式成立: 

 朴素贝叶斯

 将全概率公式带入贝叶斯公式中,得到

朴素贝叶斯

P(A)称为先验概率,即在B事件发生前,对A事件概念的一个判断

P(A|B)称为后验概率,即在B事件发生之后,对于A事件的重新评估。

样例

下面是 随便列举的一堆数据

品德 性格 成绩 是否可以被评选为优秀学生
不好 不是
不好 不好 不是
不好
不好 不是
不好 不好 不是
不好
不好 不是

贝叶斯公式为

朴素贝叶斯

 根据贝叶斯公式转化为分类任务的表达式为

P(类别|特征)=P(类别)* P(特征|类别)/  P(特征), 然后计算P(是 |品德好 性格不好 成绩差)和 P(不是 |品德好 性格不好 成绩差),选择是或不是。

解决步骤如下:

朴素贝叶斯

朴素贝叶斯对文本进行分类的python代码

import numpy as np
from functools import reduce

#创建一个实验样本
def loadDataSet():
    dataSet= [['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 dataSet,classVec

# 创建一个包含在所有文档中出现的不重复词的词表
def createbvocabList(dataSet):
    vocabSet=set([])# 创建一个空集
    for doc in dataSet:
        vocabSet=vocabSet|set(doc)# 创建两个集合的并集
        vocabList=list(vocabSet)
    return vocabList

# 将文档词条转换成词向量
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)#创建一个其中所含元素都为0的向量
    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 get_trainMat(dataSet):
    trainMat=[]
    vocabList=createbvocabList(dataSet)
    for inputSet in dataSet:
        returnVec=setOfWords2Vec(vocabList,inputSet)
        trainMat.append(returnVec)
    return trainMat

# 朴素贝叶斯分类器训练函数 从词向量计算概率
def trainNB(trainMat,classVec):
    n=len(trainMat)#文档数目
    m=len(trainMat[0])#文档的词条数
    pAb=sum(classVec)/n#文档属于侮辱类的
    p0Num=np.ones(m)
    p1Num=np.ones(m)
    p0Denom=2
    p1Denom=2
    for i in range(n):
        if classVec[i]==1:
            p1Num+=trainMat[i]
            p1Denom+=sum(trainMat[i])
        else:
            p0Num+=trainMat[i]
            p0Denom+=sum(trainMat[i])
    p1V=np.log(p1Num/p1Denom)#拉普拉斯平滑,为了解决零概念事件
    p0V=np.log(p0Num/p0Denom)
    return p0V,p1V,pAb

def classifyNB(vec2Classify,p0V,p1V,pAb):
    p1=sum(vec2Classify*p1V)+np.log(pAb)
    p0=sum(vec2Classify*p0V)+np.log(1-pAb)
    print("p0",p0)
    print("p1",p1)
    if p1>p0:
        return 1
    else:
        return 0
def testingNB(testVec):
    dataset,classVec=loadDataSet()
    vocabList=createbvocabList(dataset)
    trainMat=get_trainMat(dataset)
    p0V,p1V,pAb=trainNB(trainMat,classVec)
    thisone=setOfWords2Vec(vocabList,testVec)
    if classifyNB(thisone,p0V,p1V,pAb)==1:
        print("属于侮辱类")
    else:
        print("属于非侮辱类")

testVec=["stupid","garbage"]
print(testingNB(testVec))

testVec1=["love","my"]
print(testingNB(testVec1))

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/197061.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!