朴素贝叶斯法
朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。
朴素贝叶斯算法的学习与分类
基本方法
设输入空间$x \subseteq R^n$为n维向量的集合,输出空间为类标记集合$\gamma =\{c_1, c_2, ...,c_k\}$。输入为特征向量$x\in \chi$,输出为类标记$y\in \gamma$。x是定义在输入空间$\chi$上的随机向量,Y是定义在输出空间$\gamma$上的随机变量。P(X, Y)是X和Y的联合概率分布。训练数据集
$$T=\{(x_1, y_1),(x_2, y_2),...,(x_n, y_n)\}$$
由P(X, Y)独立同分布产生。
朴素贝叶斯通过训练数据集学习联合概率分布P(X,Y)。具体地,学习以下先验概率分布及条件概率分布。先验概率分布
$P(Y=c_k),k=1, 2,...,K\tag{1}$
条件概率分布
$P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k),k=1,2,...,K\tag{2}$
由先验概率和条件概率,可以得到联合概率分布P(X, Y)。由于条件概率$P(X=x|Y=c_k)$的参数个数可达指数级,其估计实际是不可行的。事实上,假设$x^{(j)}$可取值有$S_j$个,j=1, 2,...,n,Y可取值K个,那么参数个数为$K\prod_{j=1}^nS_j$。
朴素贝叶斯法对条件概率分布作了条件独立性的假设。由于这是一个较强的假设,朴素贝叶斯法也由此得名。具体地,条件独立性假设是
$$\begin{split} P(X=x|Y=c_k) =& P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k) \\ =& \prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)\end{split}\tag{3}$$
朴素贝叶斯法属于生成模型。条件独立假设等使贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布$P(Y=c_k|X=x)$,将后验概率最大的类作为x的类输出。根据贝叶斯定理
$$P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)}\tag{4}$$
可以计算后验概率
$$P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}\tag{5}$$
将式(3)代入公式(5),可以得到
$$P(Y=c_k|X=x)=\frac{\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}{\sum_{k=1}^K\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}\tag{6}$$
贝叶斯分类器可以表示为:
$$y=f(x)=argmax_{c_k}\frac{\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}{\sum_{k=1}^K\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}\tag{7}$$
上式中分母中$c_k$都是一样的,即不会对结果产生影响,即
$$y=f(x)=argmax_{c_k}\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)\tag{8}$$
朴素贝叶斯分类的代码实现
这里还是用iris数据集为例,假设P(X|Y)服从高斯分布。
$$P(x_i|y=c_k) = \frac{1}{\sqrt{2\pi\sigma_{c_k}^2}}exp(-\frac{(x_i-\mu_{c_k})^2}{2\sigma_{c_k}^2})$$
$\sigma_{c_k}$表示$y=c_k$对应的x的标准差,$\mu_{c_k}$表示$y=c_k$对应的x的均值。
# ------------------ 加载数据 ------------------ #
data = load_iris()
x, y = data['data'], data['target']
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=20190308, test_size=0.3)
x_train.shape, y_train.shape
# -------------- 朴素贝叶斯分类模型 -------------- #
class NaiveBayes:
def __init__(self):
print('Gaussion naive bayes model!')
def gaussion_pdf(self, x_test, x):
"""
计算高斯正态分布下的条件概率
Params:
x_test(array):
x(array): 同属一个类别的x数据
"""
temp1 = (x_test-x.mean(0))*(x_test-x.mean(0))
temp2 = x.std(0) * x.std(0)
return np.exp(-temp1 / (2 * temp2)) / np.sqrt(2 * np.pi * temp2)
def fit(self, x_train, y_train):
self.x_train = x_train
self.y_train = y_train
def predict(self, x_test, y_test=None):
assert len(x_test.shape) == 2
self.classes = np.unique(np.concatenate([y_train, y_test], 0))
pred_probs = []
# 对于每个输入,计算其处于每个类别的概率
for i in self.classes:
idx_i = self.y_train == i
# 计算P(y)
p_y = len(idx_i) / len(self.y_train)
# 利用高斯概率密度函数计算P(x|y)
p_x_y = np.prod(self.gaussion_pdf(x_test, self.x_train[idx_i]), 1)
# 计算x,y的联合概率,P(x|y)P(y)
prob_i = p_y * p_x_y
pred_probs.append(prob_i)
pred_probs = np.vstack(pred_probs)
# 取具有最高概率的类别
label_idx = pred_probs.argmax(0)
y_pred = self.classes[label_idx]
if y_test is not None:
self._score(y_test, y_pred)
return y_pred
def _score(self, y_test, y_pred):
self.score = np.count_nonzero(y_test == y_pred)/len(y_test)
下面是分别使用自定义模型和sklearn中的模型的实验结果:
朴素贝叶斯法的参数估计
极大似然估计
这里参考这篇博客,解释一下似然和概率的区别:
对于函数$P(x|\theta)$,x表示输入数据,$\theta$表示模型参数
如果$\theta$已知,x为变量,则该函数叫做概率函数(Probability function),它描述了对不同输入x,其出现的概率。
如果x已知,$\theta$为变量,则该函数叫做似然函数(Likelihood function),它描述了对于不同模型参数下,x样本出现的概率。
极大似然估计适用于"模型已定,参数未知"情况。已知随机变量符合某种概率分布模型,但模型的参数并不知道。极大似然估计的过程可以理解为:利用已知的样本数据,反推最有可能(概率最大)产生这些数据出现的模型参数。
它的一般过程是:
- 写出似然函数。
- 对似然函数取对数并整理。
- 对参数$\theta$求导,并令其等于0。
- 求解似然方程。
这里先给出先验概率和条件概率的极大似然。先验概率$P(Y=c_k)$的极大似然为
$$P(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N},k=1,2,...,N\tag{9}$$
设第j个特征$x^{(j)}$的可能取值的集合为${a_{j1},a_{j2},...,a_{jS_j}}$,条件概率$P(X^{(j)}=a_{jl}|Y=c_k)$的极大似然估计为
$$\begin{split}P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^NI(x_i^j=a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)}\\ j=1,2,...,n;l=1,2,...,s_j;k=1,2,...,K\end{split}\tag{10}$$
式(10)中,$x_i^j$为第i个样本的第j个特征,$a_{jl}$表示第j个特征可能取的第$l$个值;$I$为指示函数。
以下证明先验概率极大似然。
我们可以假设Y的分布律。令参数$P\{Y=c_k\}=\theta_k,k=1, 2,...,K$。那么随机变量Y的分布律可用参数表示为
$$P(Y)=\sum_{k=1}^K\theta_kI(Y=c_k)\tag{11}$$
则可以得到样本$y_i\in Y$的概率为
$$P(y_i)=\sum_{k=1}^K\theta_kI(c_k=y_i) \tag{12} \\ subject \quad to $$$$\sum_{k=1}^K\theta_k=1 \tag{13}$$
则极大似然为
$$L(y_1,y_2,...,y_N;\theta)=\prod_{i=1}^N\sum_{k=1}^K\theta_kI(c_k=y_i)=\prod_{k=1}^K\theta_k^{N_k}\tag{14}$$
$N_k$表示Y中类别为$c_k$的数目,对式(14)取对数得
$$InL=\sum_{k=1}^KN_kIn(\theta_k)\tag{15}$$
根据等式约束(13),使用拉格朗日算子进行求解:
$$L(\theta,\lambda)=\sum_{k=1}^KN_k In(\theta_k)+\lambda(\sum_{k=1}^K\theta_k-1) \tag{16}$$
上式分别对$\theta$和$\lambda$求导,令导数为0可得:
$$\begin{cases} \frac{N_1}{\theta_1}+\lambda &=0 \\ \frac{N_2}{\theta_2}+\lambda &=0\\...\\ \frac{N_K}{\theta_K}+\lambda &=0\\ \sum_{k=1}^K\theta_k&=1\\\sum_{k=1}^KN_k&=N\end{cases}\tag{17}$$
求解可得:$\theta_k=\frac{N_k}{N}$,即$P(Y=c_k)$的极大似然为$P(Y=c_k)=\frac{N_k}{N}$
贝叶斯估计
不同于极大似然估计,不再把参数$\theta$看做是未知的确定变量,而将带估计的参数看做是符合某种先验概率分布的随机变量。
期望$P(\theta|D)$在真实的$\theta$值处有一个极值。
贝叶斯估计的主要步骤如下
- 确定参数$\theta$先验分布$P(\theta)$
- 根据训练样本$D = \{x_1,x_2,...,x_N\}$求出样本条件分布$P(D|\theta)$。$P(D|\theta)=\prod_{i=0}^NP(x_i|\theta)$。
- 利用贝叶斯公式计算$\theta$的后验概率:
$$P(\theta|D)=\frac{P(D|\theta)P(\theta)}{\int_\theta P(D|\theta)P(\theta)d\theta}\tag{18}$$
- 得到贝叶斯估计值
$$\hat{\theta}=\int_\theta \theta P(\theta|D)d\theta\tag{19}$$
在式(18)中,由于参数$\theta$是随机分布的,我们需要考虑每一种$\theta$的情况,然后计算积分,大量的积分运算让贝叶斯估计变得复杂。而最大后验概率估计(Maximum a posterior, MAP)就是贝叶斯估计的简化,它通过最大化后验概率,得到参数$\theta$。
最大化后验概率和极大似然类似,即最大化式(18),式(18)分母为归一化因子,即最大化分子即可:
$$\theta_{MAP}=\arg\max_{\theta}\prod_{i=1}^{n}p(x_i|\theta)p(\theta)\tag{20}$$
上式和极大似然函数很相似,只是多了一个先验概率。
总结
朴素贝叶斯法的基本假设是条件独立性,这是一个较强的假。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。
朴素贝叶斯法将实例分到后验概率最大的类中。这等价于期望风险最小化。根据期望风险最小化准则就得到了后验概率最大化准则。
$f(x)=argmax_{c_k}P(c_k|X=x)$
贝叶斯公式可以写出如下形式,Hypothesis表示假设(比如: 今天被领导批评了),Evidence表示可能导致假设发生的证据(比如:上班迟到了)。贝叶斯理论认为,Evidence不能决定后验概率,只能不断更新它。
$$P(Hypothesis|Evidence)=\frac{P(Hypothesis)P(Evidence|Hypothesis)}{P(Evidence)}$$
在参数估计过程中,MLE最大化$P(Evidence|Hypothesis)$,MAP最大化$P(Hypothesis)P(Evidence|Hypothesis)$,而贝叶斯估计则把$P(Hypothesis)$作为符合某种分布的随机变量,通过观测数据来估计后验分布(posterior distribution),并通过后验分布做群体决策。MLE不考虑先验,MAP和贝叶斯估计则都考虑了先验。MAP可以看做贝叶斯估计的简化。当样本数目接近无穷大时,MLE与MAP等效。
Reference
李航《统计学习方法》
详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。