朴素贝叶斯-学习笔记

朴素贝叶斯

标签(空格分隔): 机器学习



朴素贝叶斯算法适合给文档分类。

词向量

先对文档分词,所有文档中所有不同的词构成词汇表。每个文档根据词汇表能形成一个词向量,1表示对应维度的词条出现在文档中,0表示词条未出现。

这种想法推广开来,发现向量是新时代的数字
比如一个可能发生的事件集合,可以表示为一个向量,每个维度对应一个事件发生的概率。

问题描述

任给一个文档,怎样确定其分类?
每个文档对应一个词向量$\vec w$,需要确定$p(c_i|\vec w)$的最大值,即:已知这个文档的条件下,把这个文档归为哪个类的概率最大?

朴素贝叶斯

$$
分类(\vec w) = p(c_i|\vec w)_{max}=\frac{p(\vec w|c_i)p(c_i)}{p(\vec w)}
$$
其中$\vec w$表示词向量。对于任意一个分类$c_i$,$p(\vec w)$是相同的,因而只需要确定$p(\vec w|c_i)$和$p(c_i)$。

$p(c_i)$:从训练数据中,用简单除法得到。
$p(\vec w|c_i)$:根据朴素贝叶斯假设,特征向量$\vec w$在$c_i$条件下相互独立,也就是:给定目标值时属性之间相互条件独立
$$
p(\vec w|c_i)=\Pi p(w_j|c_i)
$$
而对于$p(w_j|c_i)$,只需要在扫描训练数据时,依据$c_i$过滤数据项,在这些被过滤出的数据中(都是$c_i$类的),用简单统计的结果相除,就得到在$j$维上的概率权值$e(w_j|c_i)$。为什么不是$p(w_j|c_i)$?因为最终要计算的是一个未知分类的向量$\vec x$的分类,需要将$\vec x$与概率权值向量$\vec e$对应位相乘,这才得到$p(w_j|c_i)$序列。$\vec x$中的元素非1即0,如果元素为1,那么$p(w_j|c_i)$就取$e(w_j|c_i)$,否则取0。

简单优化

条件概率乘积为0

$p(\vec w|c_i)=\Pi p(w_j|c_i)$这个公式中,一旦$p(w_j|c_i)$等于0,整个结果就是0。但是对于$\vec w$,你怎样判断$\Pi p(w_j|c_i)=0$的所有$c_i$,该如何判断哪个$c_i$更好?万一所有的$c_i$对应的$p(\vec w|c_i)=\Pi p(w_j|c_i)$都等于0,该怎样确定最终的分类?因此,要避免某个$p(w_j|c_i)$等于0。一个办法是使用拉普拉斯平滑:将所有词的出现数初始化为1,并将分母初始化为2。对应《机器学习实战》中文版P62的代码:

p0Num = onew(numWords)
p1Num = ones(numWords)
p0Denom = 2.0
p1Denom = 2.0

条件概率乘积下溢

相乘的都是概率,都是小于1的数,乘不了几次就得到非常小的数字,产生下溢,干扰比较。一个方法是用取对数。没错,就是这么老套的办法,但是管用,因为$\forall x \in (0,1)$,x越小,$\log x$的绝对值越大,或者说负的程度越大。对于$p(\vec w|c_i)=\Pi p(w_j|c_i)$取对数,就是一堆负数相加。这种情形下对于任意的$\vec x$是很方便的。

当然,公式中还有一个$p(c_i)$,也需要对数处理后相加。

代码

使用分类器

在训练阶段我们只计算$e(\vec w|c_i)$,这其实就是训练出来的分类器。一旦完成训练,就可以使用分类器:

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    """
    @param vec2Classify: 需要被分类的词向量
    @param p0Vec: 第0类对应的词概率向量
    @param p1Vec: 第1类对应的词概率向量
    @param
    """
    p1=sum(vec2Classify*p1Vec) + np.log(pClass1)
    p0=sum(vec2Classify*p0Vec) + np.log(1.0-pClass1)
    if p1>p0:
        return 1
    else:
        return 0

训练模型

使用训练数据,训练出分类器,也就是获取$e(\vec w|c_i)$和$e(c_i)$。同时修正了《机器学习实战》P61的一个bug,即对于$p1Vect和p0Vect的计算,分母应当是训练数据对应类的向量总数,而不是元素总和$:

def trainNB0(trainMatrix, trainCategory):
    """
    朴素贝叶斯分类器训练函数:计算P(\vec w|c_1)和P(\vec w|c_2)
    @param trainMatrix:训练矩阵
    @param trainCategory: 和trainMatrix配套使用的向量,表示每个trainMatrix[i]所属类别

    """
    numTrainDocs = len(trainMatrix)  #文档总数
    numWords=len(trainMatrix[0])  #向量维数:不重复的单词数量
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    p0Num=np.ones(numWords)
    p1Num=np.ones(numWords)
    p0Denom=2.0
    p1Denom=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 = p1Num/p1Denom  ##书上这句是错的
    #p0Vect = p0Num/p0Denom  ##这句也是错的

    num_c1 = sum(trainCategory)
    num_c0 = len(trainCategory) - num_c1
    p1Vect = log(p1Num / num_c1)   #这才正确的是p(\vec w|c_1)
    p0Vect = log(p0Num / num_c0)   #这才正确的是p(\vec w|c_0)

    return p0Vect, p1Vect, pAbusive #pAbusive就是p(c_1)

理论上到这里就算出了基本的表达式,可以用来比较了。

总结

感觉《机器学习实战》第四章朴素贝叶斯对于取对数的说明不够清楚,使用分类器时的向量相乘更是没有任何说明,让人一头雾水。不过章节后面的垃圾邮件分类和词语倾向性的例子还不错~

时间: 2024-10-30 06:06:50

朴素贝叶斯-学习笔记的相关文章

机器学习-朴素贝叶斯如何自我学习从而对新增的文本类别正确的分类

问题描述 朴素贝叶斯如何自我学习从而对新增的文本类别正确的分类 朴素贝叶斯分类是一种有监督的机器学习方法,准确性严重依赖于样本丰富程度,如何使得贝叶斯分类有自我学习的能力,从而能适应新的文本

统计学习方法笔记 -- 朴素贝叶斯

贝叶斯定理(Bayes theorem) 这是关于"逆概"或"后验概率"的定理,之所以需要这个定理是因为后验概率是以"果"来推导"因",所以往往难以直接统计出.  但是后验概率却非常重要,因为在现实生活中,往往都只能观测到一些表面的"果",需要去推断"因".  而bayes定理就给出一种计算后验概率的方法. 以例子来说明,一个班级中n个学生,有男生也有女生  两个features,短发;

用朴素贝叶斯模型预测柯南中被害人和凶手!

这个研究是我在一门课上的期末作业,旨在用一些广泛流传的<柯南>"规律"(比如毛利小五郎指出的凶手大多是好人)预测凶手和被害人,并定量地探索作者--青山刚昌--在创作角色时的一些"隐藏信念"(hidden belief).分析漫画的研究我并没有见过,不过还是有不少研究使用数学建模方法识别文学作品的作者 (Madigan, Genkin, Lewis, Argamon, Fradkin, & Ye, 2005; Zhao & Zobel, 2

【干货】用朴素贝叶斯进行文本分类

1.引言 贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 2. 贝叶斯公式 贝叶斯公式就一行: 而它其实是由以下的联合概率公式推导出来: P(Y,X)=P(Y|X)P(X)=P(X|Y)P(Y) 其中P(Y)叫做先验概率,P(Y|X)叫做后验概率,P(Y,X)叫做联合概率. 额,恩,没了,贝叶斯最核心的公式就这么些. 3. 用机器学习的视角理解贝叶斯

基于朴素贝叶斯的定位算法

1 定位背景介绍       一说到定位大家都会想到gps,然而gps定位有首次定位缓慢(具体可以参考之前的博文<LBS定位技术>).室内不能使用.耗电等缺陷,这些缺陷大大限制了gps的使用.在大多数移动互联网应用例如google地图.百度地图等,往往基于wifi.基站来进行定位.        一般APP在请求定位的时候会上报探测到的wifi信号.基站信号.以wifi为例,手机会探测到周围各个wifi(mac地址)对应的信号强度(RSSI),即收集到信号向量(<WF1, RSSI1&g

机器学习基础(三)朴素贝叶斯

贝叶斯决策一直很有争议,今年是贝叶斯250周年,历经沉浮,今天它的应用又开始逐渐活跃,有兴趣的可 以看看斯坦福Brad Efron大师对其的反思,两篇文章:"Bayes'Theorem in the 21st Century"和 "A250-YEAR ARGUMENT:BELIEF, BEHAVIOR, AND THE BOOTSTRAP".俺就不参合这事了,下面来看看朴素贝叶 斯分类器. 有时我们想知道给定一个样本时,它属于每个类别的概率是多少,即P(Ci|X),

抽象的艺术 - 朴素贝叶斯

Situation 2016年,A市对30000+市民进行了年收入统计,收入>=50K的人数7000+,<=50K的人数20000+. 为了提高税收,需要分析两种收入群体的特征,分析员抽取了"职业.年龄.性别.出生地.教育程度"等属性,更进一步分析哪些职业收入高,哪个年龄段收入高等等,为来年税收做预测. 问题来了:2017年2月,A市人口增加了20000+,对这个群体年收入做预测. 朴素贝叶斯 分类算法有很多种,今天讲朴素贝叶斯的原理和Java实现. 朴素贝叶斯分类的正式定

《大数据架构和算法实现之路:电商系统的技术实战》——1.3 算法:朴素贝叶斯和K最近邻

1.3 算法:朴素贝叶斯和K最近邻 1.3.1 朴素贝叶斯 朴素贝叶斯(Naive Bayes)分类是一种实用性很高的分类方法,在理解它之前,我们先来复习一下贝叶斯理论.贝叶斯决策理论是主观贝叶斯派归纳理论的重要组成部分.贝叶斯决策就是在信息不完整的情况下,对部分未知的状态用主观概率进行估计,然后用贝叶斯公式对发生概率进行修正,最后再利用期望值和修正概率做出最优决策.其基本思想具体如下. 1)已知类条件概率密度参数表达式和先验概率. 2)利用贝叶斯公式转换成后验概率. 3)根据后验概率大小进行决

朴素贝叶斯从放弃到入门

理论基础 联合概率 联合概率表示两个事件共同发生的概率.A与B的联合概率表示为$P(AB)$,$P(A,B)$或者$P(A \bigcap B)$. 联合概率可以推广到任意又穷多个事件出现的情况,设($A_1,A_2,\cdots,A_n$)为任意n个事件($n\ge2$),事件$A_1,A_2,\cdots,A_n$共同发生的概率记为$P(A_1A_2 \dots A_n)$,$P(A_1,A_2,\dots,A_n)$或者$P(A_1 \bigcap A_2 \bigcap \dots \b