统计学习方法:朴素贝叶斯

作者:桂。

时间:2017-04-20  18:31:37

链接:http://www.cnblogs.com/xingshansi/p/6740308.html



前言

本文为《统计学习方法》第四章:朴素贝叶斯(naive bayes),主要是借助先验知识+统计估计,本文主要论述其分类的思路。全文包括:

  1)模型描述

  2)算法求解

  3)理论应用

内容为自己的学习记录,其中参考他人的地方,最后一并给出链接。

一、模型描述

  A-理论框架

日常生活中,总会这么表达:“我觉得吧....”,“以我的经验来看,.....”,虽然有时候不靠谱,但它至少说明了一个认知上的问题:历史经验(数据)是有价值的。比如这样一个场景:

在我观念里,不同地区的人是这样的:

欧美人:鼻子-高,眼睛-蓝,表情-爱笑,饮食-喜欢西餐。

亚洲人:鼻子-低,眼睛-棕,表情-严肃,饮食-喜欢烧烤。

今天我在电视上又看到一个人:鼻子高高的,眼睛棕色的,表情是严肃的,我觉得吧...她可能是亚洲人

可这里边的理论依据是什么呢?

对于训练数据集:

其中为输入的特征向量,为对应的类别。通过数据集可以获取一些先验知识(通常由统计得到):

例如,类别信息:人群中亚洲人、欧美人的比例:

以及对应的条件概率,不同类别的特征信息:如欧美人中,高鼻子、爱笑、喜欢西餐....的概率:

但这样的组合数太多了,给比如N个样本,每个10个特征,就是N10种可能(有点大),而且另一方面,欧美人鼻子高不高,与他喜不喜欢西餐、爱不爱笑,很可能是相互独立的,所以Bayes作了一个比较强的假设——条件分布独立性假设

这个时候的计算量为10*N,小了很多,而且条件概率也更容易借助统计得出。借助已有信息得出的类别信息、不同类别的特征信息,就是我们的经验。

回到开始的问题:来了一个人,鼻子高高的,眼睛棕色的,表情是严肃的,这是哪里人呢?朴素贝叶斯不像昨天说的最近邻KNN(KNN的观点:不是亚洲人就是欧美人),朴素贝叶斯的说法是:这个人更可能是**人,这个可能就是概率,对应就是贝叶斯概率估计:

上面的公式直观理解就是:在给定特征下,Y不同类别的概率,特征不就是鼻子、微笑、饮食这些么,是已知的,Y对应类别,也就是欧美/亚洲人,这就完成了依靠经验的判断

观察到上面的公式可以进一步简化:

由于分母都是不变的,求解问题进一步变为:

求解概率最大的类别,就是最终结果,至此完成了朴素贝叶斯的分类问题。

  B-概率最大化与误差最小化的等价性

对于0-1风险函数:

其中是分类决策函数,可以得出:

这与朴素贝叶斯原始问题是一致的,即概率最大化(贝叶斯估计)与误差(0-1风险函数)最小化具有等价性。

  C-参数估计

这个其实上文已经提到了,就是利用已有的训练数据进行统计,得到的频率估计就当作概率估计,对应也可通过最大似然估计得出,直接给出公式(类别信息):

以及条件概率(不同类别下的特征信息):

其中是第i个样本第j个特征,是第j个特征可能取的第l个值,I为指示函数。

至此完成了参数估计。

  D-参数修正

再回顾朴素贝叶斯的准则函数:

表达式有概率的连乘,一个小的数*一个大的数,结果可能大、可能小,但0*一个大的数=0,这样一巴掌拍死是不合适的,因此希望对估计的参数修正一下,用的是additive smoothing方法,直接给出wikipedia的内容:

对应上面的最大似然估计,参数修正为:

类别信息

不同类别的特征信息

容易验证,它们仍然是一种概率存在,至此完成参数修正(不是唯一修正方法哦~)。

二、算法求解

  A-算法步骤

直接给出算法步骤:

  B-算法步骤细说

书中给出了两个例子:参数未修正参数修正,两种场景的估计,都是三步走,一样的套路。

问题描述:

参数未修正

第一步:类别信息

第二步:不同类别的特征信息

第三步:不同类别概率估计

参数修正:这里

第一步:类别信息

第二步:不同类别的特征信息

第三步:不同类别概率估计

三、理论应用

介绍一个简单的小应用:恶意留言过滤。

原始数据集:

首先载入数据集,数据集一般爬取并切割分词得到:

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]    #1 is abusive, 0 not
    return postingList,classVec

  这里类别为两类,1-恶意留言;0-非恶意留言。

因为是通过关键词判断,因此进一步简化数据集:利用 | 以及 set 将数据集重复部分删除,构建vocabulary list:

def createVocabList(dataSet):
    vocabSet = set([])  #create empty set
    for document in dataSet:
        vocabSet = vocabSet | set(document) #union of the two sets
    return list(vocabSet)

  有了数据集,还是文本信息,需要将其转换成数字信息,这样才可以进行统计。

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

三步走就可以走两步了第一步:计算类别信息,第二步:计算不同类别的特征信息。在计算之前,有两点小trick:

  • If any of these numbers are 0, then when we multiply them together we get 0. To lessen the impact of this, we’ll initialize all of our occurrence counts to 1, and we’ll initialize the denominators to 2. 因为在set 和 | 操作中,不免删除了一些单词,导致一些概率为0,这是不希望看到的,考虑到是两类,初始时 各类进行1次累加,总的进行2次累加;
  • 为了防止数值溢出,采用Log(.)变换;即:

前两步走对应的code:

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones()
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.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 = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

  对应调用上面的函数就是:

import bayes
listOPosts,listClasses = bayes.loadDataSet()
myVocabList = bayes.createVocabList(listOPosts)
trainMat=[]
for postinDoc in listOPosts:
    trainMat.append(bayes.setOfWords2Vec(myVocabList, postinDoc))

p0V,p1V,pAb=bayes.trainNB0(trainMat,listClasses) #Step1 Step2

   测试数据集:

同样首先对文本预处理,与训练数据处理类似,文本转换为数字:

testEntry = [‘stupid‘, ‘garbage‘]
thisDoc = array(bayes.setOfWords2Vec(myVocabList, testEntry))

  预处理完之后,下面就是第三步了:利用测试数据的特征,进行类别概率的计算

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

  哪家概率大,就判给哪个类别。对应测试code:

print testEntry,‘classified as: ‘,bayes.classifyNB(thisDoc,p0V,p1V,pAb)

  测试结果为:1,即恶意留言,stupid/garbage 这与实际也是相符的。

参考:

时间: 2025-01-17 11:43:39

统计学习方法:朴素贝叶斯的相关文章

统计学习方法——朴素贝叶斯法、先验概率、后验概率

朴素贝叶斯法,就是使用贝叶斯公式的学习方法,朴素就是它假设输入变量(向量)的各个分量之间是相互独立的.所以对于分量之间不独立的分布,如果使用它学习和预测效果就不会很好. 简化策略 它是目标是通过训练数据集学习联合概率分布$P(X, Y)$用来预测.书上说,具体是先学习到先验概率分布以及条件概率分布,分别如下:(但我认为,直接学习$P(X, Y)$就行了,它要多此一举算出这两个再乘起来变成$P(X, Y)$,但其实计算量差不多,可能这样更好理解吧) $P(Y = c_k), k = 1, 2, 3

统计学习方法 -> 朴素贝叶斯算法

需要知道的是在什么时候可以用朴素贝叶斯算法:需要保证特征条件独立. 主要过程是学习输入和输出的联合概率分布. 预测的时候,就可以根据输入获得对打后验概率对应的输出y. 先验概率:已知输出,求输入.后验概率相反. 简单来说朴素贝叶斯算法,就是在对样本进行学习之后,到了需要做决策的时候,给定x,给出最大概率的y.这个本质上就是一个典型的后验概率模型.不过在该模型的算法推到上,还用到了先验概率的计算.但注意:最终朴素贝叶斯就是一种后验概率模型求P(y|x). 后验概率模型有一个好处,相当于期望风险最小

统计学习方法与Python实现(三)——朴素贝叶斯法

统计学习方法与Python实现(三)——朴素贝叶斯法 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y,从而进行决策分类. 朴素贝叶斯法学习到的是生成数据的机制,属于生成模型. 设Ω为试验E的样本空间,A为E的事件,B1~Bn为Ω的一个划分,则

统计学习方法 李航---第4章 朴素贝叶斯法

第4章 朴素贝叶斯法 朴素贝叶斯 (naive Bayes) 法是基于贝叶斯定理与特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出Y. 4.1 朴素贝叶斯法的学习与分类 基本方法 朴素贝叶斯法通过训练数据集学习X和Y的联合概率分布 P(X,Y). 具体地,学习以 下先验概率分布及条件概率分布. 先验概率分布 条件概率分布 条件概率分布有指数级数量的参数,其估计实际是不可行的

统计学习四:1.朴素贝叶斯

全文引用自<统计学习方法>(李航) 朴素贝叶斯(naive Bayes)法 是以贝叶斯定理为基础的一中分类方法,它的前提条件是假设特征条件相互独立.对于给定的训练集,它首先基于特征条件假设的前提条件,去学习输入与输出的条件概率分布,然后根据此分布模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y. 1.朴素贝叶斯的学习与分类 1.1 基本方法 假设输入空间\(X \subseteq R^n\)为n维向量的集合,输入空间为类标记集合\(Y=\{c_1,c_2,\cdots,c_K\}\

Stanford大学机器学习公开课(五):生成学习算法、高斯判别、朴素贝叶斯

(一)生成学习算法 在线性回归和Logistic回归这种类型的学习算法中我们探讨的模型都是p(y|x;θ),即给定x的情况探讨y的条件概率分布.如二分类问题,不管是感知器算法还是逻辑回归算法,都是在解空间中寻找一条直线从而把两种类别的样例分开,对于新的样例,只要判断在直线的哪一侧即可:这种直接对问题求解的方法可以称为判别学习方法. 而生成学习算法则是对两个类别分别进行建模,用新的样例去匹配两个模板,匹配度较高的作为新样例的类别,比如分辨大象(y=1)和狗(y=0),首先,观察大象,然后建立一个大

NLP系列(2)_用朴素贝叶斯进行文本分类(上)

作者:寒小阳 && 龙心尘 时间:2016年1月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50597149 http://blog.csdn.net/han_xiaoyang/article/details/50616559 声明:版权全部,转载请联系作者并注明出处 1. 引言 贝叶斯方法是一个历史悠久.有着坚实的理论基础的方法,同一时候处理非常多问题时直接而又高效.非常多高级自然语言处理模型也能够从它演化而来.因此,

机器学习——朴素贝叶斯(NBC)

朴素贝叶斯分类(NBC)是机器学习中最基本的分类方法,是其他众多分类算法分类性能的对比基础,其他的算法在评价性能时都在NBC的基础上进行.同时,对于所有机器学习方法,到处都蕴含着Bayes统计的思想. 朴素贝叶斯基于贝叶斯地理和特征条件独立性假设,首先基于条件独立性假设学习输入X和输出Y的联合分布P(X,Y),同时利用先验概率P(Y),根据贝叶斯定理计算出后验概率P(Y|X),找出每个类别的最大的后验概率即确定为相应的类别.算法实现简单,学习和预测的效率都很高, 基本定义 输入空间Rn为特征化的

朴素贝叶斯(naive bayes)

朴素贝叶斯(naive bayes) 主要参考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设(称为朴素的原因)的分类方法.先看看维基百科中贝叶斯定理的描述: 贝叶斯定理(维基百科) 通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的:然而,这两者是有确定的关系,贝叶斯定理就是这种关系的陈述. 公式描述如下: P(A|B)=P(A|B)P(A)P(B) 其中P(A|B)是在B发生的情况下