乐趣区

关于人工智能:机器学习算法系列十三朴素贝叶斯分类算法Naive-Bayes-Classifier-Algorithm

浏览本文须要的背景知识点:一丢丢编程常识

一、引言

  后面几节介绍了一类分类算法——线性判别分析、二次判别分析,接下来介绍另一类分类算法——奢侈贝叶斯分类算法 1(Naive Bayes Classifier Algorithm/NB)。奢侈贝叶斯分类算法在文本分类和主动医疗诊断的畛域中有利用到。

二、模型介绍

条件独立 2

  在学习奢侈贝叶斯分类算法之前,先来看下在概率论中的一个概念——条件独立(conditional independence)

两个随机变量 X 和 Y 在给定第三个随机变量 Z 的状况下条件独立当且仅当它们在给定 Z 时的条件概率分布相互独立,也就是说,给定 Z 的任一值,X 的概率分布和 Y 的值无关,Y 的概率分布也和 X 的值无关。

  依据维基百科中给出的定义,能够示意为如下式子:

$$
P(X, Y \mid Z)=P(X \mid Z) P(Y \mid Z)
$$

  同时上式又等价于下式,在(1)中 Y 对 X 的条件概率没有影响,同理在(2)中 X 对 Y 的条件概率也没有影响:

$$
\begin{array}{}
P(X \mid Y, Z)=P(X \mid Z) \\
P(Y \mid X, Z)=P(Y \mid Z)
\end{array}
$$

奢侈贝叶斯分类

  同概率分布角度的判别分析一样,也是应用最大后验概率预计。奢侈贝叶斯分类算法有一个前提条件——假如各特色变量之间是条件独立的,这也是被称为“奢侈”的起因。

(1)假如函数表达式

(2)改写一下,特色变量 x 为 p 维

(3)用贝叶斯定理变换一下

(4)因为分母对最初的后果不影响,不依赖与分类,能够认为是一个常数

(5)依据假如各特色变量之间是条件独立的,所以能够改写成乘积的模式

(6)用连乘符号简化一下

$$
\begin{aligned}
h(x) &=\underset{k}{\operatorname{argmax}} P(k \mid x) & (1) \\
&=\underset{k}{\operatorname{argmax}} P\left(k \mid x_{1}, x_{2}, \ldots, x_{p}\right) & (2) \\
&=\underset{k}{\operatorname{argmax}} \frac{P(k) P\left(x_{1}, x_{2}, \ldots, x_{p} \mid k\right)}{P\left(x_{1}, x_{2}, \ldots, x_{p}\right)} & (3) \\
&=\underset{k}{\operatorname{argmax}} P(k) P\left(x_{1}, x_{2}, \ldots, x_{p} \mid k\right) & (4) \\
&=\underset{k}{\operatorname{argmax}} P(k) P\left(x_{1} \mid k\right) P\left(x_{2} \mid k\right) \ldots P\left(x_{p} \mid k\right) & (5) \\
&=\underset{k}{\operatorname{argmax}} P(k) \prod_{i=1}^{p} P\left(x_{i} \mid k\right) & (6)
\end{aligned}
$$

  最初就失去了奢侈贝叶斯分类的概率模型,针对不同的概率分布能够失去不同的奢侈贝叶斯分类办法。常见的算法包含:多项式奢侈贝叶斯分类、高斯奢侈贝叶斯分类、伯努利奢侈贝叶斯分类等。

样本数据

  假如有如下水果的样本数据集,特色别离为形态(圆、椭圆),色彩(红色、绿色),大小(大、中、小),甜度(甜、不甜),水果分三类:苹果、葡萄、西瓜。

形态 色彩 大小 甜度 水果
红色 不甜 苹果
椭圆 绿色 葡萄
红色 不甜 葡萄
红色 葡萄
椭圆 绿色 西瓜
绿色 不甜 苹果
椭圆 绿色 葡萄
绿色 西瓜
红色 苹果
椭圆 绿色 不甜 西瓜

  假如当初咱们有一个形态为圆,色彩为绿色、大小为中、甜度为甜的样本数据,应该被分成哪一类?

多项式奢侈贝叶斯分类

  多项式奢侈贝叶斯分类是假如样本遵从多项式散布 3(multinomial distribution),是通过特色呈现的频率来预计特色的概率,依据大数定律 4(law of large numbers),当样本数据越多,事件呈现的频率趋于稳定后,频率即为事件的概率。

  分类为 k 的概率能够通过分类 k 在所有样本中呈现的频率来预计,即分类为 k 的样本数 N_k 除以总样本数 N。在分类为 k 时,第 i 个特色为 x_i 的概率等于分类为 k 并且特色为 x_i 的样本数除以分类为 k 的样本数 N_k,数学表达式如下:

$$
\begin{aligned}
P(k) &=\frac{N_{k}}{N} \\
P\left(x_{i} \mid k\right) &=\frac{N_{k x_{i}}}{N_{k}}
\end{aligned}
$$

  例如用下面的样本数据来计算当分类为西瓜时,甜度为甜的频率如下:

$$
P(\text { 甜度}=\text {甜} \mid \text {水果}=\text {西瓜})=\frac{2}{3}
$$

  接下来咱们来解决下面的样本数据的问题,别离应用多项式奢侈贝叶斯分类来求出苹果、葡萄、西瓜在上述条件下的概率:

$$
\begin{aligned}
P(苹果 \mid 圆, 绿色, 中, 甜) &\propto P(苹果) \times P(圆 苹果) \times P(绿色 \mid 苹果) \times P(中 \mid 苹果) \times P(甜 \mid 苹果) \\
&\propto \frac{3}{10} \times \frac{3}{3} \times \frac{1}{3} \times \frac{3}{3} \times \frac{1}{3} \\
&\propto \frac{1}{30} \approx 0.033333 \\
P(葡萄 \mid 圆, 绿色, 中, 甜) &\propto P(葡萄) \times P(圆 \mid 葡萄) \times P(绿色 \mid 葡萄) \times P(中 \mid 葡萄) \times P(甜 \mid 葡萄) \\
&\propto \frac{4}{10} \times \frac{2}{4} \times \frac{2}{4} \times \frac{1}{4} \times \frac{3}{4} \\
&\propto \frac{3}{160} \approx 0.01875 \\
P(西瓜 | 圆, 绿色, 中, 甜) &\propto P(西瓜) \times P(圆 \mid 西瓜) \times P(绿色 | 西瓜) \times P(中 \mid 西瓜) \times P(甜 | 西瓜) \\
&\propto \frac{3}{10} \times \frac{1}{3} \times \frac{3}{3} \times \frac{2}{3} \times \frac{2}{3} \\
&\propto \frac{2}{45} \approx 0.044444
\end{aligned}
$$

  能够看到最初的后果是 P(西瓜|圆,绿色,中,甜) 最大,所以形态为圆,色彩为绿色、大小为中、甜度为甜的样本数据应该被分为西瓜。

  下面的后果看上去仿佛没什么问题,但当一种特色中某个分类下没有呈现过,例如分类为西瓜时色彩为红色、分类为葡萄时大小为大的状况下,会发现用下面的形式计算出的概率为零,这会使得最初的后验概率也等于零。

$$
P(\text { 色彩}=\text {红色} \mid \text {水果}=\text {西瓜})=\frac{0}{3}=0
$$

  那么如何解决这个问题呢?这里能够对数据做平滑解决,在计算频率时引入一个平滑参数来防止计算中呈现 0 的问题,数学表达式如下:

$$
\begin{aligned}
P(k) &=\frac{N_{k}+\alpha}{N+M \alpha} \\
P\left(x_{i} \mid k\right) &=\frac{N_{k x_{i}}+\alpha}{N_{k}+M_{i} \alpha}
\end{aligned}
$$

  其中 α 为平滑参数,M 为分类的数量,M_i 为第 i 个特色的类型数量,在下面水果的例子中,水果有苹果、葡萄、西瓜三种,所以 M=3,特色形态有圆、椭圆两种,所以 M_1=2,依此类推。

  该形式被称为拉普拉斯平滑 5(Laplace smoothing)。当样本数足够多时,即 N >> M,这种平滑解决对后果的影响较小。

  同下面一样,别离应用多项式奢侈贝叶斯分类来求出苹果、葡萄、西瓜在上述条件下的概率,这次加上拉普拉斯平滑解决:

$$
\begin{aligned}
P(苹果 \mid 圆, 绿色, 中, 甜) &\propto P(苹果) \times P(圆 苹果) \times P(绿色 | 苹果) \times P(中 \mid 苹果) \times P(甜 \mid 苹果) \\
&\propto \frac{4}{13} \times \frac{4}{5} \times \frac{2}{5} \times \frac{4}{6} \times \frac{2}{5} \\
&\propto \frac{128}{4875} \approx 0.026256
P(葡萄 \mid 圆, 绿色, 中, 甜) &\propto P(葡萄) \times P(圆 \mid 葡萄) \times P(绿色 \mid 葡萄) \times P(中 \mid 葡萄) \times P(甜 \mid 葡萄) \\
&\propto \frac{5}{13} \times \frac{3}{6} \times \frac{3}{6} \times \frac{2}{7} \times \frac{4}{6} \\
&\propto \frac{5}{273} \approx 0.018315
P(西瓜 \mid 圆, 绿色, 中, 甜) &\propto P(西瓜) \times P(圆 \mid 西瓜) \times P(绿色 \mid 西瓜) \times P(中 \mid 西瓜) \times P(甜 \mid 西瓜) \\
&\propto \frac{4}{13} \times \frac{2}{5} \times \frac{4}{5} \times \frac{3}{6} \times \frac{3}{5} \\
&\propto \frac{48}{1625} \approx 0.029538
\end{aligned}

$$

  最初的后果与后面的统一,该样本数据应该被分为西瓜。为了防止连乘在计算时存在精确度的问题,个别实现时都会改成将条件概率预计取对数后连加。

伯努利奢侈贝叶斯分类

  伯努利奢侈贝叶斯分类是假如样本数据遵从伯努利散布 6(Bernoulli distribution),该分类同多项式奢侈贝叶斯分类一样实用于离散特色,不同点是伯努利散布的取值只能为 0、1,例如水果甜与不甜,硬币正反面等,当特色的取值多于两类时,须要对其进行二值化操作。

  伯努利奢侈贝叶斯分类应用如下式中的规定,能够看到相比于多项式奢侈贝叶斯分类,未呈现的特色也会被加上,而多项式奢侈贝叶斯分类会疏忽未呈现的特色。

$$
P\left(X_{i} \mid y\right)=P(i \mid y) x_{i}+(1-P(i \mid y))\left(1-x_{i}\right)
$$

高斯奢侈贝叶斯分类

  能够看到多项式奢侈贝叶斯分类更长于解决如下面水果例子一样的离散特色,当样本的特色是间断的,例如身高、体重时,可能应用高斯奢侈贝叶斯分类来解决更适合一些。

  高斯奢侈贝叶斯分类顾名思义是假如样本数据遵从正太散布(Normal distribution)或者也叫作高斯分布(Gaussian distribution),计算出对应分类下每个特色的方差与均值,利用正态分布的概率密度函数,预计对应的概率值。

$$
f(x ; \mu ; \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)
$$

三、代码实现

应用 Python 实现多项式奢侈贝叶斯分类:

import numpy as np

def mnb(X, y, alpha = 1):
   """
   多项式奢侈贝叶斯分类
   args:
       X - 训练数据集
       y - 指标标签值
       alpha - 平滑参数
   return:
       priors - 先验概率的对数
       pss - 每种特色对应每种标签分类的条件概率的对数
       x_classes - 特色分类
       y_classes - 标签分类
   """
   # 标签分类、每类数量
   y_classes, y_counts = np.unique(y, return_counts=True)
   y_counts += alpha
   # 先验概率
   priors = np.log(y_counts / np.sum(y_counts))
   # 每种特色对应每种标签分类的条件概率的对数
   pss = []
   # 特色分类
   x_classes = []
   for idx in range(X.shape[1]):
       # 第 idx 个特色
       x_idx = X[:, idx]
       # 第 idx 个特色分类、每类数量
       x_idx_classes, x_idx_counts = np.unique(x_idx, return_counts=True)
       x_classes.append(x_idx_classes)
       # 第 idx 个特色对应每种标签分类的条件概率的对数
       ps = []
       for jdx in range(len(y_classes)):
           # 第 idx 个特色对应第 jdx 个标签分类的分类、每类数量
           x_jdx_classes, x_jdx_counts = np.unique(x_idx[y==y_classes[jdx]], return_counts=True)
           # 第 idx 个特色对应第 jdx 个标签分类的条件概率的对数
           p = []
           for kdx in range(len(x_idx_classes)):
               # 同时满足特色与标签的下标
               idxs = np.where(x_jdx_classes == x_idx_classes[kdx])[0]
               # 平滑后的分子
               a = alpha
               if (len(idxs) != 0):
                   a = x_jdx_counts[idxs[0]] + alpha
               # 平滑后的分母
               b = np.sum(x_jdx_counts) + len(x_idx_classes) * alpha
               p.append(np.log(a/b))
           ps.append(np.array(p))
       pss.append(np.array(ps))
   return priors, pss, x_classes, y_classes

def predict(X, priors, pss, x_classes, y_classes):
   """
   预测
   args:
       X - 数据集
       priors - 先验概率的对数
       pss - 每种特色对应每种标签分类的条件概率的对数
       x_classes - 特色分类
       y_classes - 标签分类
   return:
       预测后果
   """
   ys = []
   for idx in range(X.shape[0]):
       y = np.array(priors)
       for jdx in range(X.shape[1]):
           for kdx in range(len(y_classes)):
               y[kdx] = y[kdx] + pss[jdx][kdx][x_classes[jdx] == X[idx][jdx]]
       ys.append(y)
   return y_classes[np.argmax(ys, axis=1)]

应用 Python 实现高斯奢侈贝叶斯分类:

import numpy as np

def gnb(X, y):
   """
   高斯奢侈贝叶斯分类
   args:
       X - 训练数据集
       y - 指标标签值
       alpha - 平滑参数
   return:
       priors - 先验概率的对数
       means - 均值向量
       stds - 标准差向量
       y_classes - 标签分类
   """
   # 标签分类、每类数量
   y_classes, y_counts = np.unique(y, return_counts=True)
   # 先验概率
   priors = np.log(y_counts / np.sum(y_counts))
   # 均值向量
   means = []
   # 标准差向量
   stds = []
   for y_class in y_classes:
       x = X[y==y_class][:]
       means.append(np.mean(x, axis=0))
       stds.append(np.std(x, axis=0))
   return priors, means, stds, y_classes

def predict(X, priors, means, stds, y_classes):
   """
   预测
   args:
       X - 数据集
       priors - 先验概率的对数
       means - 均值向量
       stds - 标准差向量
       y_classes - 标签分类
   return:
       预测后果
   """
   ys = []
   for kdx in range(len(y_classes)):
       ys.append(np.sum(np.log(normal(X, means[kdx], stds[kdx])), axis=1) + priors[kdx])
   return y_classes[np.argmax(ys, axis=0)]

def normal(x, mean, std):
   """
   正态分布概率密度函数
   args:
       x - 特征值
       mean - 均值
       std - 标准差
   return:
       概率预计
   """
   exponent = np.exp(-(np.power(x - mean, 2) / (2 * np.power(std, 2))))
   return (1 / (np.sqrt(2 * np.pi) * std)) * exponent

四、第三方库实现

scikit-learn7 实现多项式奢侈贝叶斯分类:

from sklearn.naive_bayes import MultinomialNB

# 初始化多项式奢侈贝叶斯分类器
mnb = MultinomialNB()
# 拟合数据
mnb.fit(X, y)
# 预测
mnb.predict(X)

scikit-learn8 实现伯努利奢侈贝叶斯分类:

from sklearn.naive_bayes import BernoulliNB

# 初始化伯努利奢侈贝叶斯分类器
bnb = BernoulliNB()
# 拟合数据
bnb.fit(X, y)
# 预测
bnb.predict(X)

scikit-learn9 实现高斯奢侈贝叶斯分类:

from sklearn.naive_bayes import GaussianNB

# 初始化高斯奢侈贝叶斯分类器
gnb = GaussianNB()
# 拟合数据
gnb.fit(X, y)
# 预测
gnb.predict(X)

  在 scikit-learn 实现中还存在几种其余的奢侈贝叶斯分类 10:补充奢侈贝叶斯分类、类别奢侈贝叶斯分类等,基本上都是对上述奢侈贝叶斯分类的优化版本,具体形式能够参看对应的实现。

五、动画展现

  下图仍然应用上几节的二分类演示数据,其中红色示意标签值为 0 的样本、蓝色示意标签值为 1 的样本:

  下图展现了应用高斯奢侈贝叶斯分类拟合数据的后果,其中浅红色示意拟合后依据权重系数计算出预测值为 0 的局部,浅蓝色示意拟合后依据权重系数计算出预测值为 1 的局部:

  回顾一下二次判别分析一节中最初的后果,会发现后果是统一的。这阐明在二次判别分析模型中,假如协方差矩阵是对角矩阵,在每个类中,输出都是条件独立的,那么所失去的分类器等价于高斯奢侈贝叶斯分类器 11

六、思维导图

七、参考文献

  1. https://en.wikipedia.org/wiki…
  2. https://en.wikipedia.org/wiki…
  3. https://en.wikipedia.org/wiki…
  4. https://en.wikipedia.org/wiki…
  5. https://en.wikipedia.org/wiki…
  6. https://en.wikipedia.org/wiki…
  7. https://scikit-learn.org/stab…
  8. https://scikit-learn.org/stab…
  9. https://scikit-learn.org/stab…
  10. https://scikit-learn.org/stab…
  11. https://scikit-learn.org/stab…

残缺演示请点击这里

注:本文力求精确并通俗易懂,但因为笔者也是初学者,程度无限,如文中存在谬误或脱漏之处,恳请读者通过留言的形式批评指正

本文首发于——AI 导图 ,欢送关注

退出移动版