来源:原始 Jupyter Notebook。内容已转换为网页阅读格式;下载原文件 。
贝叶斯分类器# 在前面的例子中,我们可以把所有的样本以表格的形式列出来:
每一个样本都由两部分组成:特征和类别。可以看出这里只有一个特征(箱子编号),而且是二分类问题(好或坏)。
所以贝叶斯定理天生具有分类功能,我们不妨推广到多特征多分类的情况,譬如把 A i A_i A i 当作类标记,也就是说样本空间被划分成 A 1 , A 2 , . . . , A n A_1, A_2, ..., A_n A 1 , A 2 , ... , A n ,可以理解为样本空间可以分成 n 类,我们可以把 B B B 当作样本数据的特征向量。类标记集合 Y = { c 1 , c 2 , … , c K } \mathcal{Y} = \{c_1, c_2, \dots, c_K\} Y = { c 1 , c 2 , … , c K } ,输入为特征向量 x x x ,输出为类标记 y y y ,那么贝叶斯公式可以改成下面的形式:
P ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ i = 1 n P ( X = x ∣ Y = c k ) P ( Y = c k )
P(Y=c_k|X=x) = \frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_{i=1}^n P(X=x|Y=c_k)P(Y=c_k)}
P ( Y = c k ∣ X = x ) = ∑ i = 1 n P ( X = x ∣ Y = c k ) P ( Y = c k ) P ( X = x ∣ Y = c k ) P ( Y = c k ) 通过这个公式,可以计算出输入特征 X X X 属于类别 c k c_k c k 的概率,计算所有类别的概率,看看哪个类别的概率最大,就把输入特征归到这个类别,这就是贝叶斯分类器 (Bayes classifier)的基本原理。
朴素贝叶斯分类器# 我们再来看一个例子。假设某个医院早上来了8个门诊病人,如下表:
症状 职业 疾病 打喷嚏 护士 感冒 打喷嚏 农夫 过敏 头痛 建筑工人 脑震荡 头痛 建筑工人 感冒 打喷嚏 建筑工人 过敏 打喷嚏 教师 感冒 头痛 教师 脑震荡 打喷嚏 教师 过敏
现在来了第9个病人,是一个打喷嚏的建筑工人,那么他最可能得的疾病是什么?
很显然,从上表中的样本数据可以知道,这里的特征有两个(症状和职业),可能的疾病有:感冒、过敏、脑震荡,是个三分类问题。要想预测这个建筑工人的疾病,实际上就是求下面的三个条件概率,然后取概率值最大的那种情况:
P ( c o l d ∣ s n e e z e ∩ b u i l d e r ) P(cold|sneeze \cap builder) P ( co l d ∣ s n eeze ∩ b u i l d er ) P ( a l l e r g y ∣ s n e e z e ∩ b u i l d e r ) P(allergy|sneeze \cap builder) P ( a ll er g y ∣ s n eeze ∩ b u i l d er ) P ( c o n c u s s i o n ∣ s n e e z e ∩ b u i l d e r ) P(concussion|sneeze \cap builder) P ( co n c u ss i o n ∣ s n eeze ∩ b u i l d er ) 根据贝叶斯定理,我们有:
P ( c o l d ∣ s n e e z e ∩ b u i l d e r ) = P ( s n e e z e ∩ b u i l d e r ∣ c o l d ) P ( c o l d ) P ( s n e e z e ∩ b u i l d e r )
\begin{align}
P(cold|sneeze \cap builder) = \frac{P(sneeze \cap builder|cold)P(cold)}{P(sneeze \cap builder)}
\end{align}
P ( co l d ∣ s n eeze ∩ b u i l d er ) = P ( s n eeze ∩ b u i l d er ) P ( s n eeze ∩ b u i l d er ∣ co l d ) P ( co l d ) 这里的 P ( s n e e z e ∩ b u i l d e r ∣ c o l d ) P(sneeze \cap builder|cold) P ( s n eeze ∩ b u i l d er ∣ co l d ) 是个联合概率,当特征数非常多时,联合概率非常难求,所以我们在这里做了一个大胆的假设:所有的特征是彼此独立的 。所以:
P ( c o l d ∣ s n e e z e ∩ b u i l d e r ) = P ( s n e e z e ∩ b u i l d e r ∣ c o l d ) P ( c o l d ) P ( s n e e z e ∩ b u i l d e r ) = P ( s n e e z e ∣ c o l d ) P ( b u i l d e r ∣ c o l d ) P ( c o l d ) P ( s n e e z e ) P ( b u i l d e r )
\begin{align}
P(cold|sneeze \cap builder) &= \frac{P(sneeze \cap builder|cold)P(cold)}{P(sneeze \cap builder)} \\
&= \frac{P(sneeze|cold)P(builder|cold)P(cold)}{P(sneeze)P(builder)}
\end{align}
P ( co l d ∣ s n eeze ∩ b u i l d er ) = P ( s n eeze ∩ b u i l d er ) P ( s n eeze ∩ b u i l d er ∣ co l d ) P ( co l d ) = P ( s n eeze ) P ( b u i l d er ) P ( s n eeze ∣ co l d ) P ( b u i l d er ∣ co l d ) P ( co l d ) 根据这个假设得到的分类器,我们称之为朴素贝叶斯分类器 (naive Bayes classifier)。英文 naive 的意思是天真的幼稚的,不过,尽管这个假设非常幼稚,但它在很多分类领域发挥着重要的作用。
根据上面的表格,我们有:
P ( c o l d ) = 3 8 P ( s n e e z e ) = 5 8 P ( b u i l d e r ) = 3 8 P ( s n e e z e ∣ c o l d ) = 2 3 P ( b u i l d e r ∣ c o l d ) = 1 3
\begin{align}
P(cold) &= \frac{3}{8} \\
P(sneeze) &= \frac{5}{8} \\
P(builder) &= \frac{3}{8} \\
P(sneeze|cold) &= \frac{2}{3} \\
P(builder|cold) &= \frac{1}{3}
\end{align}
P ( co l d ) P ( s n eeze ) P ( b u i l d er ) P ( s n eeze ∣ co l d ) P ( b u i l d er ∣ co l d ) = 8 3 = 8 5 = 8 3 = 3 2 = 3 1 所以求得:
P ( c o l d ∣ s n e e z e ∩ b u i l d e r ) = 2 3 × 1 3 × 3 8 5 8 × 3 8 = 16 45
P(cold|sneeze \cap builder) = \frac{\frac{2}{3} \times \frac{1}{3} \times \frac{3}{8}}{\frac{5}{8} \times \frac{3}{8}} = \frac{16}{45}
P ( co l d ∣ s n eeze ∩ b u i l d er ) = 8 5 × 8 3 3 2 × 3 1 × 8 3 = 45 16 同理:
\[
P(allergy|sneeze \cap builder) = \frac{\frac{3}{3} \times \frac{1}{3} \times \frac{3}{8}}{\frac{5}{8} \times \frac{3}{8}} = \frac{24}{45} \\
P(concussion|sneeze \cap builder) = \frac{\frac{0}{2} \times \frac{1}{2} \times \frac{2}{8}}{\frac{5}{8} \times \frac{3}{8}} = 0
\]
可以推断出,这个建筑工人得过敏的可能性最大。
在上面的计算过程中,三个概率的分母都是 P ( s n e e z e ∩ b u i l d e r ) P(sneeze \cap builder) P ( s n eeze ∩ b u i l d er ) ,而我们最后是要比较这三个概率的大小,所以这个值实际上可以不用算,这个值有时候又被为 证据因子 (evidence)。
最后,我们总结一下贝叶斯分类的公式:
y = f ( x ) = arg max c k P ( Y = c k ∣ X = x ) = arg max c k P ( Y = c k ) P ( X = x ∣ Y = c k ) = arg max c k P ( Y = c k ) ∏ i P ( X = x ( i ) ∣ Y = c k )
\begin{align}
y = f(x) &= \mathop{\arg\max}_{c_k} P(Y=c_k|X=x) \\
&= \mathop{\arg\max}_{c_k} P(Y=c_k)P(X=x|Y=c_k) \\
&= \mathop{\arg\max}_{c_k} P(Y=c_k) \prod_i P(X=x^{(i)}|Y=c_k)
\end{align}
y = f ( x ) = arg max c k P ( Y = c k ∣ X = x ) = arg max c k P ( Y = c k ) P ( X = x ∣ Y = c k ) = arg max c k P ( Y = c k ) i ∏ P ( X = x ( i ) ∣ Y = c k ) 朴素贝叶斯法通过训练数据集学习到联合概率分布 P ( X , Y ) P(X,Y) P ( X , Y ) ,具体的,它是先验概率和条件概率的乘积,实际上,联合概率分布代表的是生成数据的机制,所以贝叶斯模型被称为生成式模型 。使用朴素贝叶斯法分类时,对给定的输入 x x x ,通过学习到的模型计算后验概率,将后验概率最大的类别作为 x x x 的类输出。不过上式中的连乘操作很容易造成下溢,可以对其求对数来规避这个问题,求对数后的似然叫做对数似然 (log-likelihood):
log ∏ i P ( X = x ( i ) ∣ Y = c k ) = ∑ i log P ( X = x ( i ) ∣ Y = c k )
\log \prod_i P(X=x^{(i)}|Y=c_k) = \sum_i \log P(X=x^{(i)}|Y=c_k)
log i ∏ P ( X = x ( i ) ∣ Y = c k ) = i ∑ log P ( X = x ( i ) ∣ Y = c k ) 为什么朴素贝叶斯法将实例分到后验概率最大的类中呢?因为这可以使得期望风险 最小。(证明过程参见李航的《统计学习方法》4.1.2节)
为了求先验概率 P ( Y = c k ) P(Y=c_k) P ( Y = c k ) 和 条件概率 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P ( X = x ∣ Y = c k ) ,一般使用极大似然估计 法。
先验概率 P ( Y = c k ) P(Y=c_k) P ( Y = c k ) 的极大似然估计是:
P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N
P(Y=c_k) = \frac{\sum_{i=1}^{N}I(y_i=c_k)}{N}
P ( Y = c k ) = N ∑ i = 1 N I ( y i = c k ) 其中,I ( x ) I(x) I ( x ) 称为指示函数 (indicator function),当括号中的条件满足时函数值为 1,否则函数值为 0,相当于计数。条件概率 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P ( X = x ∣ Y = c k ) 的极大似然估计是:
P ( X = x ∣ Y = c k ) = ∑ i = 1 N I ( x i = x , y i = c k ) ∑ i = 1 N I ( y i = c k )
P(X=x|Y=c_k) = \frac{\sum_{i=1}^{N}I(x_i=x,y_i=c_k)}{\sum_{i=1}^{N}I(y_i=c_k)}
P ( X = x ∣ Y = c k ) = ∑ i = 1 N I ( y i = c k ) ∑ i = 1 N I ( x i = x , y i = c k ) 贝叶斯估计# 在上面的计算中,我们发现 P ( c o n c u s s i o n ∣ s n e e z e ∩ b u i l d e r ) = 0 P(concussion|sneeze \cap builder) = 0 P ( co n c u ss i o n ∣ s n eeze ∩ b u i l d er ) = 0 ,这是因为用极大似然法来估计条件概率时出现了概率值为 0 的情况,为了避免这种情况,一般推荐采用贝叶斯估计 (Bayesian estimation),先验概率的贝叶斯估计为:
P λ ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + K λ
P_{\lambda}(Y=c_k) = \frac{\sum_{i=1}^{N}I(y_i=c_k) + \lambda}{N+K\lambda}
P λ ( Y = c k ) = N + K λ ∑ i = 1 N I ( y i = c k ) + λ 其中,K K K 表示类别的个数。同样的,条件概率的贝叶斯估计为:
P λ ( X = x ∣ Y = c k ) = ∑ i = 1 N I ( x i = x , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S λ
P_{\lambda}(X=x|Y=c_k) = \frac{\sum_{i=1}^{N}I(x_i=x,y_i=c_k) + \lambda}{\sum_{i=1}^{N}I(y_i=c_k) + S\lambda}
P λ ( X = x ∣ Y = c k ) = ∑ i = 1 N I ( y i = c k ) + S λ ∑ i = 1 N I ( x i = x , y i = c k ) + λ 当 λ = 0 \lambda = 0 λ = 0 时,就是极大似然估计,通常取 λ = 1 \lambda = 1 λ = 1 ,这时称为 拉普拉斯平滑 (Laplace smoothing)。
连续属性的处理# 上面例子中的样本特征都是离散值,当特征是连续值时,我们可以用概率密度函数 p ( x ∣ c ) p(x|c) p ( x ∣ c ) 替换上面的概率 P ( x ∣ c ) P(x|c) P ( x ∣ c ) 。假设概率密度函数服从正态分布,即 p ( x ∣ c ) ∼ N ( μ c , δ c 2 ) p(x|c) \sim \mathcal{N}(\mu_c, \delta^2_c) p ( x ∣ c ) ∼ N ( μ c , δ c 2 ) ,其中 μ c \mu_c μ c 和 δ c 2 \delta^2_c δ c 2 分别是 c 类样本在某个属性上取值的均值和方差,则有:
p ( x ∣ c ) = 1 2 π δ c exp ⟮ − ( x − μ c ) 2 2 δ c 2 ⟯
p(x|c) = \frac{1}{\sqrt{2\pi}\delta_c} \exp \lgroup -\frac{(x-\mu_c)^2}{2\delta_c^2} \rgroup
p ( x ∣ c ) = 2 π δ c 1 exp ⟮ − 2 δ c 2 ( x − μ c ) 2 ⟯