NB 算法 (包括符号型与数值型, 结合 Java 程序分析)

摘要: 本贴结合例子与程序分析 NB 算法.
Naive Bayes 是一个经典的、有代表性的分类算法. Naive 的 i 上面应该是两个点, 它读作 “哪义乌”, 表示很傻瓜很天真. Bayes 是一个神职人员, 也是概率界的一个神级人物. 中国程序猿喜欢把它读作 “牛逼算法”, 其实也没吹的那么厉害.

1. 例子数据集 1: 符号型

符号型数据集, 还是用 weather 吧. 可在 https://gitee.com/fansmale/javasampledata 下载.

@relation weather.symbolic

@attribute outlook {sunny, overcast, rainy}
@attribute temperature {hot, mild, cool}
@attribute humidity {high, normal}
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}

@data
sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes
sunny,mild,high,FALSE,no
sunny,cool,normal,FALSE,yes
rainy,mild,normal,FALSE,yes
sunny,mild,normal,TRUE,yes
overcast,mild,high,TRUE,yes
overcast,hot,normal,FALSE,yes
rainy,mild,high,TRUE,no

2. 基础理论

2.1 条件概率

P ( A B ) = P ( A ) P ( B ∣ A ) (1) P(AB) = P(A)P(B|A) \tag{1} P(AB)=P(A)P(BA)(1)
其中:

  • P ( A ) P(A) P(A) 表示事件 A A A 发生的概率;
  • P ( A B ) P(AB) P(AB) 表示事件 A A A B B B 同时发生的概率;
  • P ( B ∣ A ) P(B|A) P(BA) 表示在事件 A A A 发生的情况下, 事件 B B B 也发生的概率.

例: A A A 表示天气是晴天, 即 outlook = sunny; B B B 表示湿度高, 即 humidity = high.
14 天中, 有 5 天 sunny, 则 P ( A ) = P ( o u t l o o k = s u n n y ) = 5 / 14 P(A) = P(\mathrm{outlook = sunny}) = 5/14 P(A)=P(outlook=sunny)=5/14.
这 5 个晴天中, 有 3 天温度高, 则 P ( B ∣ A ) = P ( h u m i d i t y = h i g h ∣ o u t l o o k = s u n n y ) = 3 / 5 P(B|A) = P(\mathrm{humidity= high} | \mathrm{outlook = sunny}) = 3/5 P(BA)=P(humidity=highoutlook=sunny)=3/5.
那么, 即是晴天又温度度的概率是 P ( A B ) = P ( o u t l o o k = s u n n y ∧ h u m i d i t y = h i t h ) = 3 / 14 = P ( A ) P ( B ∣ A ) P(AB) = P(\mathrm{outlook = sunny} \wedge \mathrm{humidity= hith})= 3/14 = P(A) P(B | A) P(AB)=P(outlook=sunnyhumidity=hith)=3/14=P(A)P(BA).

2.2 独立性假设

x = x 1 ∧ x 2 ∧ ⋯ ∧ x m \mathbf{x} = x_1 \wedge x_2 \wedge \dots \wedge x_m x=x1x2xm 表示一个条件的组合, 如: o u t l o o k = s u n n y ∧ t e m p e r a t u r e = h o t ∧ h u m i d i t y = h i g h ∧ w i n d y = F A L S E \mathrm{outlook = sunny} \wedge \mathrm{temperature = hot} \wedge \mathrm{humidity = high} \wedge \mathrm{windy = FALSE} outlook=sunnytemperature=hothumidity=highwindy=FALSE, 它对应于我们数据集的第一行. 令 D i D_i Di 表示一个事件, 如: play = no. 根据 (1) 式可知:
P ( D i ∣ x ) = P ( x D i ) P ( x ) = P ( D i ) P ( x ∣ D i ) P ( x ) (2) P(D_i | \mathbf{x}) = \frac{P(\mathbf{x}D_i)}{P(\mathbf{x})} = \frac{P(D_i)P(\mathbf{x} | D_i)}{P(\mathbf{x})} \tag{2} P(Dix)=P(x)P(xDi)=P(x)P(Di)P(xDi)(2)
现在我们做一个大胆的假设, 认为各个条件之间是独立的:
P ( x ∣ D i ) = P ( x 1 ∣ D i ) P ( x 2 ∣ D i ) … P ( x m ∣ D i ) = ∏ j = 1 m P ( x j ∣ D i ) (3) P(\mathbf{x} | D_i) = P(x_1 | D_i) P(x_2 | D_i) \dots P(x_m | D_i) = \prod_{j = 1}^m P(x_j | D_i) \tag{3} P(xDi)=P(x1Di)P(x2Di)P(xmDi)=j=1mP(xjDi)(3)
这个大胆的假设, 就是 Naive 的来源. 在现实数据中, 它是不成立的! 我都承认自己不靠谱了, 你还想怎么样? 反正我的疗效好, 哼!
综合 (2)(3) 式可得:
P ( D i ∣ x ) = P ( x D i ) P ( x ) = P ( D i ) ∏ j = 1 m P ( x j ∣ D i ) P ( x ) (4) P(D_i | \mathbf{x}) = \frac{P(\mathbf{x}D_i)}{P(\mathbf{x})} = \frac{P(D_i) \prod_{j = 1}^m P(x_j | D_i)}{P(\mathbf{x})} \tag{4} P(Dix)=P(x)P(xDi)=P(x)P(Di)j=1mP(xjDi)(4)
如果用例子替换成 P ( p l a y = n o ∣ o u t l o o k = s u n n y ∧ t e m p e r a t u r e = h o t ∧ h u m i d i t y = h i g h ∧ w i n d y = F A L S E ) P(\mathrm{play = no} | \mathrm{outlook = sunny} \wedge \mathrm{temperature = hot} \wedge \mathrm{humidity = high} \wedge \mathrm{windy = FALSE}) P(play=nooutlook=sunnytemperature=hothumidity=highwindy=FALSE), 就读作: “在出太阳而且气温高而且湿度高而且没风的天气, 不打球的概率”.
这个概率是算不出来的, 因为我们计算不了分母 P ( x ) P(\mathbf{x}) P(x). 不过我们的目标是进行分类, 也就是说, 哪个类别的概率高, 我们就选谁. 而对不同的类别, 这个式子的分母是完全相同的! 所以我们的预测方案就可以描述为:
d ( x ) = arg max ⁡ 1 ≤ i ≤ k P ( D i ) P ( D i ∣ x ) = arg max ⁡ 1 ≤ i ≤ k P ( D i ) ∏ j = 1 m P ( x j ∣ D i ) = arg max ⁡ 1 ≤ i ≤ k log ⁡ P ( D i ) + ∑ j = 1 m log ⁡ P ( x j ∣ D i ) (5) d(\mathbf{x}) = \argmax_{1 \leq i \leq k} P(D_i) P(D_i | \mathbf{x}) = \argmax_{1 \leq i \leq k} P(D_i) \prod_{j = 1}^m P(x_j | D_i) = \argmax_{1 \leq i \leq k} \log P(D_i) + \sum_{j = 1}^m \log P(x_j | D_i)\tag{5} d(x)=1ikargmaxP(Di)P(Dix)=1ikargmaxP(Di)j=1mP(xjDi)=1ikargmaxlogP(Di)+j=1mlogP(xjDi)(5)

  • arg max ⁡ \argmax argmax 表示哪个类别的相对概率高, 我们就预测为该类别.
  • 由于 log ⁡ \log log 函数保持了单调性, 我们直接拿来用, 一方面不改变最终选择的类别, 另一方面可以把乘法搞成加法. 这是将数学应用于计算机的常用招数, 防止溢出. 真是太可恶了!
  • 如何计算 P ( x j ∣ D i ) P(x_j | D_i) P(xjDi)? 我们在最初讲条件概率的时候已经有例子了, 这里针对决策属性值再来一个: P ( x j ∣ D i ) = P ( x j D i ) P ( D i ) = P ( o u t l o o k = s u n n y ∧ p l a y = y e s ) P ( p l a y = y e s ) (6) P(x_j | D_i) = \frac{P(x_j D_i)}{P(D_i)} = \frac{P(\mathrm{outlook = sunny} \wedge \mathrm{play = yes})}{P(\mathrm{play = yes})} \tag{6} P(xjDi)=P(Di)P(xjDi)=P(play=yes)P(outlook=sunnyplay=yes)(6)

2.3 Laplacian 平滑

然鹅, (5) 式在预测时会出现问题. 例如:

  • P ( o u t l o o k = o v e r c a s t ∣ p l a y = n o ) = 0 P(\mathrm{outlook = overcast} | \mathrm{play = no}) = 0 P(outlook=overcastplay=no)=0, 即不打球的时候, 天气不可能是多云. 如果新的一天为阴天, 则不打球的概率为 0.
  • P ( t e m p e r a t u r e = h o t ∣ p l a y = y e s ) = 0 P(\mathrm{temperature = hot} | \mathrm{play = yes}) = 0 P(temperature=hotplay=yes)=0, 即打球的时候, 温度不可能是高 (注意这个例子与前面数据集的冲突, 大家领会精神就行). 如果新的一天温度高, 则打球的概率为 0.

那么, 如果有一天 o u t l o o k = o v e r c a s t ∧ t e m p e r a t u r e = h o t \mathrm{outlook = overcast} \wedge \mathrm{temperature = hot} outlook=overcasttemperature=hot, 岂不是打球和不打球的概率都为 0 了?
这里的根源在于 “一票否决权”, 即 (5) 式的连乘因子中, 只要有一个为 0, 则乘积一定为 0. 为了解决该问题, 我们要想办法让这个因子不要取 0 值.

P L ( x j ∣ D i ) = n P ( x j D i ) + 1 n P ( D i ) + v j = n P ( o u t l o o k = s u n n y ∧ p l a y = y e s ) + 1 n P ( p l a y = y e s ) + 3 (7) P^L(x_j | D_i) = \frac{n P(x_j D_i) + 1}{n P(D_i) + v_j} = \frac{n P(\mathrm{outlook = sunny} \wedge \mathrm{play = yes}) + 1}{n P(\mathrm{play = yes}) + 3} \tag{7} PL(xjDi)=nP(Di)+vjnP(xjDi)+1=nP(play=yes)+3nP(outlook=sunnyplay=yes)+1(7)
其中, n n n 是对象的数量, v j v_j vj 是第 j j j 个属性的可能取值数, outlook 有 3 种取值. 这样可以保证

  • P L ( x j ∣ D i ) > 0 P^L(x_j | D_i) > 0 PL(xjDi)>0;
  • outlook 三种取值导致的条件概率之和恒为 1. 即
    P L ( o u t l o o k = s u n n y ∣ p l a y = y e s ) + P L ( o u t l o o k = o v e r c a s t ∣ p l a y = y e s ) + P L ( r a i n = s u n n y ∣ p l a y = y e s ) = 1 P^L(\mathrm{outlook = sunny} | \mathrm{play = yes}) + P^L(\mathrm{outlook = overcast} | \mathrm{play = yes}) + P^L(\mathrm{rain = sunny} | \mathrm{play = yes}) = 1 PL(outlook=sunnyplay=yes)+PL(outlook=overcastplay=yes)+PL(rain=sunnyplay=yes)=1.

问题 1: 为什么要乘以 n n n?
回答: P ( D i ) = P ( p l a y = y e s ) = 9 14 P(D_i) = P(\mathrm{play = yes}) = \frac{9}{14} P(Di)=P(play=yes)=149 是一个概率, 乘以 n n n 之后才是一个整数 9 9 9, 与 v j = 3 v_j = 3 vj=3 相加才合理. v j v_j vj 只是来打辅助的, 不可以起决定性作用.
问题 2: 分子为什么要加 1?
回答: 就是想加一个常数使它大于 0 咯, 1 最方便.
问题 2: 分母为什么要加 v j v_j vj?
回答: 与分子加 1 相适应, 保证平滑后的概率之和为 1.

第二个条件与如下条件保持一定程度的一致:

  • P ( o u t l o o k = s u n n y ∣ p l a y = y e s ) + P ( o u t l o o k = o v e r c a s t ∣ p l a y = y e s ) + P ( r a i n = s u n n y ∣ p l a y = y e s ) = 1 P(\mathrm{outlook = sunny} | \mathrm{play = yes}) + P(\mathrm{outlook = overcast} | \mathrm{play = yes}) + P(\mathrm{rain = sunny} | \mathrm{play = yes}) = 1 P(outlook=sunnyplay=yes)+P(outlook=overcastplay=yes)+P(rain=sunnyplay=yes)=1.

对于 P ( D i ) P(D_i) P(Di) 也需要进行平滑:
P L ( D i ) = n P ( D i ) + 1 n + c (8) P^L(D_i) = \frac{n P(D_i) + 1}{n + c}\tag{8} PL(Di)=n+cnP(Di)+1(8)

考虑 Laplacian 平滑的优化目标为:
d ( x ) = arg max ⁡ 1 ≤ i ≤ k log ⁡ P L ( D i ) + ∑ j = 1 m log ⁡ P L ( x j ∣ D i ) (9) d(\mathbf{x}) = \argmax_{1 \leq i \leq k} \log P^L(D_i) + \sum_{j = 1}^m \log P^L(x_j | D_i)\tag{9} d(x)=1ikargmaxlogPL(Di)+j=1mlogPL(xjDi)(9)

3. 针对符号型数据的预测算法跟踪

请各位打开 日撸 Java 三百行(51-60天,kNN 与 NB), 对照程序来理解.
399 行是入口, 转到 357 行.
359 行的数据, 可以换成本贴中的数据.

3.1 初始化

361 行初始化一个对象, 包括

  • 从文件中读入数据 (111 行);
  • 将最后一列设为决策属性 (118 行);
  • 条件属性数为总属性数减 1 (119 行);
  • 类别数为决策属性的属性值个数 (121) 行. 这一系列语句的解释, 请参见 Weka 中的数据表基本管理.

3.2 设置数据类型

362 行设置数据类型为符号型, 这个与数值型区别.

3.3 计算决策属性的分布

363 行计算决策属性 (play) 的分布.

  • 142-146 行计算个数. 如 yes, no 在这个数据集上的出现次数分别是 9 和 5, 则该向量的值为 [9, 5].
  • 149 行计算基本的分布, 为 [ 9 14 , 5 14 ] [\frac{9}{14}, \frac{5}{14}] [149,145].
  • 150 行计算 Laplacian 分布, 为 [ 9 + 1 14 + 2 , 5 + 1 14 + 2 ] = [ 10 16 , 6 16 ] [\frac{9 + 1}{14 + 2}, \frac{5 + 1}{14 + 2}] = [\frac{10}{16}, \frac{6}{16}] [14+29+1,14+25+1]=[1610,166].
    至此, (8) 式需要的 P L ( D 1 ) = 10 16 P^L(D_1) = \frac{10}{16} PL(D1)=1610, P L ( D 2 ) = 6 16 P^L(D_2) = \frac{6}{16} PL(D2)=166 就获得了.

3.4 计算条件概率

364 行计算条件概率.

  • 166 行分配空间用于计数.
    这里涉及到了三维数组, 它们分别对应于什么?
    我们需要计算 P ( o u t l o o k = s u n n y ∧ p l a y = y e s ) P(\mathrm{outlook = sunny} \wedge \mathrm{play = yes}) P(outlook=sunnyplay=yes) 这样的概率, 它涉及到了
    • 第一维确定哪个决策类别. 本例中是 play = yes. 总的决策类别数为 numClasses.
    • 第二维确定哪个条件属性. 本例中是 outlook, 即第 0 个属性. 总的条件属性数为 numConditions.
    • 第三维确定该条件属性的哪个值. 本例中是 sunny. 总的属性值个数为 3. 但对于不同的属性而言, 有不同的属性值个数, 所以在这里暂时无法确定空间.
      注意这里虽然用的是 double 类型, 但计算的是整数个数. double 只是为了让后面除法不要搞成整除.
  • 167 行同理.
  • 170-176 行则把第三维的空间分配好.
  • 178-187 行进行计数类加. 其中, 185 行有个反向的索引, 将 tempClass 当作是下标来用. 额, 只有自己对着例子慢慢计算了.
  • 190-198 行计算 Laplacian 概率, 获得式 (9) 连加的各项. 它最终用于 291 行.

3.5 预测

365 行进行预测.
254-257 行进行逐个样本的测试, 注意本程序仅测试了训练集的数据, 当然, 你很容易把它改成新的测试集.
265 行的方法根据两种数据分别选择, 现在选择的是 classifyNominal().

  • 284 行这个循环对应的是 (5) 式中的 argmax, 即从几个类别中取概率最大那个.
  • 285 行用的是决策属性的 Laplacian 平滑. 我们前面没讲为啥决策类平滑的原因, 自悟吧.
  • 287 行这个循环就是 (5) 式中的累加.
  • 292 行这个减号, 是从 (6) 式的除号来的 (注意 log 后乘法变加法, 除法变减法).
    367 行计算准确性并输出.

4. 处理数值型数据需要的理论

数值型数据, 没有办法使用 P ( h u m i d i t y = 87 ) P(\mathrm{humidity} = 87) P(humidity=87), 因为湿度刚刚好为 87 (而不是 87.001) 的概率为 0. 实际上, 湿度为任何值的概率都为 0. 当然, P ( 86 ≤ h u m i d i t y < 87 ) P(86 \le \mathrm{humidity} < 87) P(86humidity<87) 的概率不为 0.
但是, 如果我们不想把湿度做成 [ 86 , 87 ) [86, 87) [86,87) 这样的区间 (即进行离散化), 能不能也用 NB 算法来预测呢? 可以的!
我们需要做两件事:

  • 根据数据及分布假设, 求得概率密度函数 p ( h u m i d i t y = 87 ) p(\mathrm{humidity} = 87) p(humidity=87), 这里是 p p p 而不是 P P P;
  • 直接用 p p p 代替 (5) 式中的 P P P, 对, 就是这样简单粗暴.
    正态分布在实际中最常见, 它的写法如下:
    p ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) p(x) = \frac{1}{\sqrt{2 \pi} \sigma} exp \left(- \frac{(x - \mu)^2}{2 \sigma^2}\right) p(x)=2π σ1exp(2σ2(xμ)2)
    这里涉及两个参数: 均值 μ \mu μ 和方差 σ \sigma σ. 通过有限的几个数据, 就可以把它们计算出来.
    我们把 (5) 式改造一下以适应数值型数据, 注意 2 π \sqrt{2 \pi} 2π 是常数可以去掉:
    d ( x ) = arg max ⁡ 1 ≤ i ≤ k log ⁡ P L ( D i ) + ∑ j = 1 m − log ⁡ σ i j − ( x j − μ i j ) 2 2 σ i j 2 (10) d(\mathbf{x}) = \argmax_{1 \leq i \leq k} \log P^L(D_i) + \sum_{j = 1}^m - \log \sigma_{ij} - \frac{(x_j - \mu_{ij})^2}{2 \sigma_{ij}^2}\tag{10} d(x)=1ikargmaxlogPL(Di)+j=1mlogσij2σij2(xjμij)2(10)
    这里的 σ i j \sigma_{ij} σij μ i j \mu_ij μij 表示方差与均值都与类别、属性相关. 仅需要对于决策属性那里进行 Laplacian 平滑.

5. 针对数值型数据的预测算法跟踪

400 行是入口, 转到 375 行.
383 行的代码甚至与符号型数据的完全相同.

5.1 计算高斯分布的参数

384 行进行参数计算.

  • 209 行分配空间. 这里只有两维, 分别是对应于决策属性值和各条件属性. 每个 GaussianParamters 对象有两个成员变量 mu μ \mu μ 和 sigma σ \sigma σ.
  • 215 和 216 行的循环负责填相应的元素.
  • 220 到 229 行将第 i 个类别和第 j 个属性的属性值取出来.
  • 232 行计算均值.
  • 234-239 行计算方差.

5.2 预测

309 行这个方法负责预测.

  • 314 行这个循环负责 arg max ⁡ \argmax argmax
  • 322 行这里进行概率的累加.

6. 小结

值型数据的代码居然比符号型的还短!
用其它分布的假设, 可以获得其它结果.


附录: 在这里没有用到的式子, 如果接下来我发现它们真没用, 就删除

全概率 1:
P ( A ) = P ( A D ) + P ( A ¬ D ) = P ( D ) P ( A ∣ D ) + P ( ¬ D ) P ( A ∣ ¬ D ) (2) P(A) = P(AD) + P(A \neg D) = P(D)P(A | D) + P(\neg D)P(A | \neg D)\tag{2} P(A)=P(AD)+P(A¬D)=P(D)P(AD)+P(¬D)P(A¬D)(2)
其中, ¬ D \neg D ¬D 表示事件不发生.
这个式子的意思是, 事件 D D D A A A 同时发生的概率, 加上事件 ¬ D \neg D ¬D 与事件 A A A 同时发生的概率, 等于事件 A A A 发生的概率.
例: A A A 表示天气是晴天, 即 outlook = sunny; D D D 表示要打球, 即 play = yes.
14 天中, 有 5 天 sunny, 则 P ( A ) = P ( o u t l o o k = s u n n y ) = 5 / 14 P(A) = P(\mathrm{outlook = sunny}) = 5/14 P(A)=P(outlook=sunny)=5/14.
14 天中, 有 2 天 sunny 且打球, 则 P ( A D ) = P ( o u t l o o k = s u n n y , p l a y = y e s ) = 2 / 14 P(AD) = P(\mathrm{outlook = sunny}, \mathrm{play = yes}) = 2/14 P(AD)=P(outlook=sunny,play=yes)=2/14.
14 天中, 有 3 天 sunny 且不打球, 则 P ( A D ) = P ( o u t l o o k = s u n n y , p l a y = n o ) = 3 / 14 P(AD) = P(\mathrm{outlook = sunny}, \mathrm{play = no}) = 3/14 P(AD)=P(outlook=sunny,play=no)=3/14.
该式的后一部分是通过将式 (1) 代入获得的.

全概率 2: 有的时候决策类不只是两种情况 (例如 iris 的种类为 k = 3 k = 3 k=3), 所以需要推广一下.
假设 D 1 D_1 D1, D 2 D_2 D2, … \dots , D k D_k Dk 构成一个完备事件组,即它们两两互不相容,其和为全集, 并且 P ( D i ) > 0 P(D_i) > 0 P(Di)>0. 则
P ( A ) = P ( A D 1 ) + P ( A D 2 ) + P ( A D k ) = P ( D 1 ) P ( A ∣ D 1 ) + P ( D 2 ) P ( A ∣ D 2 ) + ⋯ + P ( D k ) P ( A ∣ D k ) = ∑ i = 1 k P ( D i ) P ( A ∣ D i ) (3) \begin{array}{ll}P(A) & = P(A D_1) + P(A D_2) + P(A D_k) \\ &= P(D_1)P(A | D_1) + P(D_2)P(A | D_2) + \dots + P(D_k)P(A | D_k)\\ &= \sum_{i = 1}^k P(D_i)P(A | D_i)\end{array} \tag{3} P(A)=P(AD1)+P(AD2)+P(ADk)=P(D1)P(AD1)+P(D2)P(AD2)++P(Dk)P(ADk)=i=1kP(Di)P(ADi)(3)

P ( D i ∣ x ) = P ( x D i ) P ( x ) = P ( D i ) P ( x ∣ D i ) P ( x ) = ∑ i = 1 k P ( D i ) P ( A ∣ D i ) P ( x ) \begin{array}{ll}P(D_i | x) & = \frac{P(xD_i)}{P(x)} = \frac{P(D_i)P(x | D_i)}{P(x)}\\ & = \frac{\sum_{i = 1}^k P(D_i)P(A | D_i)}{P(x)}\end{array} P(Dix)=P(x)P(xDi)=P(x)P(Di)P(xDi)=P(x)i=1kP(Di)P(ADi)

同理, P ( A B ) = P ( B ) P ( A ∣ B ) P(AB) = P(B)P(A|B) P(AB)=P(B)P(AB).
因此,
P ( A ) = P ( B ) P ( A ∣ B ) P ( B ∣ A ) (2) P(A) = \frac{P(B)P(A|B)}{P(B|A)} \tag{2} P(A)=P(BA)P(B)P(AB)(2)

P ( X = x ) = ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) P(X=x) = \sum_k P(X = x | Y = c_k)P(Y= c_k) P(X=x)=kP(X=xY=ck)P(Y=ck)

P ( a 1 = s u n n y ) P(a_1 = sunny) P(a1=sunny)
= P ( a 1 = s u n n y & p l a y = P ) + P ( a 1 = s u n n y & p l a y = N ) = P(a_1 = sunny \& play = P) + P(a_1 = sunny \& play = N) =P(a1=sunny&play=P)+P(a1=sunny&play=N)
= P ( a 1 = s u n n y ∣ p l a y = P ) P ( p l a y = P ) + P ( a 1 = s u n n y ∣ p l a y = N ) P ( p l a y = N ) = P(a_1 = sunny | play = P) P(play = P) + P(a_1 = sunny | play = N) P(play = N) =P(a1=sunnyplay=P)P(play=P)+P(a1=sunnyplay=N)P(play=N)

你可能感兴趣的:(机器学习基础,算法)