我眼中的朴素贝叶斯

既然要用到贝叶斯公式,首先给出贝叶斯公式

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

数学含义:

P(A)是先验概率,可以通过计算获得

P(B|A)是条件概率,意识是在A发生的条件下B发生的概率

P(B)是用于归一化的“证据”因子,对于给定的样本B,P(B)与类标记无关

P(A|B)就是后验概率,也是需要我们根据P(B|A),P(A)求的

这个准则有什么用呢?接下来给一个例子

使用朴素贝叶斯进行文档分类

目标是实现自动检测输入的文档是侮辱性词还是非侮辱性词

首先用图来描绘整个过程,和对贝叶斯公式的简单运用

创建训练集:

假如你有6个文档,并且知道他们个属于什么类型(侮辱/一般)词

0表示一般词,1表示侮辱词,首先把这些词汇总在一起构建一个无重复的词库

有了词库以后我们要制作训练集,就要把6六个文档用词向量的形式比表示,怎么做呢?,就用到了无重复的词库,把6个文档分别与词库比较,有就标记为1,无则为0,就得到只有01的矩阵,它的列长与词库的长度相同

这就是训练集,接下来训练

训练过程:

词矩阵:[Wi]

c1表示辱骂型词,c0表示一般词

训练的过程是要求出每一词的条件分布P([wi]|c1),P([wi]|c0)

P([wi]|c1):已知词wi是辱骂性词的条件下,它的概率是多少,概率越高表示它出现的次数越多,表示它越可能是辱骂性词

P([wi]|c0):相同可知

要求这两个条件概率,首先要把训练样本根据已知标签分成两类c1,c0,然后再求每一词出现的概率,所以最后得到两个条件概率矩阵。

得到两个矩阵后,相当于训练好的模型,但怎么实现分类呢?在回顾一下贝叶斯准则

P(cj|[wi])=p([Wi]|c1)*P(c1)/P([wi])

P(cj|[wi]):含义是已知词wi,则它是(侮辱性词/非侮辱性)的概率是多少,这就是我们要求的,求得这个概率就能确定它的分类

[Wi]是词矩阵,且假设每一个词都是相互独立,这样就简化了问题,这也是为什么叫朴素贝叶斯。

p([Wi]|c1) = p(W1|c1)*p(W2|c1)*....p(Wn|c1)

p([Wi]|c0) = p(W1|c0)*p(W2|c0)*....p(Wn|c0)

所以

P(c1|[wi]) = p(W1|c1)*p(W2|c1)*....p(Wn|c1)P(c1)

P(c0|[wi]) = p(W1|c0)*p(W2|c0)*....p(Wn|c0)P(c0)

比较P(c1|[wi]),P(c0|[wi])大小

if P(c1|[wi])>P(c0|[wi])

说明是侮辱性词的概率大

else

是一般性词

测试:

假如输入一个不知道类型的文档,根据上面的词库建立它是词向量,分别与上面的两个条件概率向量相乘,计算条件贝叶斯概率即可

代码:

#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‘]]
    #1代表侮辱性文字,0代表正常言论
    classVec = [0,1,0,1,0,1]
    return postingList,classVec

def createVocabList(dataSet):
    vocabSet = set([])
    #把词数据集去重复
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)

def setOfWords2Vec(vocabList,inputSet):
    #构建一个长度和vocabList一样的零向量
    returnVec =[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            #如果这个词在词表中有,则词向量中相应位置值设为1
            #vocabList.index(word) 返回的是词word在vocabList中的位置下标
            returnVec[vocabList.index(word)] = 1
        else:
            print ("the word :%s is not in my Vocabulary" %word)
    return returnVec

#朴素贝叶斯分类器训练trainMaxtrix训练矩阵,trainCategory标签
def trainNB0(trainMaxtrix,trainCategory):
    #行数
    numTrainDocs = len(trainMaxtrix)
    #列数
    numWords = len(trainMaxtrix[0])
    #侮辱性文档所占概率P(c1)
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    #为了防止其中一个概率为零,导致乘积为零,初始化分子为1,分母为2
    p0Num = ones(numWords)
    p1Num = ones(numWords)
    p0Denom = 2.0
    p1Denom = 2.0
    #遍历文档,每一行表示一个文档
    for i in range(numTrainDocs):
        #1表示正常言论文档,否则辱骂言论文档
        if trainCategory[i] == 1:
            #统计每个词出现的次数
            p1Num += trainMaxtrix[i]
            #辱骂词的总个数
            p1Denom +=sum(trainMaxtrix[i])
        else:
            p0Num += trainMaxtrix[i]
            p0Denom +=sum(trainMaxtrix[i])
    #p([Wi]|c1) = p(W1|c1)*p(W2|c1)*....p(Wn|c1)  因为相互独立
    #p1Vect = p1Num/p1Denom,为了防止许多小数相乘下溢,于是log一下
    p1Vect = log(p1Num/p1Denom)
    #p([Wi]|c0) = p(W1|c0)*p(W2|c0)*....p(Wn|c0)
    #p0Vect = p0Num/p0Denom
    p0Vect = log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive

#朴素贝叶斯分类器函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    #p([Wi]|c1)*P(c1) = P(c1|[wi])*P(w) 根据贝叶斯公式
    #P(c1|[wi])意思是已知词wi,则它是(侮辱性词/非侮辱性)的概率是多少
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)
    #p([Wi]|c0)*P(c0) = P(c0|[wi])*P(w)
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1;
    else:
        return 0;

def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    print("myVocabList",myVocabList)
    trainMat = []
    #把文档转换成词向量,生成一个二维向量矩阵trainMat
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
    print("trainMat",trainMat)
    p0V,p1V,pAb = trainNB0(trainMat,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))
    

代码来至机器学习实战,我做了详细的注释,结合上面的图过程可以理解

主要还帮助理解的贝叶斯公式到底是怎么实现分类的。

原文地址:https://www.cnblogs.com/zhxuxu/p/9748414.html

时间: 2024-11-04 19:05:14

我眼中的朴素贝叶斯的相关文章

mahou之朴素贝叶斯算法思想

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类 对于分类问题,其实谁都不会陌生,每个人生活中无时不刻的在进行着分类.例如,走在大马路上看到女孩子,你会下意识的将她分为漂亮和不漂亮(漂亮当然就多看几眼啦).在比如,在路上遇到一只狗,你会根据这只狗的毛发脏不脏,然后想到这是一只流浪狗还是家养的宠物狗.这些其实都是生活中的分类操作. 而贝叶斯分类是在生活中分类的基础上加以概率数学来规定定义的一种分类方式 其基本概率公式为: 怎么理解这个公式呢,这里假设你没有概率数学的

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值. 是一种监督算法. 广泛应用于垃圾邮件检测等等. 1 # _*_coding:utf-8_*_ 2 from numpy import * 3 4 # 4-1 词表到向量的转换函数(实验样本) 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems

关于朴素贝叶斯

朴素贝叶斯或者说基于贝叶斯理论的决策方法都是生成式模型.那么什么是生成式模型呢?生成式模型和判别式模型的概念分别是什么?大体来说,给定数据集x,可以直接通过建模P(c|x)来预测c,这样得到的是判别式模型.像BP网络,支持向量机,决策树都属于判别式模型.如果先对联合概率分布P(x,c)建模,然后再由此获得P(c|x),这样得到的生成式模型,例如朴素贝叶斯. 朴素贝叶斯应用的先决条件是"属性条件独立假设",即已知类别,假设所有属性相互独立.

我理解的朴素贝叶斯模型

我理解的朴素贝叶斯模型 我想说:"任何事件都是条件概率."为什么呢?因为我认为,任何事件的发生都不是完全偶然的,它都会以其他事件的发生为基础.换句话说,条件概率就是在其他事件发生的基础上,某事件发生的概率. 条件概率是朴素贝叶斯模型的基础. 假设,你的xx公司正在面临着用户流失的压力.虽然,你能计算用户整体流失的概率(流失用户数/用户总数).但这个数字并没有多大意义,因为资源是有限的,利用这个数字你只能撒胡椒面似的把钱撒在所有用户上,显然不经济.你非常想根据用户的某种行为,精确地估计一

NLP系列(4)_朴素贝叶斯实战与进阶(转)

http://blog.csdn.net/han_xiaoyang/article/details/50629608 作者: 寒小阳 && 龙心尘 时间:2016年2月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50629608 http://blog.csdn.net/longxinchen_ml/article/details/50629613 声明:版权所有,转载请联系作者并注明出处 1.引言 前两篇博文介绍了朴素贝叶

朴素贝叶斯

一.随机变量 可以取不同的值,不同的值有不同的概率. 看到随机变量取任何值,都要想到背后有个概率,如果是连续变量,在每一点的概率是0,连续型随机变量通常只考虑概率密度. 机器学习就是通过一堆随机变量预测另一个随机变量,先假设随机变量之间的概率分布,然后从数据中估计分布的参数. 任何概率模型的假设都是简化,不能完全刻画数据,并且每个模型都有其适用范围,比如朴素贝叶斯对于文本分类效果好. 二.贝叶斯定理 贝叶斯定理给出了从一种条件概率P(B|A)怎么推到另一种条件概率P(A|B): 这个东西有什么用

机器学习实战读书笔记(四)基于概率论的分类方法:朴素贝叶斯

4.1 基于贝叶斯决策理论的分类方法 朴素贝叶斯 优点:在数据较少的情况下仍然有效,可以处理多类别问题 缺点:对于输入数据的准备方式较为敏感 适用数据类型:标称型数据 贝叶斯决策理论的核心思想:选择具有最高概率的决策. 4.2 条件概率 4.3 使用条件概率来分类 4.4 使用朴素贝叶斯进行文档分类 朴素贝叶斯的一般过程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法 5.测试算法 6.使用算法 朴素贝叶斯分类器中的另一个假设是,每个特征同等重要. 4.5 使用Python进行文本分类

朴素贝叶斯分类器

预备知识: 贝叶斯公式:A.B事件.在A发生条件下B发生的概率=在B发生条件下A发生的概率*B发生的概率/A发生的概率 P(B|A)=P(A|B)P(B) / P(A) 全概率公式: 特别的,设实验E的样本空间为S,A为E的事件,B1,B2,...,Bn为S的一个划分,且P(Bi)>0(i=1,2,...,n),则有P(A)=P(A|B1)*P(B1) + P(A|B2)*P(B2) + ... + P(A|Bn)*P(Bn) 故有贝叶斯的另一种形式: P(B[j]|A[i])=P(A[i]|B

挖掘算法(1)朴素贝叶斯算法

原文:http://www.blogchong.com/post/NaiveBayes.html 1 文档说明 该文档为朴素贝叶斯算法的介绍和分析文档,并且结合应用实例进行了详细的讲解. 其实朴素贝叶斯的概念以及流程都被写烂了,之所以写这些是方便做个整理,记录备忘.而实例部分进行了详细的描述,网络上该实例比较简单,没有过程. 至于最后部分,则是对朴素贝叶斯的一个扩展了,当然只是简单的描述了一下过程,其中涉及到的中文分词以及TFIDF算法,有时间再具体补上. 2 算法介绍 2.1 贝叶斯定理 (1