程序猿的自我修养 Weilit

朴素贝叶斯算法

2015-07-24

算法

$\qquad$ 输入:训练数据 $T=\{(x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N)\}$,其中 $x_i=(x_i^{(1)},x_i^{(2)},\ldots,x_i^{(n)})^T$, $x_i^{(j)}$ 是第 $i$ 个样本的第 $j$ 个特征, $x_i^{(j)}\in\{a_{j1},a_{j2},\ldots,a_{js_j}\}$,$a_{jl}$ 是第 $j$ 个特征可能取的第 $l$ 个值, $j=1,2,\ldots,n$, $l=1,2,\dots,S_j$ ,$y_i\in\{c_1,c_2,\ldots,c_K\}$;实例 $x$ ;

$\qquad$ 输出:实例 $x$ 的分类。

$\qquad$ (1) 计算先验概率及条件概率

\[P(Y=c_k)=\frac {\sum_{i=1}^N I(y_i=c_k)} N,\quad k=1,2,\ldots,K\] \[P(X^{(j)}=a_{jl}|Y=c_k)=\frac {\sum_{i=1}^N I(x_i^{(j)}=a_{jl},y_i=c_k)} {\sum_{i=1}^N I(y_i=c_k)}\] \[j=1,2,\ldots,n;\quad l=1,2,\ldots ,S_j;\quad k=1,2,\ldots,K\]

$\qquad$ (2) 对于给定的实例 $x=(x^{(1)},x^{(2)},\ldots,x^{(n)})^T$,计算

\[P(Y=c_k)\cdot\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k),\quad k=1,2,\ldots,K\]

$\qquad$ (3) 确定实例 $x$ 的类

\[y=arg\max_{c_k}P(Y=c_k)\cdot\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)\]

模型

$P(X,Y)$,条件独立性假设

策略

极大后验概率估计

推理思路

$\quad$ 通过训练数据集学习 $P(X,Y)$ ,具体地,学习先验概率分布 $P(Y=c_k)$ 和条件概率分布 $P(X=x|Y=c_k)$

朴素 = 条件独立性假设 = 特征在类确定的情况下是条件独立的

\[\begin{aligned} P(X=x|Y=c_k)&=P(X^{(1)}=x^{(1)},\ldots,X^{(n)}=x^{(n)}|Y=c_k) \\ & =\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) \end{aligned}\]

将后验概率$P(Y=c_k|X=x)$ 最大的类作为 $x$ 的类输出

\[\begin{aligned} P(Y=c_k|X=x) &=\frac {P(X=x|Y=c_k)P(Y=c_k)} {\sum_k P(X=x|Y=c_k)P(Y=c_k)} \\ &=\frac{P(Y=c_k)\prod_j P(X^{(j)}=x^{(j)}|Y=c_k)} {\sum_k P(Y=c_k)\prod_j P(X^{(j)}=x^{(j)}|Y=c_k)} \end{aligned}\]

分母对所有 $c_k$ 都是相同的,所以

\[y=arg\max_{c_k}P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)\]

算法缺陷及改进

可能出现估计的概率为0,采用贝叶斯估计代替极大似然估计

\[P_\color{red}\lambda(Y=c_k)=\frac {\sum_{i=1}^N I(y_i=c_k)+\color{red}\lambda} {N+\color{red}{K\lambda}},\quad k=1,2,\ldots,K\] \[P_\color{red}\lambda(X^{(j)}=a_{jl}|Y=c_k)=\frac {\sum_{i=1}^N I(x_i^{(j)}=a_{jl},y_i=c_k)+\color{red}\lambda} {\sum_{i=1}^N I(y_i=c_k)+\color{red}{S_j\lambda}}\]

$\lambda \ge 0$,当 $\lambda=0$ 即为极大似然估计。常取 $\lambda=1$ 此时称为拉普拉斯平滑。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏博主

留言