朴素贝叶斯法

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法

对于给定的训练数据集,首先,基于特征条件独立假设学习输入/输出的联合概率分布;然后,基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

本文叙述朴素贝叶斯法,包括朴素贝叶斯法的学习与分类、朴素贝叶斯法的参数估计算法。

4.1 朴素贝叶斯法的学习与分类

4.1.1 基本方法

设输入空间为n维向量的集合,输出空间为类标记集合。输入为特征向量,输出为类标记。X是定义在输入空间上的随机向量,Y是定义在输出空间上的随机向量。P(X,Y)是X和Y的联合概率分布。训练数据集:

由P(X,Y)独立同分布产生。

朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y)。具体地,学习一下先验概率分布及条件概率分布。

先验概率分布:

条件概率分布:

于是学习到联合概率分布P(X,Y)。

局限性:

条件概率分布有指数级数量的参数,其估计实际上是不可行的。假设可取值有个,j=1,2,…,n,Y可取值有K个,那么参数个数为

解决方案:

设置假设条件:特征独立同分布

朴素贝叶斯法对条件概率分布做了条件独立性的假设。由于这是比较强的假设,朴素贝叶斯法因此得名。具体地,条件独立性假设是:

这里的表示第1个特征;朴素贝叶斯法实际上学习到生成数据的机制,所以属于生成模型

条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。这一假设使得条件概率分布的学习难度降低了,但会牺牲一定的分类准确率。

朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布,将后验概率最大的类作为x的类输出。

后验概率计算根据贝叶斯定理进行:

将式(4.3)代入式(4.4),得:

这是朴素贝叶斯法的基本公式。于是,朴素贝叶斯分类器可表示为:

注意到,在式(4.6)中分母为归一化因子,无须理会,所以:

为什么将后验概率最大的类作为x的输出?因为后验概率最大化等效于期望风险最小化。

4.1.2 后验概率最大化的含义

后验概率最大化等效于期望风险最小化

设选择0-1损失函数:

式中f(X)是分类决策函数。这时,期望风险函数为:

期望是对联合分布P(X,Y)取的。由此可得关于条件概率P(Y|X)的期望(损失函数关于条件概率的期望):

为了是期望风险最小化,只需对X=x逐个极小化(遍历所有的样本),由此得到:

这样一来,根据期望风险最小准则就得到了后验概率最大化准则:

即朴素贝叶斯所采用的原理。

求得的f(x)是一个概率函数。

4.2朴素贝叶斯法的参数估计

这里使用了两种方法进行参数估计:一种是极大似然估计,另一种是贝叶斯估计。最大的区别在于贝叶斯估计加入了先验知识。使得估计更加准确。

4.2.1 极大似然估计

在朴素贝叶斯法中,学习意味着估计。可以应用极大似然估计法估计相应的概率。

先验概率的极大似然估计是:

设第j个特征可能取值的集合为,条件概率的极大似然估计是:

式中,是第i个样本的第j个特征;是第j个特征可能取的第l个值;I为指示函数。

4.2.2 学习与分类算法

下面给出朴素贝叶斯法的学习与分类算法:

算法4.1(朴素贝叶斯算法)

输入:训练数据,其中是第i个样本的第j个特征,是第j个特征可能取的第l个值,

输出:实例x的分类

  1. 计算先验概率及条件概率

  1. 对于给定的实例,计算:

  2. 确定实例x的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def _MLE_fit(self, X, y):
X = np.array(X)
y = np.array(y)
#1.先求出先验概率
y_unique = np.unique(y)

for i in y_unique:
self.prior_logit['y='+str(i)] = np.sum(y==i)
self.prior_prob['y='+str(i)] = np.sum(y==i)/float(len(y))
#2.求出条件概率
m,n = X.shape
for i in y_unique:
for j in range(n):
xj_unique = np.unique(X[:,j])
for k in xj_unique:
self.condition_logit['y='+str(i)+',x='+str(k)] = np.sum(X[np.where(y==i),j]==k)
self.condition_prob['y='+str(i)+',x='+str(k)] = np.sum(X[np.where(y==i),j]==k)/float(np.sum(y==i))
print(self.prior_prob)
print(self.condition_prob)

4.2.3 贝叶斯估计

用极大似然估计可能会出现所要估计的概率值为0的情况。这会影响到后验概率的计算结果,使分类产生偏差。

解决这里问题的方法是贝叶斯估计法。具体地,条件概率的贝叶斯估计是:

式中等价于在随机变量各个取值的频数上赋予一个正数。当时,就是极大似然估计。常取1,这是称为拉普拉斯平滑

显然,对任何,有

表明式(4.11)确为一种概率分布。同样的,先验概率贝叶斯估计是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def _BE_fit(self, X, y, alpha):
X = np.array(X)
y = np.array(y)
#1.先求出先验概率
y_unique = np.unique(y)

for i in y_unique:
self.prior_logit['y='+str(i)] = np.sum(y==i)
self.prior_prob['y='+str(i)] = (np.sum(y==i)+alpha)/(float(len(y))+len(y_unique)*alpha)
#2.求出条件概率
m,n = X.shape
for i in y_unique:
for j in range(n):
xj_unique = np.unique(X[:,j])
for k in xj_unique:
self.condition_logit['y='+str(i)+',x='+str(k)] = np.sum(X[np.where(y==i),j]==k)
self.condition_prob['y='+str(i)+',x='+str(k)] = \
(np.sum(X[np.where(y==i),j]==k)+alpha)/(float(np.sum(y==i))+len(xj_unique)*alpha)
print(self.prior_prob)
print(self.condition_prob)