Skip to content

Commit bf389a0

Browse files
committed
Create notes of Laplace smoothing.
1 parent 377bac4 commit bf389a0

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# 4.3 拉普拉斯平滑
2+
3+
## 拉普拉斯平滑
4+
5+
在朴素贝叶斯算法中,我们以邮件分类器为例介绍了文本分类问题。当时我们将整个字典储存起来作为词汇表。但实际上这种做法效率不高。更高效的做法是设定一个常用词汇表,只存储一定量的常用单词。但若遇到词汇表之外的生词,该怎么办呢?
6+
7+
首先,我们分析一下遇到生词会导致什么问题。回顾垃圾邮件分类过程:假设你完成了 CS229 课程并做了出色的研究项目,决定在 20xx 年 6 月将作品投稿到 NeurIPS 会议(机器学习领域的顶级会议,投稿截止日期通常在六月底至七月初)。你通过邮件讨论了该会议,随后开始收到包含 "neurips" 单词的邮件。然而,这是你的第一篇 NeurIPS 投稿,此前从未收到过包含 "neurips" 的邮件;更重要的是,"neurips" 这个词从未出现在你的垃圾邮件/正常邮件训练集中。假设 "neurips" 是词汇表中的第 35000 个词,那么朴素贝叶斯分类器对该参数 $\phi_{35000|y}$ 的最大似然估计结果如下:
8+
9+
$$
10+
\begin{aligned}
11+
\phi_{35000|y=1} &= \frac{\sum^m_{i=1}1\{x^{(i)}_{35000}=1 \wedge y^{(i)}=1 \}}{\sum^m_{i=1}1\{y^{(i)}=1\}} = 0 \\ % 修正分母应为 y^{(i)}=1
12+
\phi_{35000|y=0} &= \frac{\sum^m_{i=1}1\{x^{(i)}_{35000}=1 \wedge y^{(i)}=0 \}}{\sum^m_{i=1}1\{y^{(i)}=0\}} = 0 \\
13+
\end{aligned}
14+
$$
15+
16+
由于分类器从未在垃圾邮件或正常邮件的训练样本中见过 "neurips" 这个词,它认为该词出现在两类邮件中的概率均为 $0$。因此,当需要判断一封包含 "neurips" 的邮件是否为垃圾邮件时,算法计算后验概率得到:
17+
18+
$$
19+
\begin{aligned}
20+
p(y=1|x) &= \frac{ \prod^n_{i=1} p(x_i|y=1)p(y=1) } {\prod^n_{i=1} p(x_i|y=1)p(y=1) +\prod^n_{i=1} p(x_i|y=0)p(y=0) }\\
21+
&= \frac{0}{0}\\ % 保持数学公式不变
22+
\end{aligned}
23+
$$
24+
25+
问题在于 $\prod^n_{i=1} p(x_i|y)$ 中包含了 $p(x_{35000}|y) = 0$,导致整个乘积为 $0$。因此算法得到 $\frac{0}{0}$,无法做出预测。
26+
27+
根本原因在于统计学中常将未观测到的事件的概率估计为 $0$,从而导致了 $\frac{0}{0}$ 的情况。为避免此问题,我们引入**拉普拉斯平滑 (Laplace smoothing)**,用一个小概率值替代零概率。具体来说,假设要估计一个在 $\{1,..., k\}$ 范围内取值的多项式随机变量 $z$ 的参数 $\phi_i = p(z = i)$。给定 $m$ 个独立观测样本 $\{z^{(1)}, ..., z^{(m)}\}$,最大似然估计经拉普拉斯平滑后变为:
28+
$$
29+
\phi_j=\frac{\sum^m_{i=1}1\{z^{(i)}=j\} + 1}{m + k}
30+
$$
31+
此处,分子加 $1$,分母加 $k$。需注意 $\sum^k_{j=1} \phi_j = 1$ 仍然成立(这是概率估计的必要性质)。同时,所有 $\phi_j$ 都不为零,从而解决了零概率问题。在某些条件下,拉普拉斯平滑可被证明能给出参数 $\phi_j$ 的良好估计。
32+
33+
回到朴素贝叶斯分类器,应用拉普拉斯平滑后,参数估计公式修正如下:
34+
35+
$$
36+
\begin{aligned}
37+
\phi_{j|y=1} & =\frac{\sum^m_{i=1}1\{x_j^{(i)}=1 \wedge y ^{(i)}=1\} + 1}{\sum^m_{i=1}1\{y^{(i)}=1\} + 2} \\
38+
\phi_{j|y=0} & =\frac{\sum^m_{i=1}1\{x_j^{(i)}=1 \wedge y ^{(i)}=0\} + 1}{\sum^m_{i=1}1\{y^{(i)}=0\} + 2} \\ % 修正 y^{(i)}=10 为 y^{(i)}=0
39+
\end{aligned}
40+
$$
41+
42+
(实践中,通常无需对 $\phi_y$ 进行拉普拉斯平滑,因为垃圾邮件与非垃圾邮件的比例通常是合理可估计的,$\phi_y$ 作为 $p(y=1)$ 的估计值通常不会接近零。)
43+
44+
## 文本分类的事件模型(Event Models for Text Classification)
45+
46+
接下来介绍文本分类的另一种模型。朴素贝叶斯算法已能解决许多分类问题,但还有一种相关算法在文本分类上表现更优。
47+
48+
在之前针对文本分类的朴素贝叶斯方法中,我们使用的是**多元伯努利事件模型(Multi-Variate Bernoulli Event Model)**。在该模型中,假设邮件是否发送由随机过程决定(先验概率 $p(y)$)。然后,发件人(无论是否垃圾邮件发送者)独立地遍历词汇表,依据概率分布 $p(x_i=1|y)=\phi_{i|y}$ 决定是否将每个词 $i$ 包含在邮件中。因此,收到一封垃圾邮件的概率为:$p(y)\prod^n_{i=1}p(x_i|y)$。
49+
50+
另一种模型称为**多项式事件模型(Multinomial Event Model)**。为描述此模型,需使用不同的特征表示方法:令 $x_i$ 表示邮件中的第 $i$ 个单词。因此,$x_i$ 是一个整数,取值范围为 $\{1,...,|V|\}$,其中 $|V|$ 是词汇表的大小。一封包含 $n$ 个单词的邮件可表示为一个长度为 $n$ 的向量 $(x_1, x_2, ..., x_n)$;注意,不同邮件的 $n$ 值可以不同。例如,邮件开头是 "A NIPS ...",则 $x_1 = 1$ ("a" 是词汇表第一个词),$x_2 = 35000$ (假设 "nips" 是词汇表第 35000 个词)。
51+
52+
在多项式事件模型中,假设邮件生成过程如下:首先确定是否为垃圾邮件(依据 $p(y)$,与前模型相同)。接着,发件人依据多项式分布 $p(x_1|y)$ 生成第一个词 $x_1$。然后,独立于 $x_1$ 地依据*相同*的多项式分布生成 $x_2$,再生成 $x_3$、$x_4$,依此类推,直至生成邮件所有词。因此,邮件的整体概率为 $p(y)\prod^n_{i=1}p(x_i|y)$。虽然此公式形式与多元伯努利模型相似,但含义截然不同:此处的 $x_i|y$ 服从多项式分布,而非伯努利分布。
53+
54+
新模型的参数仍然是 $\phi_y = p(y)$(与前相同),以及 $\phi_{k|y=1} = p(x_j = k | y=1)$ 和 $\phi_{k|y=0} = p(x_j = k | y=0)$(对任意位置 $j$)。注意,我们假设 $p(x_j|y)$ 的值与位置 $j$ 无关,即单词的生成分布不依赖于其在邮件中的位置(词袋模型假设的一种体现)。
55+
56+
给定训练集 $\{(x^{(i)}, y^{(i)}); i = 1, ..., m\}$,其中 $x^{(i)} = ( x^{(i)}_{1} , x^{(i)}_{2} ,..., x^{(i)}_{n_i})$($n_i$ 是第 $i$ 个样本的单词数),数据的似然函数为:
57+
58+
$$
59+
\begin{aligned}
60+
\mathcal{L}(\phi_y,\phi_{k|y=0},\phi_{k|y=1})& = \prod^m_{i=1} p(x^{(i)}, y^{(i)})\\
61+
& = \prod^m_{i=1} \left( \prod^{n_i}_{j=1} p(x_j^{(i)} | y^{(i)}; \phi_{k|y=0}, \phi_{k|y=1}) \right) p(y^{(i)}; \phi_y)\\ % 优化符号表示和括号
62+
\end{aligned}
63+
$$
64+
65+
最大化该似然函数得到参数的最大似然估计:
66+
67+
$$
68+
\begin{aligned}
69+
\phi_{k|y=1} &= \frac{\sum^m_{i=1} \sum^{n_i}_{j=1} 1\{x_j^{(i)} = k \wedge y^{(i)} = 1\}}{\sum^m_{i=1} 1\{y^{(i)} = 1\} n_i} \\
70+
\phi_{k|y=0} &= \frac{\sum^m_{i=1} \sum^{n_i}_{j=1} 1\{x_j^{(i)} = k \wedge y^{(i)} = 0\}}{\sum^m_{i=1} 1\{y^{(i)} = 0\} n_i} \\
71+
\phi_y &= \frac{\sum^m_{i=1} 1\{y^{(i)} = 1\}}{m}\\
72+
\end{aligned}
73+
$$
74+
75+
若应用拉普拉斯平滑(实践中用于提升性能)估计 $\phi_{k|y=0}$ 和 $\phi_{k|y=1}$,在分子加 $1$,分母加 $|V|$,得到:
76+
77+
$$
78+
\begin{aligned}
79+
\phi_{k|y=1} &= \frac{\sum^m_{i=1} \sum^{n_i}_{j=1} 1\{x_j^{(i)} = k \wedge y^{(i)} = 1\} + 1}{\sum^m_{i=1} 1\{y^{(i)} = 1\} n_i + |V|} \\
80+
\phi_{k|y=0} &= \frac{\sum^m_{i=1} \sum^{n_i}_{j=1} 1\{x_j^{(i)} = k \wedge y^{(i)} = 0\} + 1}{\sum^m_{i=1} 1\{y^{(i)} = 0\} n_i + |V|} \\
81+
\end{aligned}
82+
$$
83+
84+
当然,这未必是最优的分类算法,但朴素贝叶斯分类器在实践中往往表现优异。因此,它因其简单、易于实现而成为一个很好的**首选方案**
85+

0 commit comments

Comments
 (0)