机器学习——朴素贝叶斯

首先我们定义一个简单的问题。在多维空间中有两个类别是数据,我们要如何区分这两类数据。在机器学习的方法中,可以使用逻辑斯蒂回归通过sigmoid函数直接预测其属于某一类的概率;也可以用感知机或支持向量机来求出一个超平面把两类点划分开来。而本次要讨论的就是第三种方法——用概率做分类的基本方法——朴素贝叶斯。

前置知识

先验概率

$$P(X)$$

在没有任何其他信息时,$X$ 发生的概率。

条件概率

$$P(X_1|X_2)$$

已知 $X_2$ 发生后,$X_1$ 发生的概率。

联合概率

$$\boldsymbol{X} = (X_1, X_2), \quad P(\boldsymbol{X}) = P(X_1, X_2)$$

前三者的关系

$$P(X_1, X_2) = P(X_2|X_1) \cdot P(X_1)$$

独立性

若 $X_1$ 与 $X_2$ 独立,则:

$$P(X_2|X_1) = P(X_2), \quad P(X_1|X_2) = P(X_1)$$

$$P(X_1, X_2) = P(X_1) \cdot P(X_2)$$

贝叶斯公式

$$P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)}$$

其中:

  • $P(X|Y)$:类条件概率(似然, likelihood)
  • $P(Y)$:先验概率(prior)
  • $P(X)$:证据(evidence),归一化因子,与类别无关

问题的转化

现在有某个数据集,数据集中的样本对应了N类的标签。现在我们拿出了一个样本,那么把它归类为j类的风险可以用下面的公式定义

$$R(c_j|x) = \sum_{i=1}^{N} \lambda_{ij} , P(c_i|x)$$

在这里$P(c_i|x)$是它被认为是i类的后验概率,那么在每类重要性相同的情况下可以自然的得到:

$$\lambda_{ij} = \begin{cases} 0, & \text{if } i = j \ 1, & \text{otherwise} \end{cases}$$

而我们最终的目标就是取到使$R(c_j|x)$最小对应的那个j(注意这里所有的概率我们都假设它客观天然存在)使得最终的风险最小,可以形式化的写为:

$$h^*(x) = \min_{c \in \mathcal{Y}} R(c|x)$$

取最小的那个c对应的类别就是我们最后的预测结果

  • $h^*$ 称为贝叶斯最优分类器
  • $R(h^)$ 称为贝叶斯风险,$1 - R(h^)$ 反映了分类器所能达到的最好性能,即学习性能的理论上限

此外由于$\sum_{i=1}^{N} , P(c_i|x)=1$所以$R(c_j|x)$可以被化简为

$$R(c|x) = 1 - P(c|x)$$

那么我们得到我们最终取到的类别就是对应的$P(c|x)$最高的类别。其实$P(c|x)$这个式子本身就表示在x的条件下取到每个类别的概率,所以理所当然我们要选最大的啦(所以这一小节的所有东西在我看来没有任何意义)。最重要我们要知道的就是$P(c|x)$这个概率的名字叫后验概率,这个概率在之后会频繁用到。

后验概率的求解

上一节我们已经把分类问题转化为了求每一个类别对应的后验概率,取最大的对应的类别,那么我们要怎么求这个后验概率呢?我们有一下三种方法:

  • 不求后验概率,直接求决策函数h(上面提到的),这对应我们一开始提到的感知机和支持向量机
  • 硬求后验概率,这对应回归问题,二分类(logistics)多分类(softmax regression)
  • 还记得刚才提到的贝叶斯公式吗,我们直接套用那个公式,在这个情境下$P(x|c)$(分子上的那个)的名字被称作类条件概率。这类方法的代表有朴素贝叶斯和高斯混合。

上面的前两者统称判别式模型,因为它们直接一步到位去判别属于哪个类别了。而我们今天的主题(第三个)叫做生成式模型,为什么这么叫?从$P(x|c)$就能看出来了嘛,这个方法关注的是每个类别是如果生成训练集中的各种各样的样本的(生成每种样本的概率)。

类条件概率的求解

重复一遍当前情况下的贝叶斯公式

$$P(c|x) = \frac{P(x|c) \cdot P(c)}{P(x)}$$

我们要使$P(c|x)$最大,其对应一个学术的名字叫做最大后验(MAP)分类规则。

因为比较的是不同的类别c,$P(x)$是公共的比较时不用算,$P(c)$是先验概率只需要在总样本里面统计一下这个类别有多少个,除一下总样本数量就求出来了,对应的公式

$$P(c) = \frac{|D_c|}{|D|}$$

其中D为总样本,$D_c$为D中属于c类别的样本。

终于终于,接下来我们步入正题。如何求类条件概率。

最大似然估计(MLE)

既然要求的是个概率,我们可以先假设某个类c的一个特征服从某个分布(由于不知道分布具体是什么,我们先暂时用参数来描述一个未知的分布),再用训练数据去估计这个参数。

估计参数有两个学派,一个是频率学派认为参数是固定值,用 MLE 求解;贝叶斯学派认为参数本身有分布,用 MAP 或完全贝叶斯方法。我们主要走频率学派的 MLE 路线。

我们假设第 $c$ 类的样本集合为 $D_c$,样本独立同分布,那么所有样本同时出现的概率(似然函数)就是各样本概率的连乘:

$$P(D_c|\boldsymbol{\theta}c) = \prod \in D_c} P(\boldsymbol{x}|\boldsymbol{\theta}_c)$$

这里的${\theta}_c$和c的含义一模一样,但是为了强调c这个类别对应了一组样本各特征分布的参数故这样表示。

为了求出对应的我们假设的参数,故我们要使$P(D_c|\boldsymbol{\theta}_c)$最大,求导即可求得,故我们将公式取个log方便求导,可得到下面的式子:

$$\max ; P(D_c|\boldsymbol{\theta}c) = \log \prod \in D_c} P(\boldsymbol{x}|\boldsymbol{\theta}c) = \sum \in D_c} \log P(\boldsymbol{x}|\boldsymbol{\theta}_c)$$

原理说完了,相信大部分初学者一脸懵逼,很难理解究竟是什么意思,故下面我们来实际用这个公式求出我们一开始假设出的参数。

例子

因为在实际问题中有离散和连续的特征,故我们分布求一下。

离散特征

假设我们在判断西瓜好坏,其中有一个离散特征"颜色",可能取值为:青绿、乌黑、浅白(共 $S=3$ 种)。

训练集中好瓜共 $|D_c| = 8$ 个,其中青绿 3 个,乌黑 4 个,浅白 1 个。

当前在好瓜中颜色只有三种,而每一种的概率都不会改变,那么设置参数是只用设置每类的概率就足够了:

$$\theta_1 = P(\text{青绿}|\text{好瓜}),\quad \theta_2 = P(\text{乌黑}|\text{好瓜}),\quad \theta_3 = P(\text{浅白}|\text{好瓜})$$

由于概率之和为1,还有一个约束条件:$\theta_1 + \theta_2 + \theta_3 = 1$

第一步:写出似然函数

我们不需要逐个样本写,只需要关注每种取值出现了几次。记 $n_1=3, n_2=4, n_3=1$,那么:

$$L(\theta_1, \theta_2, \theta_3) = \theta_1^{n_1} \cdot \theta_2^{n_2} \cdot \theta_3^{n_3} = \theta_1^3 \cdot \theta_2^4 \cdot \theta_3^1$$

为什么?因为 3 个青绿样本每个贡献一个 $\theta_1$,乘起来就是 $\theta_1^3$,其他同理。

第二步:取对数

$$\ell = \log L = 3\log\theta_1 + 4\log\theta_2 + 1\log\theta_3$$

第三步:带约束求最大值(拉格朗日乘子法)

因为有约束 $\theta_1+\theta_2+\theta_3=1$,构造拉格朗日函数:

$$\mathcal{L} = 3\log\theta_1 + 4\log\theta_2 + 1\log\theta_3 + \lambda(1 - \theta_1 - \theta_2 - \theta_3)$$

分别对每个 $\theta_s$ 求偏导并令其为 0:

$$\frac{\partial \mathcal{L}}{\partial \theta_1} = \frac{3}{\theta_1} - \lambda = 0 \quad \Rightarrow \quad \theta_1 = \frac{3}{\lambda}$$

$$\frac{\partial \mathcal{L}}{\partial \theta_2} = \frac{4}{\theta_2} - \lambda = 0 \quad \Rightarrow \quad \theta_2 = \frac{4}{\lambda}$$

$$\frac{\partial \mathcal{L}}{\partial \theta_3} = \frac{1}{\theta_3} - \lambda = 0 \quad \Rightarrow \quad \theta_3 = \frac{1}{\lambda}$$

第四步:用约束条件求出 $\lambda$

$$\theta_1 + \theta_2 + \theta_3 = 1 \quad \Rightarrow \quad \frac{3}{\lambda} + \frac{4}{\lambda} + \frac{1}{\lambda} = 1 \quad \Rightarrow \quad \frac{8}{\lambda} = 1 \quad \Rightarrow \quad \lambda = 8 = |D_c|$$

第五步:代回去得到结果

$$\theta_1 = \frac{3}{8}, \quad \theta_2 = \frac{4}{8}, \quad \theta_3 = \frac{1}{8}$$

得到公式:

$$P(x_i|c) = \frac{|D_{c,x_i}|}{|D_c|}$$

也就是说,对于离散特征,MLE 求出来的结果就是频率。"数频率"不是拍脑袋的做法,而是在"假设特征服从多项分布"的前提下,MLE 严格推导出来的最优解。

连续特征

假设好瓜有 3 个样本,甜度分别是 4, 6, 8。我们假设甜度服从高斯分布,用 MLE 求参数 $\mu$(均值)和 $\sigma^2$(方差)。

每个样本的概率密度为:

$$P(x_i|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi},\sigma} \exp\left(-\frac{(x_i - \mu)2}{2\sigma2}\right)$$

第一步:写出对数似然

$$\ell = \log L = \sum_{i=1}^{3} \left[ -\frac{1}{2}\log(2\pi) - \log\sigma - \frac{(x_i - \mu)2}{2\sigma2} \right]$$

前面的 $-\frac{1}{2}\log(2\pi)$ 是常数不影响求导,提取关键部分:

$$\ell = -3\log\sigma - \frac{(4-\mu)^2 + (6-\mu)^2 + (8-\mu)2}{2\sigma2} + \text{常数}$$

第二步:对 $\mu$ 求导

$\sigma$ 在对 $\mu$ 求导时当常数看,只需要对分子求导:

$$\frac{\partial \ell}{\partial \mu} = \frac{(4-\mu) + (6-\mu) + (8-\mu)}{\sigma^2}$$

令其等于零:

$$(4-\mu) + (6-\mu) + (8-\mu) = 0$$

$$18 - 3\mu = 0$$

$$\boxed{\mu = 6 = \frac{4+6+8}{3}}$$

就是样本均值!

第三步:对 $\sigma^2$ 求导

令 $\tau = \sigma^2$,则 $\log\sigma = \frac{1}{2}\log\tau$,把 $\mu = 6$ 代入:

$$\ell = -\frac{3}{2}\log\tau - \frac{(4-6)^2 + (6-6)^2 + (8-6)^2}{2\tau} + \text{常数}$$

分子算一下:$4 + 0 + 4 = 8$,所以:

$$\ell = -\frac{3}{2}\log\tau - \frac{8}{2\tau}$$

求导:

$$\frac{\partial \ell}{\partial \tau} = -\frac{3}{2\tau} + \frac{8}{2\tau^2}$$

令其等于零,两边乘以 $2\tau^2$:

$$-3\tau + 8 = 0$$

$$\boxed{\sigma^2 = \frac{8}{3} = \frac{(4-6)^2 + (6-6)^2 + (8-6)^2}{3}}$$

就是样本方差!

所以不需要"规定"均值就是样本均值、方差就是样本方差。只要假设数据服从高斯分布,MLE 的求导过程会自动推出这个结论。

朴素贝叶斯

上面的例子中我们关注的都是好瓜中的一个特征,可是正常的数据中一个样本通常有很多类别,这时我们该怎么算呢,可以停下来想一下。答案是对两个离散值如颜色和纹理,将它们每一类的组合设一个参数去求。对于两个连续特征就用两维的高斯分布。

形式化的说,如果样本有 $d$ 个特征,直接估计 $P(x_1, x_2, \ldots, x_d|c)$ 这个联合概率,需要的样本量随 $d$ 指数增长(组合爆炸),有限的训练数据根本不够用。

对于样本特别多每种组合都出现过的数据也行还能勉强算算,但是计算过程非常繁琐。对于样本较少的数据就完全没有办法操作了。

为了解决这个问题,我们引入朴素贝叶斯。朴素就是假设所有特征在给定类别下条件独立。注意之前我们还假设过各样本独立同分布,这个假设是在其基础上的进一步假设。

有了这个假设,联合概率就可以拆成各特征概率的乘积:

$$P(\boldsymbol{x}|c) = \prod_{i=1}^{d} P(x_i|c)$$

假设样本有d维的特征,原本需要估计一个 $d$ 维联合分布(参数量指数级),现在只需要分别估计 $d$ 个一维分布(参数量线性级),用前面讲的 MLE 方法逐个估计即可。

把这个代入贝叶斯公式,因为 $P(\boldsymbol{x})$ 对所有类别相同(比较时可以忽略),最终的判定准则就是:

$$h_{nb}(\boldsymbol{x}) = \arg\max_{c \in \mathcal{Y}} ; P(c) \prod_{i=1}^{d} P(x_i|c)$$

接下来我们来走一个实际例子来帮助你理解上述内容全过程:

PlayTennis 例子

下面用一个经典例子走一遍完整流程。为了简洁,我们只取其中两个特征(Outlook 和 Wind)来演示。

原始数据(14天):

Day Outlook Wind PlayTennis
D1 Sunny Weak No
D2 Sunny Strong No
D3 Overcast Weak Yes
D4 Rain Weak Yes
D5 Rain Weak Yes
D6 Rain Strong No
D7 Overcast Strong Yes
D8 Sunny Weak No
D9 Sunny Weak Yes
D10 Rain Weak Yes
D11 Sunny Strong Yes
D12 Overcast Strong Yes
D13 Overcast Weak Yes
D14 Rain Strong No

先数一下:Yes 有 9 天,No 有 5 天。

训练阶段:填表

第一步:算先验概率

$$P(\text{Yes}) = \frac{9}{14}, \quad P(\text{No}) = \frac{5}{14}$$

第二步:算条件概率

对于 Outlook,我们分别数 Yes 和 No 中各取值出现了几次:

  • Yes(共 9 天)中:Sunny 出现 2 次(D9, D11),Overcast 出现 4 次(D3, D7, D12, D13),Rain 出现 3 次(D4, D5, D10)
  • No(共 5 天)中:Sunny 出现 3 次(D1, D2, D8),Overcast 出现 0 次,Rain 出现 2 次(D6, D14)

得到 Outlook 的条件概率表:

Outlook $P(\cdot \mid \text{Yes})$ $P(\cdot \mid \text{No})$
Sunny $2/9$ $3/5$
Overcast $4/9$ $0/5$
Rain $3/9$ $2/5$

同理对于 Wind:

  • Yes(共 9 天)中:Weak 出现 6 次(D3, D4, D5, D9, D10, D13),Strong 出现 3 次(D7, D11, D12)
  • No(共 5 天)中:Weak 出现 2 次(D1, D8),Strong 出现 3 次(D2, D6, D14)

得到 Wind 的条件概率表:

Wind $P(\cdot \mid \text{Yes})$ $P(\cdot \mid \text{No})$
Weak $6/9$ $2/5$
Strong $3/9$ $3/5$

训练结束,我们手上现在有三样东西:先验概率 + 两张条件概率表。

预测阶段:查表连乘

来了一个新样本:Outlook = Sunny, Wind = Strong,问:打不打网球?

算 Yes 的得分:

$$P(\text{Yes}) \times P(\text{Sunny}|\text{Yes}) \times P(\text{Strong}|\text{Yes}) = \frac{9}{14} \times \frac{2}{9} \times \frac{3}{9} = \frac{9 \times 2 \times 3}{14 \times 9 \times 9} = \frac{54}{1134} \approx 0.0476$$

算 No 的得分:

$$P(\text{No}) \times P(\text{Sunny}|\text{No}) \times P(\text{Strong}|\text{No}) = \frac{5}{14} \times \frac{3}{5} \times \frac{3}{5} = \frac{5 \times 3 \times 3}{14 \times 5 \times 5} = \frac{45}{350} \approx 0.1286$$

$0.0476 < 0.1286$,No 的得分更大,所以判定为 No——今天不打网球。

如果想要得到真正的后验概率(而不只是比大小),归一化一下即可:

$$P(\text{Yes}|\boldsymbol{x}') = \frac{0.0476}{0.0476 + 0.1286} = 27.0%$$

$$P(\text{No}|\boldsymbol{x}') = \frac{0.1286}{0.0476 + 0.1286} = 73.0%$$

整个过程就是:训练时填表(数频率),预测时查表连乘,选大的

对于连续分布的数据同理。

拉普拉斯修正

上面的流程有一个致命问题:如果某个特征取值在某个类别中从未出现过怎么办?比如 $P(\text{Overcast}|\text{No}) = 0/5 = 0$。

朴素贝叶斯做分类时要把所有特征的概率连乘,只要其中一个为 0,整个乘积就变成 0,其他特征再怎么支持这个类别都没用了。这在大样本中可能证明某个类别不可能有特点特征下的某个取值,但是在小样本数据中就显得太过绝对不近人情了。

解决方法是拉普拉斯修正:给每个计数都加 1,令 $N$ 为类别数,$N_i$ 为第 $i$ 个特征可能的取值数:

$$\hat{P}(c) = \frac{|D_c| + 1}{|D| + N}$$

$$\hat{P}(x_i|c) = \frac{|D_{c,x_i}| + 1}{|D_c| + N_i}$$

规律就是:分子统一加 1,分母加上该变量可能的取值数量。这相当于假设在没有数据之前,每种取值出现的机会均等。当数据量足够大时,多加的这个 1 相对于真实计数可以忽略不计。

总结

以上就是对朴素贝叶斯的简要介绍,包含了改知识的最核心重要的部分,但是还有许多在实际问题中的扩展没有讲到。我5天后的考试也要考这部分比较难的内容,所以下一期的博客就是对朴素贝叶斯的扩展知识。

posted @ 2026-05-12 15:35  秋韵满怡  阅读(22)  评论(0)    收藏  举报