【机器学习基础】系列博客为参考周志华老师的《机器学习》一书,自己所做的读书笔记。

1.朴素贝叶斯分类器

基于贝叶斯公式:

P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) (1) P(c\mid \mathbf x)=\frac{P(c)P(\mathbf x \mid c)}{P(\mathbf x)} \tag{1} P(cx)=P(x)P(c)P(xc)(1)

来估计后验概率 P ( c ∣ x ) P(c \mid \mathbf x) P(cx)的主要困难在于:类条件概率 P ( x ∣ c ) P(\mathbf x \mid c) P(xc)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器(naive Bayes classifier)采用了“属性条件独立性假设”(attribute conditional independence assumption):对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。

基于有限训练样本直接估计联合概率,在计算上将会遭遇组合爆炸问题,在数据上将会遭遇样本稀疏问题;属性数越多,问题越严重。

基于属性条件独立性假设,式(1)可重写为:

P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) (2) P(c\mid \mathbf x)=\frac{P(c)P(\mathbf x \mid c)}{P(\mathbf x)} = \frac{P(c)}{P(\mathbf x)} \prod ^d_{i=1} P(x_i \mid c) \tag{2} P(cx)=P(x)P(c)P(xc)=P(x)P(c)i=1dP(xic)(2)

其中 d d d为属性数目, x i x_i xi x \mathbf x x在第 i i i个属性上的取值。

由于对所有类别来说 P ( x ) P(\mathbf x) P(x)相同,基于贝叶斯判定准则有:

h n b ( x ) = arg ⁡ max ⁡ c ∈ Y P ( c ) ∏ i = 1 d P ( x i ∣ c ) (3) h_{nb}(\mathbf x)=\mathop{\arg\max}_{c \in \mathcal{Y}} P(c) \prod ^d_{i=1} P(x_i \mid c) \tag{3} hnb(x)=argmaxcYP(c)i=1dP(xic)(3)

这就是朴素贝叶斯分类器的表达式。

显然,朴素贝叶斯分类器的训练过程就是基于训练集 D D D来估计类先验概率 P ( c ) P(c) P(c),并为每个属性估计条件概率 P ( x i ∣ c ) P(x_i \mid c) P(xic)

D c D_c Dc表示训练集 D D D中第 c c c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率:

P ( c ) = ∣ D c ∣ ∣ D ∣ (4) P(c)=\frac{\lvert D_c \rvert}{\lvert D \rvert} \tag{4} P(c)=DDc(4)

对离散属性而言,令 D c , x i D_{c,x_i} Dc,xi表示 D c D_c Dc中在第 i i i个属性上取值为 x i x_i xi的样本组成的集合,则条件概率 P ( x i ∣ c ) P(x_i \mid c) P(xic)可估计为:

P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ (5) P(x_i \mid c)=\frac{\lvert D_{c,x_i} \rvert}{\lvert D_c \rvert} \tag{5} P(xic)=DcDc,xi(5)

对连续属性可考虑概率密度函数,假定 p ( x i ∣ c ) ∼ N ( μ c , i , σ c , i 2 ) p(x_i \mid c) \sim \mathcal{N}(\mu_{c,i} , \sigma ^2_{c,i}) p(xic)N(μc,i,σc,i2),其中 μ c , i \mu_{c,i} μc,i σ c , i 2 \sigma ^2_{c,i} σc,i2分别是第 c c c类样本在第 i i i个属性上取值的均值和方差,则有:

p ( x i ∣ c ) = 1 2 π σ c , i e x p ( − ( x i − μ c , i ) 2 2 σ c , i 2 ) (6) p(x_i \mid c)=\frac{1}{\sqrt{2\pi} \sigma_{c,i} } exp \left(- \frac{(x_i-\mu_{c,i})^2}{2\sigma^2_{c,i}} \right) \tag{6} p(xic)=2π σc,i1exp(2σc,i2(xiμc,i)2)(6)

下面我们用以下西瓜数据集训练一个朴素贝叶斯分类器:

对测试例“测试1”进行分类:

首先估计类先验概率 P ( c ) P(c) P(c),显然有:

P ( 好瓜 = 是 ) = 8 17 ≈ 0.471 P(好瓜=是)=\frac{8}{17} \approx 0.471 P(好瓜=)=1780.471

P ( 好瓜 = 否 ) = 9 17 ≈ 0.529 P(好瓜=否)=\frac{9}{17} \approx 0.529 P(好瓜=)=1790.529

然后,为每个属性估计条件概率 P ( x i ∣ c ) P(x_i \mid c) P(xic)

注意,当样本数目足够多时才能进行有意义的概率估计。这里的西瓜数据集只是一个简单的演示。

P 青绿 ∣ 是 = P ( 色泽 = 青绿 ∣ 好瓜 = 是 ) = 3 8 = 0.375 P_{青绿 \mid 是}=P(色泽=青绿 \mid 好瓜=是)=\frac{3}{8}=0.375 P青绿=P(色泽=青绿好瓜=)=83=0.375

P 青绿 ∣ 否 = P ( 色泽 = 青绿 ∣ 好瓜 = 否 ) = 3 9 ≈ 0.333 P_{青绿 \mid 否}=P(色泽=青绿 \mid 好瓜=否)=\frac{3}{9} \approx 0.333 P青绿=P(色泽=青绿好瓜=)=930.333

P 蜷缩 ∣ 是 = P ( 根蒂 = 蜷缩 ∣ 好瓜 = 是 ) = 5 8 = 0.625 P_{蜷缩 \mid 是}=P(根蒂=蜷缩 \mid 好瓜=是)=\frac{5}{8} = 0.625 P蜷缩=P(根蒂=蜷缩好瓜=)=85=0.625

P 蜷缩 ∣ 否 = P ( 根蒂 = 蜷缩 ∣ 好瓜 = 否 ) = 3 9 ≈ 0.333 P_{蜷缩 \mid 否}=P(根蒂=蜷缩 \mid 好瓜=否)=\frac{3}{9} \approx 0.333 P蜷缩=P(根蒂=蜷缩好瓜=)=930.333

P 浊响 ∣ 是 = P ( 敲声 = 浊响 ∣ 好瓜 = 是 ) = 6 8 = 0.750 P_{浊响 \mid 是}=P(敲声=浊响 \mid 好瓜=是)=\frac{6}{8} = 0.750 P浊响=P(敲声=浊响好瓜=)=86=0.750

P 浊响 ∣ 否 = P ( 敲声 = 浊响 ∣ 好瓜 = 否 ) = 4 9 ≈ 0.444 P_{浊响 \mid 否}=P(敲声=浊响 \mid 好瓜=否)=\frac{4}{9} \approx 0.444 P浊响=P(敲声=浊响好瓜=)=940.444

P 清晰 ∣ 是 = P ( 纹理 = 清晰 ∣ 好瓜 = 是 ) = 7 8 = 0.875 P_{清晰\mid 是}=P(纹理=清晰 \mid 好瓜=是)=\frac{7}{8} = 0.875 P清晰=P(纹理=清晰好瓜=)=87=0.875

P 清晰 ∣ 否 = P ( 纹理 = 清晰 ∣ 好瓜 = 否 ) = 2 9 ≈ 0.222 P_{清晰\mid 否}=P(纹理=清晰 \mid 好瓜=否)=\frac{2}{9} \approx 0.222 P清晰=P(纹理=清晰好瓜=)=920.222

P 凹陷 ∣ 是 = P ( 脐部 = 凹陷 ∣ 好瓜 = 是 ) = 6 8 = 0.750 P_{凹陷\mid 是}=P(脐部=凹陷 \mid 好瓜=是)=\frac{6}{8} = 0.750 P凹陷=P(脐部=凹陷好瓜=)=86=0.750

P 凹陷 ∣ 否 = P ( 脐部 = 凹陷 ∣ 好瓜 = 否 ) = 2 9 ≈ 0.222 P_{凹陷\mid 否}=P(脐部=凹陷 \mid 好瓜=否)=\frac{2}{9} \approx 0.222 P凹陷=P(脐部=凹陷好瓜=)=920.222

P 硬滑 ∣ 是 = P ( 触感 = 硬滑 ∣ 好瓜 = 是 ) = 6 8 = 0.750 P_{硬滑\mid 是}=P(触感=硬滑 \mid 好瓜=是)=\frac{6}{8} = 0.750 P硬滑=P(触感=硬滑好瓜=)=86=0.750

P 硬滑 ∣ 否 = P ( 触感 = 硬滑 ∣ 好瓜 = 否 ) = 6 9 ≈ 0.667 P_{硬滑\mid 否}=P(触感=硬滑 \mid 好瓜=否)=\frac{6}{9} \approx 0.667 P硬滑=P(触感=硬滑好瓜=)=960.667

P 密度 : 0.697 ∣ 是 = p ( 密度 = 0.697 ∣ 好瓜 = 是 ) = 1 2 π ⋅ 0.129 e x p ( − ( 0.697 − 0.574 ) 2 2 ⋅ 0.12 9 2 ) ≈ 1.959 P_{密度:0.697 \mid 是}=p(密度=0.697 \mid 好瓜=是)=\frac{1}{\sqrt{2\pi} \cdot 0.129} exp \left( -\frac{(0.697-0.574)^2}{2\cdot 0.129^2} \right) \approx 1.959 P密度:0.697=p(密度=0.697好瓜=)=2π 0.1291exp(20.1292(0.6970.574)2)1.959

P 密度 : 0.697 ∣ 否 = p ( 密度 = 0.697 ∣ 好瓜 = 否 ) = 1 2 π ⋅ 0.195 e x p ( − ( 0.697 − 0.496 ) 2 2 ⋅ 0.19 5 2 ) ≈ 1.203 P_{密度:0.697 \mid 否}=p(密度=0.697 \mid 好瓜=否)=\frac{1}{\sqrt{2\pi} \cdot 0.195} exp \left( -\frac{(0.697-0.496)^2}{2\cdot 0.195^2} \right) \approx 1.203 P密度:0.697=p(密度=0.697好瓜=)=2π 0.1951exp(20.1952(0.6970.496)2)1.203

P 含糖 : 0.460 ∣ 是 = p ( 含糖率 = 0.460 ∣ 好瓜 = 是 ) = 1 2 π ⋅ 0.101 e x p ( − ( 0.460 − 0.279 ) 2 2 ⋅ 0.10 1 2 ) ≈ 0.788 P_{含糖:0.460 \mid 是}=p(含糖率=0.460 \mid 好瓜=是)=\frac{1}{\sqrt{2\pi} \cdot 0.101} exp \left( -\frac{(0.460-0.279)^2}{2\cdot 0.101^2} \right) \approx 0.788 P含糖:0.460=p(含糖率=0.460好瓜=)=2π 0.1011exp(20.1012(0.4600.279)2)0.788

P 含糖 : 0.460 ∣ 否 = p ( 含糖率 = 0.460 ∣ 好瓜 = 否 ) = 1 2 π ⋅ 0.108 e x p ( − ( 0.460 − 0.154 ) 2 2 ⋅ 0.10 8 2 ) ≈ 0.066 P_{含糖:0.460 \mid 否}=p(含糖率=0.460 \mid 好瓜=否)=\frac{1}{\sqrt{2\pi} \cdot 0.108} exp \left( -\frac{(0.460-0.154)^2}{2\cdot 0.108^2} \right) \approx 0.066 P含糖:0.460=p(含糖率=0.460好瓜=)=2π 0.1081exp(20.1082(0.4600.154)2)0.066

于是,有:

P ( 好瓜 = 是 ) × P 青绿 ∣ 是 × P 蜷缩 ∣ 是 × P 浊响 ∣ 是 × P 清晰 ∣ 是 × P 凹陷 ∣ 是 × P 硬滑 ∣ 是 × p 密度 : 0.697 ∣ 是 × p 含糖 : 0.460 ∣ 是 ≈ 0.038 P(好瓜=是) \times P_{青绿 \mid 是} \times P_{蜷缩 \mid 是} \times P_{浊响 \mid 是} \times P_{清晰 \mid 是} \times P_{凹陷 \mid 是} \times P_{硬滑 \mid 是} \times p_{密度:0.697\mid 是} \times p_{含糖:0.460\mid 是} \approx 0.038 P(好瓜=)×P青绿×P蜷缩×P浊响×P清晰×P凹陷×P硬滑×p密度:0.697×p含糖:0.4600.038

P ( 好瓜 = 否 ) × P 青绿 ∣ 否 × P 蜷缩 ∣ 否 × P 浊响 ∣ 否 × P 清晰 ∣ 否 × P 凹陷 ∣ 否 × P 硬滑 ∣ 否 × p 密度 : 0.697 ∣ 否 × p 含糖 : 0.460 ∣ 否 ≈ 6.80 × 1 0 − 5 P(好瓜=否) \times P_{青绿 \mid 否} \times P_{蜷缩 \mid 否} \times P_{浊响 \mid 否} \times P_{清晰 \mid 否} \times P_{凹陷 \mid 否} \times P_{硬滑 \mid 否} \times p_{密度:0.697\mid 否} \times p_{含糖:0.460\mid 否} \approx 6.80 \times 10^{-5} P(好瓜=)×P青绿×P蜷缩×P浊响×P清晰×P凹陷×P硬滑×p密度:0.697×p含糖:0.4606.80×105

实践中常通过取对数的方式来将“连乘”转化为“连加”以避免数值下溢。

由于 0.038 > 6.80 × 1 0 − 5 0.038>6.80 \times 10^{-5} 0.038>6.80×105,因此,朴素贝叶斯分类器将测试样本“测1”判别为“好瓜”。

需注意,若某个属性值在训练集中没有与某个类同时出现过,则直接基于式(5)进行概率估计,再根据式(3)进行判别将出现问题。例如,在使用西瓜数据集训练朴素贝叶斯分类器时,对一个“敲声=清脆”的测试例,有:

P 清脆 ∣ 是 = P ( 敲声 = 清脆 ∣ 好瓜 = 是 ) = 0 8 = 0 P_{清脆\mid 是}=P(敲声=清脆\mid 好瓜=是)=\frac{0}{8}=0 P清脆=P(敲声=清脆好瓜=)=80=0

由于式(3)的连乘式计算出的概率值为零,因此,无论该样本的其他属性是什么,哪怕在其他属性上明显像好瓜,分类的结果都将是“好瓜=否”,这显然不太合理。

为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”(smoothing),常用“拉普拉斯修正”(Laplacian correction)。具体来说,令 N N N表示训练集 D D D中可能的类别数, N i N_i Ni表示第 i i i个属性可能的取值数,则式(4)和(5)分别修正为:

P ^ ( c ) = ∣ D c ∣ + 1 ∣ D ∣ + N (7) \hat {P} (c)=\frac{\lvert D_c \rvert +1}{\lvert D \rvert +N} \tag{7} P^(c)=D+NDc+1(7)

P ^ ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i (8) \hat {P} (x_i \mid c)=\frac{\lvert D_{c,x_i} \rvert +1}{\lvert D_c \rvert +N_i} \tag{8} P^(xic)=Dc+NiDc,xi+1(8)

例如,在本文的例子中,类先验概率可估计为:

P ^ ( 好瓜 = 是 ) = 8 + 1 17 + 2 ≈ 0.474 , P ^ ( 好瓜 = 否 ) = 9 + 1 17 + 2 ≈ 0.526 \hat {P} (好瓜=是)=\frac{8+1}{17+2} \approx 0.474, \hat {P} (好瓜=否) =\frac{9+1}{17+2} \approx 0.526 P^(好瓜=)=17+28+10.474,P^(好瓜=)=17+29+10.526

类似地, P 青绿 ∣ 是 P_{青绿 \mid 是} P青绿 P 青绿 ∣ 否 P_{青绿 \mid 否} P青绿可估计为:

P ^ 青绿 ∣ 是 = P ^ ( 色泽 = 青绿 ∣ 好瓜 = 是 ) = 3 + 1 8 + 3 ≈ 0.364 \hat {P}_{青绿 \mid 是}=\hat {P} (色泽=青绿 \mid 好瓜=是)=\frac{3+1}{8+3} \approx 0.364 P^青绿=P^(色泽=青绿好瓜=)=8+33+10.364

P ^ 青绿 ∣ 否 = P ^ ( 色泽 = 青绿 ∣ 好瓜 = 否 ) = 3 + 1 9 + 3 ≈ 0.333 \hat {P}_{青绿 \mid 否}=\hat {P} (色泽=青绿 \mid 好瓜=否)=\frac{3+1}{9+3} \approx 0.333 P^青绿=P^(色泽=青绿好瓜=)=9+33+10.333

同时,上文提到的概率 P 清脆 ∣ 是 P_{清脆\mid 是} P清脆可估计为:

P ^ 清脆 ∣ 是 = P ^ ( 敲声 = 清脆 ∣ 好瓜 = 是 ) = 0 + 1 8 + 3 ≈ 0.091 \hat {P}_{清脆\mid 是}=\hat {P} (敲声=清脆 \mid 好瓜=是)=\frac{0+1}{8+3} \approx 0.091 P^清脆=P^(敲声=清脆好瓜=)=8+30+10.091

显然,拉普拉斯修正避免了因训练集样本不充分而导致概率估值为零的问题,并且在训练集变大时,修正过程所引入的先验(prior)的影响也会逐渐变得可忽略,使得估值逐渐趋向于实际概率值。

在现实任务中朴素贝叶斯分类器有多种使用方式。例如,若任务对预测速度要求较高,则对给定训练集,可将朴素贝叶斯分类器涉及的所有概率估值事先计算好存储起来,这样在进行预测时只需“查表”即可进行判别;若任务数据更替频繁,则可采用“懒惰学习”(lazy learning)方式,先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值;若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现增量学习。


想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️

个人博客网站:https://shichaoxin.com

GitHub:https://github.com/x-jeff


Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐