[TOC] 更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:<a target="_blank" href="https://www.cnblogs.com/nickchen121/p/11686958.html">http://www.javashuo.com/article/p-vozphyqp-cm.html</a>html
朴素贝叶斯是基于贝叶斯公式与特征条件独立假设的分类方法(注:贝叶斯公式是数学定义,朴素贝叶斯是机器学习算法)。朴素贝叶斯基于输入和输入的联合几率分布,对于给定的输入,利用贝叶斯公式求出后验几率最大的输出$y$。便可以总结为如下三点python
假设如今有一个有两个类别的鸢尾花数据集,而且已经知晓每一个数据的分类状况,而且假设数据的分布以下图所示。算法
# 朴素贝叶斯引入图例 from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt from sklearn import datasets %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') iris_data = datasets.load_iris() X = iris_data.data[0:100, [0, 1]] y = iris_data.target[0:100] plt.scatter(X[0:50, [0]], X[0:50, [1]], color='r', s=50, marker='o', label='山鸢尾') plt.scatter(X[50:100, [0]], X[50:100, [1]], color='b', s=50, marker='x', label='杂色鸢尾') plt.xlabel('花瓣长度(cm)', fontproperties=font) plt.ylabel('花瓣宽度(cm)', fontproperties=font) plt.legend(prop=font) plt.show()
数据结构
如今假设有一个未知分类的鸢尾花数据$(x_1(花瓣长度),x_2(花瓣宽度))$,用$p_1(x_1,x_2)$表示样本属于山鸢尾(red)的几率,用$p_2(x_1,x_2)$表示属于杂色鸢尾(blue)的几率,$p_1(x_1,x_2) + p_2(x_1,x_2) = 1$。机器学习
假设若是$p_1(x_1,x_2) > p_2(x_1,x_2)$则$(x_1,x_2)$为山鸢尾,不然为杂色鸢尾,即选择几率高的类别做为新样本的分类结果。这就是贝叶斯决策理论的核心思想,选择具备最高几率的决策。函数
若是使用条件几率来表示这个上述所说的分类,则能够表示为 $$ \begin{align} & p(red|x_1,x_2) > p(blue|x_1,x_2) \quad \text{样本属于山鸢尾} \ & p(red|x_1,x_2) < p(blue|x_1,x_2) \quad \text{样本属于杂色鸢尾} \end{align} $$ 即若是出现一个新样本,假设数据集有$n$个特征、$m$个分类,只须要计算这个样本的 $$ arg,max,(p(red|x_1,x_2),p(blue|x_1,x_2)) $$ 若是只有两个特征$x_1$和$x_2$,那么计算并不会很难,按照条件公式计算便可,可是你有没有想过若是有$n$特征,$K$个分类呢?即计算 $$ \underbrace{arg,max}_{c_k},p(c_j|x_1,x_2,\ldots,x_n) \quad(k=1,2,\cdots,K) $$ 上述的计算量是很是大的,那么咱们有没有一种简单的方法可以改善该公式呢?有是有必定有的,即朴素贝叶斯法。学习
假设现有一个训练集有$K$个类别$c_1,c_2,\ldots,c_k$,$m$个样例,每一个样例有$n$个特征,训练集能够表示为 $$ ((x_1^{(1)},x_2^{(1)},\cdots,x_n^{(1)},y_1)(x_1^{(2)},x_2^{(2)},\cdots,x_n^{(2)},y_2),\cdots,(x_1^{(m)},x_2^{(m)},\cdots,x_n^{(m)},y_m)) $$ 从样本中能够获得测试
朴素贝叶斯的先验分布为$p(c_k) \quad (k=1,2,\ldots,K)$,网站
朴素贝叶斯的条件几率分布为$p(x_1,x_2,\ldots,x_n|c_k)$,人工智能
利用条件几率公式获得$X$和$Y$的联合分布$p(X,Y)$ $$ \begin{align} p(X,Y) & = p((x_1,x_2,\ldots,x_n),c_k) \ & = p(c_k)p(x_1,x_2,\ldots,x_n|c_k) \ \end{align} $$
因为$p(x_1,x_2,\ldots,x_n|c_k)$是一个$n$个维度的条件分布,计算难度超级复杂,所以假设$X$的$n$个维度之间相互独立(注:若是特征之间有大部分不是独立存在的,则应该尽可能不要使用朴素贝叶斯模型,而应该考虑使用其余的分类方法),则能够把这个$n$维的条件分布改写成 $$ p(x_1,x_2,\ldots,x_n|c_k) = p(x_1|c_k)p(x_2|c_k)\cdots{p(x_n|c_k)} $$ 虽然改写后的联合分布计算更加简单,可是因为假设全部的特征都是独立的,所以会相应的下降预测的不许确性。
假设已经获得了训练集的$p(c_k)$和$p(x_j|c_k)$值,假设现有一个测试样本$(x_{1},x_{2},\ldots,x_{n})$,则能够根据贝叶斯公式求得$K$个分类$c_1,c_2,\ldots,c_k$各自的几率。 $$ \begin{align} p(c_k|x_{1},x_{2},\ldots,x_{n}) & = {\frac{p(x_{1},x_{2},\ldots,x_{n}|c_k)p(c_k)}{p(x_{1},x_{2},\ldots,x_{n})}} \ & = {\frac{p(x_{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)p(c_k)}} {p(x_{1},x_{2},\ldots,x_{n})}} \ \end{align} $$ 求得全部分类各自的几率以后,哪个分类的几率最大,则样本属于哪个分类。 $$ \begin{align} 样本类别 & = max,(p(c_1|x_{1},x_{2},\ldots,x_{n}),p(c_2|x_{1},x_{2},\ldots,x_{n}),\cdots,p(c_k|x_{1},x_{2},\ldots,x_{n})) \ & = \underbrace{arg,max}{c_k},{\frac{p(x{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)}} {p(x_{1},x_{2},\ldots,x_{n})}} \ \end{align} $$ 其中$y = max,f(x)$表示$y$是$f(x)$中全部的值中最大的输出;$y = arg,max f(x)$表示$y$是$f(x)$中,输出的那个参数$t$。
因为每个类别的几率公式的分子都是相同的,把分子去掉后则能够把上述公式转化为朴素贝叶斯模型的基本公式 $$ \begin{align} 样本类别 & = \underbrace{arg,max}{c_k} {p(x{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)p(c_k)}} \ & = \underbrace{arg,max}{c_k},p(c_k) \prod{j=1}^{n} p(x_{j}|c_k) \end{align} $$
朴素贝叶斯模型的基本公式为 $$ 样本类别 = \underbrace{arg,max}{c_k},p(c_k) \prod{j=1}^{n} p(x_{j}|c_k) $$ 其中$p(c_k)$经过极大似然估计很容易算出样本类别$c_k$的出现频率,假设$c_k$出现$m_k$次,则 $$ p(c_k) = {\frac{m_k}{m}} $$ 而对于$p(x_j|c_k)$,则须要考虑特征值的取值与分布状况。
假设$x_j$是离散值,则能够假设$x_j$符合多项式分布,这种状况下的$p(x_j|c_k)$是样本类别$c_k$中特征$x_j$出现的频率,假设$x_j$在$c_k$中出现的次数为$m_{k_j}$,则 $$ p(x_j|c_k) = {\frac {m_{k_j}} {m_k} } $$ 因为假设全部特征相互独立,若是某个特征没有出如今某个类别中,则$p(x_j|c_k) = 0$会使分类产生误差,通常采用贝叶斯估计解决该问题,即引入拉普拉斯平滑(Laplace smoothing),即 $$ p(x_j|c_k) = {\frac {m_{k_j} + \lambda} {m_k + S_j\lambda} } $$ 其中$\lambda\leq0$,当$\lambda=0$时为最大似然估计;$\lambda=1$时称为拉普拉斯平滑,$S_j$为第j个特征能够能取值的个数(注:因为$x_j$是离散的值,$x_j$有可能出现屡次,而且每次出现的值可能不一样)。
假设$x_j$是很是稀疏的离散值,即各个特征出现的几率很低,这个时候能够假设$x_j$符合伯努利分布,即特征$x_j$出现为$1$,不出现为$0$。则$p(x_j|c_k)$是$x_j$在样本类别$c_k$中出现的频率,则 $$ p(x_j|c_k) = p(x_j|c_k)x_j + (1- p(x_j|c_k))(1-x_j) $$
假设$x_j$是连续值,则假设$x_j$符合高斯分布(正态分布),则能够把$x_j$直接带入正态分布公式,便可得 $$ p(x_j|c_k) = {\frac {1} {\sqrt{2\pi\sigma_k^2}} } exp (-{\frac {(x_j - \mu_{k})^2} {2\sigma_k^2}}) $$ 其中$\mu_k$是全部$x_j$的指望值,$\sigma_k^2$是全部$x_j$的方差
多项式朴素贝叶斯(Multinomial Naive Bayes)特征值符合多项式分布,多用于高维度向量分类,即样本特征为多元离散值,所以最经常使用于文章分类。
from sklearn.naive_bayes import MultinomialNB
伯努利朴素贝叶斯(Bernoulli Naive Bayes)特征值符合伯努利分布,针对布尔类型特征值的向量作分类,即样本特征为二元离散值,或者为稀疏的多元离散值。
from sklearn.naive_bayes import BernoulliNB
高斯朴素贝叶斯(Gaussian Naive Bayes)特征符合高斯分布,多用于特征值为连续值,能够利用高斯几率密度公式进行分类拟合。
from sklearn.naive_bayes import GaussianNB
有$m$个实例$n$维特征的数据集 $$ T={(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)} $$ 其中$x_i$是第$i$个实例的特征向量即$({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})$,${x_i}^{(j)} \quad(j=1,2,\cdots,n)$是第$i$个实例的第$j$个特征,${x_i}^{(j)}\in{a_{j1},a_{j2},\cdots,a_{jS_j}}$,$a_{jl} \quad(l=1,2,\cdots,S_j)$是第$j$个特征可能的第$l$个值,$y_i\in{c_1,c_2,\cdots,c_K}$,$c_k \quad (k=1,2,\cdots,K)$是第$k$个类;实例$x$。
实例$x$的类别。
朴素贝叶斯法是基于贝叶斯公式的一个理论,若是能记住贝叶斯公式并对几率论能提早有一个大概的了解,会更利于理解朴素贝叶斯法。
朴素贝叶斯法在可以很好地解决多分类问题,可是因为它最大的缺点,即假设特征都是独立的,因此通常被用于文本分类,由于通常会认为单词与单词之间都是相互独立的。
下一篇将会介绍一个在深度学习流行以前在工业上最经常使用的分类器,即支持向量机。