朴素贝叶斯分析

朴素贝叶斯讲解和源码分析

目录

朴素贝叶斯讲解和源码分析

朴素贝叶斯分类分析讲解

一、贝叶斯分类器

二、例题分析(这里我就说一下群里博客上的例子)

三、半朴素贝叶斯分类器

参考资料


朴素贝叶斯分类分析讲解

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法(knn也挺简单)。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法,希望有利于他人理解。


一、贝叶斯分类器

贝叶斯决策论是概率框架实施决策的基本方法对于分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记

1、数学知识(贝叶斯定理)

1.1 贝叶斯公式

$$
P(类别|条件) = \frac{P(X|Y)P(Y)}{P(X)}
$$

先验概率(prior probability):这个概率是通过统计得到的,或者依据自身依据经验给出的一个概率值,这里P(Y)就是先验概率;

后验概率:根据观察到的样本修正之后的概率值,这里P(Y|X)就是后验概率

1.2 例子

假设玩英雄联盟这个事件是X,性别这个事件为Y,然后假设中国的男女比例为1:1,也就是:

$$
P(Y = 男性) = 0.5,P(Y = 女性) = 0.5
$$

继续假设:男性玩lol的概率为0.8,女性玩lol的概率为0.2,即:

$$
P(X = 玩lol | Y = 男性) = 0.8;P(X=玩lol | Y = 女性) = 0.2
$$

那么问题来啦:在已知一个中国人是玩lol的情况下,是男性的概率?

从机器学习的角度来看,我们可以把玩不玩lol看成样本输入的属性,是男生还是女生看成输出的分类结果

根据贝叶斯定律可得:

$$
P(Y = 男性|X = 玩lol) =\\ \\ \\ \frac{P(X = 玩lol|Y = 男性) * P(Y = 男性)}{P(X = 玩lol|Y = 男性) * P(Y = 男性)+P(X = 玩lol|Y = 女性) * P(Y = 女性)} \\ \\ \\ = 0.8*0.5/[0.8*0.5+0.2*0.5] = 0.8
$$

因为男女比例刚好是1:1,所以算出来还是0.8,假如男女比是0.6:0.4,那结果就是:

$$
\frac{0.8*0.6}{[0.8*0.6 + 0.2*0.4)} = \frac{0.48}{0.48+0.08} = 0.857
$$

由此来看,如果这是一个机器学习问题,我们会毫不犹豫的将这个人的性别预测为男生

后验概率P(Y = 男性|X = 玩lol) 是根据先验概率P(Y = 男性)做了一个系数修正之后的,所以叫后验概率

2、分类问题

2.1 简介

对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱、”之类的话,其实这就是一种分类操作。

既然是贝叶斯分类算法,那么分类的数学描述又是什么呢?

2.2 数学描述

从数学角度来说,分类问题可做如下定义:已知集合C=y_1,y_2,....y_n和I=x_1,x_2,x_3......x_n,确定映射规则y = f(),使得任意xiϵI有且仅有一个y_i ϵ C,使得y_i ϵ f(x_i)成立

其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。

分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别,也是我们下面要讲的,每一个不同的分类算法,对应着不同的核心思想。

2.3 例子

这里来对比一下不用独立性假设和使用独立性假设的计算量对照(列一张表来康康吧):

取值和属性根蒂色泽拍击的声音
1伸展光亮清脆
2蜷缩粗糙低沉

$$
P(瓜 = 好瓜|根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉) = \frac{P(瓜 = 好瓜)P(根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉|瓜 = 好瓜)}{P(根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉)}
$$

$$
P(根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉|瓜 = 好瓜)
$$

比如说我们挑出来10个好瓜,里边的 { 根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉 } 的有三个

$$
P(根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉|瓜 = 好瓜) = \frac{3}{10}
$$

$$
P(根蒂 = 伸展, 色泽 = 光亮, 声音 = 低沉)
$$

这个式子我没有具体去计算,但是这个我看其他的文章说计算量是指数级别的

100 100

$$
100^{100}
$$

3、朴素贝叶斯分类

3.1 初见公式的理解

是下面这个贝叶斯公式:

$$
P(B|A) = \frac{P(A, B)}{P(A)}
$$

然后由联合概率公式,对于以上这个式子,我们可以将它化为:

$$
P(B|A) = \frac{P(A, B)}{P(A)}
$$

看着不太懂?换个表达形式就会清楚很多,如下:

$$
P(类别|特征) = \frac{P(特征|类别)P(类别)}{P(特征)}
$$

其实我们朴素贝叶斯的基本思想就是:我输入了一个样本x,样本x的特征值为A,然后我需要通过之前已有的数据集推出来这个x属于类别B的概率是多少,然后再用概率最大的那个类别作为输出结果。

我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

那么如何求解左边这个式子呢?我们可以来康康右边这个分式怎么求:

  • P(A)或者说是P(特征),这个分母其实就是一个归一化的数值,也就是说,这个特征值原来的样本数量在整体中的占比,具体式子如下:

    $$
    P(特征A) = \frac{num(特征A)}{num(所有特征)}
    $$

  • P(B)或者说是P(类别),这个是先验概率,就比如说在这种西瓜中如果我们已知了好瓜和坏瓜的数量,好瓜的先验概率就为

    $$
    P(好瓜) = \frac{num(好瓜)}{num(所有瓜)}
    $$

     

    如果再来一个同一个品种的瓜,那么根据好瓜的先验概率,那么这个瓜是好瓜的概率就为P(好瓜)。

  • P(A|B)或者说是P(特征|类别),这个恐怕就是最难求的了(悲):

    前面两个咱们都好说,这个咋求捏?

    咱们先看式子,从这个式子上就可以看出,P(A|B)就是像有点事后诸葛亮的感觉,P(特征|类别)就是我已经知道他是好瓜了,但是我想知道导致他是好瓜的特征是X的概率,这个也就是我们实际机器学习算法需要训练求得的值:

    如果我们的西瓜都使用k个特征来表示,并且每一个特征都在n个值中取得:c_1(1,2,3...,n),c_2(1,2,3...n),...,c_K(1,2,3...n),举个例子,西瓜的光泽可以有:明,中,暗;这里西瓜的光泽这个特征的n就等于3,因为这个特征可以用明,中,暗三个具体的值来表示。

    类标记集合为:

    $$
    \gamma = \{c_1, c_2, ...,c_K\}
    $$

     

    先验概率分布为:

    $$
    P(Y = c_k), k = 1,2,...,K
    $$

     

    X为定义在输入空间里的特征向量,Y为定义在输出空间的特征向量,x为一个输入的量,是需要预测的,条件概率分布为:

    $$
    P(X = x|Y = c_k) = P(X^{(1)} = x^{(1)}, ..., X^{(n)} = x^{(n)} | Y = c_k),k = 1,2,...,K
    $$

     

    条件概率分布P(X = x | Y = c_k)有指数级数量的参数,其估计实际是不可行的。事实上假设第j个特征所有可能取值有S_j个,j = 1,2,...,n,Y可能取值有K个,那么参数的个数为:

    $$
    K\prod_{j = 1}^{n}{S_j}
    $$

     

    也就是说,如果我们有100个特征,每一个特征值有10个,那么这个最后需要计算的特征量为:

    $$
    100^{10} = 10^{20}
    $$

     

    这很明显就展现出来了一个问题:这个计算量是一个指数级别的,如果我们的特征和特征值的取值足够多的话,那么我们最后得到的特征量将可能会远远的大于我们的数据量,所以这种原生的方法可行性不太高。

    所以,我们不得不采用朴素贝叶斯来优化咱们的算法。

3.2 朴素贝叶斯——算法的优化

由于上边咱们的算法可行性不高,所以,搞概率的大佬们又想出来了一个法子,这就是朴素贝叶斯算法力(喜)

朴素贝叶斯的做法也是很朴素的,就是认为n个特征都是相互独立的(走极端了属于是),具体地,条件独立性假设是:3

$$
P(X = x | Y = c_k) = P(X^{(1)} = x^{(1)},…,X^{(n)} = x^{(n)} | Y = c_k)
$$

$$
=\prod_{j = 1}^{n} {P(X^{(j)} = x^{(j)}|Y = c_k)}
$$

条件独立假设:等于说是用于分类的特征在类确定的条件下都是独立的。这一假设使得朴素贝叶斯法变得简单,但是缺点是会损失一定量的性能和准确度。

所以说,我们上边的式子就可以化成:

$$
P(Y = c_k |X = x) = \frac{P(X = x | Y = c_k)P(Y = c_k)}{\sum_{k}{P(X = x | y = c_k)P(Y = c_k)}}
$$

带入上边根据独立性假设算得的后验概率:

$$
P(Y = c_k|X = x) = \frac{P(Y = c_k)\prod_{j = 1}^{n} {P(X^{(j)} = x^{(j)}|Y = c_k)}}{\sum_{k}{P(X = x | y = c_k)\prod_j{P(X^{(j)} = x^{(j)}|Y = c_k)}}}
$$

所以说,最后我们得到的朴素贝叶斯分类器的分类函数为:

$$
y = f(x) = \arg{\max_{c_k}{\frac{P(Y = c_k)\prod_{j = 1}^{n} {P(X^{(j)} = x^{(j)}|Y = c_k)}}{\sum_{k}{P(X = x | y = c_k)\prod_j{P(X^{(j)} = x^{(j)}|Y = c_k)}}}}}
$$

而对于所有的类别c_k都是相同的,所以:

$$
y = f(x) = \arg{\max_{c_k}{P(Y = c_k)\prod_{j = 1}^{n} {P(X^{(j)} = x^{(j)}|Y = c_k)}}}
$$

下面来介绍一下朴素贝叶斯原理中比较重要的部分:

3.3 后验概率最大化的含义

朴素贝叶斯算法将实例分到后验概率最大的类中,这就等价于期望风险最小化,假设我们选择的是一个01损失函数(这个其实就是和其他很多机器学习算法一样,都具有一个损失函数,朴素贝叶斯的损失函数如下):

$$
L(Y, f(X)) = 1 (Y != f(X))\\ L(Y, f(X)) = 0 (Y = f(X))
$$

式子中的 f ( X ) 是分类决策函数。这时,期望风险函数为:

R() = P(A) * L(A -> A) + P(B) * L(A -> B) + P(C) * L(A -> C)

$$
R_{exp}(f) = E[L(Y, f(X))]
$$

期望是对联合分布 P (X, Y) 取的。由此取条件期望:

$$
R_{exp}(f) = E_X\sum_{k = 1}^K{L(c_k, f(X))P(c_k|X = x)}
$$

为了使这个期望风险最小化,我们只需要对X = x逐个极小化,由此可得:(提醒一下gamma是类别的集合,比如说好瓜和坏瓜,就组成了一个gamma)

$$
f(x) = \arg{\min_{y = \gamma}{\sum_{k = 1}^K{L(c_k, y)P(c_k|X = x)}}} \\ = \arg{\min{\sum_{k = 1}^K{P(y != c_k | X = x)}}} \\ \arg{\min_{y ϵ \gamma}(1 - P(y = c_k|X = x))} \\ \arg{\max_{yϵ\gamma}{P(y = c_k|X = x)}}
$$

这样一来,根据期望风险最小化准则(损失函数最小化)就可以得到了后验概率最大化准则:

$$
f(x) = \arg{\max{P(c_k|X = x)}}
$$

所以说至此,我们可以总结一下刚刚做的工作:

  1. 按照我们的需求,定义了损失函数;

  2. 根据概率公式化简期望损失;

  3. 最后我们就得到了一个结论:朴素贝叶斯原理其实就是将后验概率最小化


二、例题分析(这里我就说一下群里博客上的例子)

1 例子问题

给定数据如下:

现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!

这里我们联系到朴素贝叶斯公式:

我们需要求p(嫁|(不帅、性格不好、身高矮、不上进),这是我们不知道的,但是通过朴素贝叶斯公式可以转化为好求的三个量,p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)(至于为什么能求,后面会讲,那么就太好了,将待求的量转化为其它可求的值,这就相当于解决了我们的问题!)

2 对"朴素"的解释

那么这三个量是如何求得?

是根据已知训练数据统计得来,下面详细给出该例子的求解过程。

回忆一下我们要求的公式如下:

那么我只要求得p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)即可,好的,下面我分别求出这几个概率,最后一比,就得到最终结果。

p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁),那么我就要分别统计后面几个概率,也就得到了左边的概率!

等等,为什么这个成立呢?学过概率论的同学可能有感觉了,这个等式成立的条件需要特征之间相互独立吧!

对的!这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!

但是为什么需要假设特征之间相互独立呢?

1、我们这么想,假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。

24个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。

2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁),

我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。

根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

好的,上面我解释了为什么可以拆成分开连乘形式。那么下面我们就开始求解!

我们将上面公式整理一下如下:

下面我将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。

p(嫁)=?

首先我们整理训练数据中,嫁的样本数如下:

则 p(嫁) = 6/12(总样本数) = 1/2

p(不帅|嫁)=?统计满足样本数如下:

则p(不帅|嫁) = 3/6 = 1/2

p(性格不好|嫁)= ?统计满足样本数如下:

则p(性格不好|嫁)= 1/6

p(矮|嫁) = ?统计满足样本数如下:

则p(矮|嫁) = 1/6

p(不上进|嫁) = ?统计满足样本数如下:

则p(不上进|嫁) = 1/6

下面开始求分母,p(不帅),p(性格不好),p(矮),p(不上进)

统计样本如下:

不帅统计如上红色所示,占4个,那么p(不帅) = 4/12 = 1/3

性格不好统计如上红色所示,占4个,那么p(性格不好) = 4/12 = 1/3

身高矮统计如上红色所示,占7个,那么p(身高矮) = 7/12

不上进统计如上红色所示,占4个,那么p(不上进) = 4/12 = 1/3

到这里,要求p(不帅、性格不好、身高矮、不上进|嫁)的所需项全部求出来了,下面我带入进去即可,

= (1/21/61/61/61/2)/(1/31/37/12*1/3)

下面我们根据同样的方法来求p(不嫁|不帅,性格不好,身高矮,不上进),完全一样的做法,为了方便理解,我这里也走一遍帮助理解。首先公式如下:

下面我也一个一个来进行统计计算,这里与上面公式中,分母是一样的,于是我们分母不需要重新统计计算!

p(不嫁)=?根据统计计算如下(红色为满足条件):

则p(不嫁)=6/12 = 1/2

p(不帅|不嫁) = ?统计满足条件的样本如下(红色为满足条件):

则p(不帅|不嫁) = 1/6

p(性格不好|不嫁) = ?据统计计算如下(红色为满足条件):

则p(性格不好|不嫁) =3/6 = 1/2

p(矮|不嫁) = ?据统计计算如下(红色为满足条件):

则p(矮|不嫁) = 6/6 = 1

p(不上进|不嫁) = ?据统计计算如下(红色为满足条件):

则p(不上进|不嫁) = 3/6 = 1/2

那么根据公式:

p (不嫁|不帅、性格不好、身高矮、不上进) = ((1/61/211/2)1/2)/(1/31/37/12*1/3)

很显然(1/6*1/2*1*1/2) > (1/2*1/6*1/6*1/6*1/2)

于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)

所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!

3 朴素贝叶斯分类的优缺点

优点:

(1) 算法逻辑简单,易于实现

(2)分类过程中时空开销小

缺点:

理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

三、半朴素贝叶斯分类器

1、简介

朴素贝叶斯采用了“属性条件独立性假设”,但这个假设的确是有些草率了。因为往往属性之间包含着各种依赖,导致了结果的不同。于是,人们尝试对这个假设进行一定程度的放松,由此产生了“半朴素贝叶斯分类器”(semi-naïve Bayes classifiers)的学习方法。

2、数学引入

我们适当考虑一部分属性间的相互依赖关系,这种放松后的分类称为半朴素贝叶斯分类,其中最常用的策略:假定每个属性仅依赖于其他最多一个属性,称其依赖的这个属性为其超父属性,这种关系称为:独依赖估计(ODE)**。

朴素贝叶斯公式:

$$
y = f(x) = \arg{\max{P(x_j|c_i)}}
$$

我们引入父属性,所以我们的预测函数就变成了:

$$
y = f(x) = \arg{\max{P(x_j|c_i, pa_j)}}\ = \arg{\max{\prod_{j = 1}^K}P(x_j|c_i, pa_j)}.
$$

其中,pa_j为属性x_i所依赖的属性,称为x_i的父属性。假设父属性pa_j已知,那么可以使用下面的公式估计P(x_j|c_i,pa_j):

$$
P(x_j|c_i, pa_j) = \frac{P(x_j, c_i, pa_j)}{P(c_i, pa_j)}
$$

就比如说我们预测一个瓜是好瓜还是坏瓜对于某一个属性就可以这样写:

$$
{P(色泽 = 明亮|好, 根蒂 = 蜷缩)} \\ \\ {P(色泽 = 明亮|好)}
$$

一式与二式相比,预测出来的就更加准确多了。

列出上面的式子之后,问题的关键变成了如何确定每个属性的父属性。不同的做法产生了不同的独依赖分类器。

  • SPODE(Super-Parent ODE)假设所有的属性都依赖于同一个属性,称为超父。

  • TAN(Tree Augmented naïve Bayes)则在最大带权生成树算法的基础上发展的一种方法。

  • AODE(Averaged ODE)是一种集成学习的方法,尝试将每个属性作为超父来构建SPODE,与随机森林的方法有所相似。

下面具体描述一下TAN,其他的可以自行了解学习。

3、TAN

TAN的实施步骤如下:

  1. 计算任意属性之间的条件互信息

    $$
    I(x_i,x_j|y)=\sum_{xi,x_j;ck∈Y}{P(x_i,x_j|c_k)\log{\frac{P(x_i,x_j|c_k)}{P(x_i|c_k)P(x_j|c_k)}}}
    $$

  2. 以属性为节点构建完全图,节点间的权重设为相应的互信息;

  3. 构建此完全图的最大带权生成树,挑选根变量,将边置为有向;

  4. 加入类别结点y,增加从y到每个属性的有向边。

容易看出,条件互信息I(x_i,x_j|y)I(x_i,x_j|y)刻画了属性x_i和x_j在已知类别情况下的相关性。因此,通过最大生成树算法,TAN实际上仅保留了强相关属性之间的依赖性。

参考资料

参考资料:

先验概率与后验概率(贝叶斯公式) - 知乎 (zhihu.com)

贝叶斯分类器 - 知乎 (zhihu.com)

带你理解朴素贝叶斯分类算法 - 知乎 (zhihu.com)

《机器学习》(俗称西瓜书)----周志华

《统计学习方法》 ----李航

如果真的想入门机器学习的话,这两本书是一定需要看的

B站datawhale讲解和白板推导:

【吃瓜教程】《机器学习公式详解》(南瓜书)与西瓜书公式推导直播合集哔哩哔哩bilibili

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值