在全部的机器学习分类算法中,朴素贝叶斯和其余绝大多数的分类算法都不一样。对于大多数的分类算法,好比决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数\(Y=f(X)\),要么是条件分布\(P(Y|X)\)。可是朴素贝叶斯倒是生成方法,也就是直接找出特征输出Y和特征X的联合分布\(P(X,Y)\),而后用\(P(Y|X) = P(X,Y)/P(X)\)得出。算法
朴素贝叶斯很直观,计算量也不大,在不少领域有普遍的应用,这里咱们就对朴素贝叶斯算法原理作一个小结。微信
在了解朴素贝叶斯的算法以前,咱们须要对相关必须的统计学知识作一个回顾。机器学习
贝叶斯学派很古老,可是从诞生到一百年前一直不是主流。主流是频率学派。频率学派的权威皮尔逊和费歇尔都对贝叶斯学派不屑一顾,可是贝叶斯学派硬是凭借在现代特定领域的出色应用表现为本身赢得了半壁江山。函数
贝叶斯学派的思想能够归纳为先验几率+数据=后验几率。也就是说咱们在实际问题中须要获得的后验几率,能够经过先验几率和数据一块儿综合获得。数据你们好理解,被频率学派攻击的是先验几率,通常来讲先验几率就是咱们对于数据所在领域的历史经验,可是这个经验经常难以量化或者模型化,因而贝叶斯学派大胆的假设先验分布的模型,好比正态分布,beta分布等。这个假设通常没有特定的依据,所以一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,可是在不少实际应用中,贝叶斯理论很好用,好比垃圾邮件分类,文本分类。性能
咱们先看看条件独立公式,若是X和Y相互独立,则有:学习
\[ P(X,Y) =P(X)P(Y) \]测试
咱们接着看看条件几率公式:spa
\[ P(Y|X) = P(X,Y)/P(X) \]code
\[ P(X|Y) = P(X,Y)/P(Y) \]内存
或者说:
\[ P(Y|X) = P(X|Y)P(Y)/P(X) \]
接着看看全几率公式
\[ P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1 \]
从上面的公式很容易得出贝叶斯公式:
\[ P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)} \]
从统计学知识回到咱们的数据分析。假如咱们的分类模型样本是:
\[ (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m) \]
即咱们有m个样本,每一个样本有n个特征,特征输出有K个类别,定义为\({C_1,C_2,...,C_K}\)。
从样本咱们能够学习获得朴素贝叶斯的先验分布\(P(Y=C_k)(k=1,2,...K)\),接着学习到条件几率分布\(P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)\),而后咱们就能够用贝叶斯公式获得X和Y的联合分布P(X,Y)了。联合分布P(X,Y)定义为:
\[ \begin{align} P(X,Y=C_k) &= P(Y=C_k)P(X=x|Y=C_k) \\&= P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \end{align} \]
从上面的式子能够看出$ P(Y=C_k)\(比较容易经过最大似然法求出,获得的\) P(Y=C_k)\(就是类别\)C_k\(在训练集里面出现的频数。可是\)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里作了一个大胆的假设,即X的n个维度之间相互独立,这样就能够得出:
\[ P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k) \]
从上式能够看出,这个很难的条件分布大大的简化了,可是这也可能带来预测的不许确性。你会说若是个人特征之间很是不独立怎么办?若是真是很是不独立的话,那就尽可能不要使用朴素贝叶斯模型了,考虑使用其余的分类方法比较好。可是通常状况下,样本的特征之间独立这个条件的确是弱成立的,尤为是数据量很是大的时候。虽然咱们牺牲了准确性,可是获得的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。
最后回到咱们要解决的问题,咱们的问题是给定测试集的一个新样本特征\((x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}\),咱们如何判断它属于哪一个类型?
既然是贝叶斯模型,固然是后验几率最大化来判断分类了。咱们只要计算出全部的K个条件几率\(P(Y=C_k|X=X^{(test)})\),而后找出最大的条件几率对应的类别,这就是朴素贝叶斯的预测了。
上节咱们已经对朴素贝叶斯的模型也预测方法作了一个大概的解释,这里咱们对朴素贝叶斯的推断过程作一个完整的诠释过程。
咱们预测的类别\(C_{result}\)是使\(P(Y=C_k|X=X^{(test)})\)最大化的类别,数学表达式为:
\[ \begin{align} C_{result} & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align} \]
因为对于全部的类别计算\(P(Y=C_k|X=X^{(test)})\)时,上式的分母是同样的,都是\(P(X=X^{(test)}\),所以,咱们的预测公式能够简化为:
\[ C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \]
接着咱们利用朴素贝叶斯的独立性假设,就能够获得一般意义上的朴素贝叶斯推断公式:
\[ C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) \]
在上一节中,咱们知道只要求出\(P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)\),咱们经过比较就能够获得朴素贝叶斯的推断结果。这一节咱们就讨论怎么经过训练集计算这两个几率。
对于\(P(Y=C_k)\),比较简单,经过极大似然估计咱们很容易获得\(P(Y=C_k)\)为样本类别\(C_k\)出现的频率,即样本类别\(C_k\)出现的次数\(m_k\)除以样本总数m。
对于\(P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)\),这个取决于咱们的先验条件:
a) 若是咱们的\(X_j\)是离散的值,那么咱们能够假设\(X_j\)符合多项式分布,这样获得\(P(X_j=X_j^{(test)}|Y=C_k)\) 是在样本类别\(C_k\)中,特征\(X_j^{(test)}\)出现的频率。即:
\[ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k} \]
其中\(m_k\)为样本类别\(C_k\)总的特征计数,而\(m_{kj^{test}}\)为类别为\(C_k\)的样本中,第j维特征\(X_j^{(test)}\)出现的计数。
某些时候,可能某些类别在样本中没有出现,这样可能致使\(P(X_j=X_j^{(test)}|Y=C_k)\)为0,这样会影响后验的估计,为了解决这种状况,咱们引入了拉普拉斯平滑,即此时有:
\[ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda} \]
其中\(\lambda\) 为一个大于0的常数,经常取为1。\(O_j\)为第j个特征的取值个数。
b)若是咱们咱们的\(X_j\)是很是稀疏的离散值,即各个特征出现几率很低,这时咱们能够假设\(X_j\)符合伯努利分布,即特征\(X_j\)出现记为1,不出现记为0。即只要\(X_j\)出现便可,咱们不关注\(X_j\)的次数。这样获得\(P(X_j=X_j^{(test)}|Y=C_k)\) 是在样本类别\(C_k\)中,\(X_j^{(test)}\)出现的频率。此时有:
\[ P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)}) \]
其中,\(X_j^{(test)}\)取值为0和1。
c)若是咱们咱们的\(X_j\)是连续值,咱们一般取\(X_j\)的先验几率为正态分布,即在样本类别\(C_k\)中,\(X_j\)的值符合正态分布。这样\(P(X_j=X_j^{(test)}|Y=C_k)\)的几率分布是:
\[ P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^2}\Bigg{)} \]
其中\(\mu_k和\sigma_k^2\)是正态分布的指望和方差,能够经过极大似然估计求得。\(\mu_k\)为在样本类别\(C_k\)中,全部\(X_j\)的平均值。\(\sigma_k^2\)为在样本类别\(C_k\)中,全部\(X_j\)的方差。对于一个连续的样本值,带入正态分布的公式,就能够求出几率分布了。
咱们假设训练集为m个样本n个维度,以下:
\[ (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m) \]
共有K个特征输出类别,分别为\({C_1,C_2,...,C_K}\),每一个特征输出类别的样本个数为\({m_1,m_2,...,m_K}\),在第k个类别中,若是是离散特征,则特征\(X_j\)各个类别取值为\(m_{jl}\)。其中l取值为\(1,2,...S_j\),\(S_j\)为特征j不一样的取值数。
输出为实例\(X^{(test)}\)的分类。
算法流程以下:
1) 若是没有Y的先验几率,则计算Y的K个先验几率:\(P(Y=C_k) = (m_k+\lambda)/(m+K\lambda)\),不然\(P(Y=C_k)\)为输入的先验几率。
2) 分别计算第k个类别的第j维特征的第l个个取值条件几率:\(P(X_j=x_{jl}|Y=C_k)\)
a)若是是离散值:
\[ P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda} \]
\(\lambda\)能够取值为1,或者其余大于0的数字。
b)若是是稀疏二项离散值:
\[ P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) \]
此时\(l\)只有两种取值。
c)若是是连续值不须要计算各个l的取值几率,直接求正态分布的参数:
\[ P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}\Bigg{)} \]
须要求出\(\mu_k和\sigma_k^2\)。 \(\mu_k\)为在样本类别\(C_k\)中,全部\(X_j\)的平均值。\(\sigma_k^2\)为在样本类别\(C_k\)中,全部\(X_j\)的方差。
3)对于实例\(X^{(test)}\),分别计算:
\[ P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) \]
4)肯定实例\(X^{(test)}\)的分类\(C_{result}\)
\[ C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) \]
从上面的计算能够看出,没有复杂的求导和矩阵运算,所以效率很高。
朴素贝叶斯算法的主要原理基本已经作了总结,这里对朴素贝叶斯的优缺点作一个总结。
朴素贝叶斯的主要优势有:
1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤为是数据量超出内存时,咱们能够一批批的去增量训练。
3)对缺失数据不太敏感,算法也比较简单,经常使用于文本分类。
朴素贝叶斯的主要缺点有:
1) 理论上,朴素贝叶斯模型与其余分类方法相比具备最小的偏差率。可是实际上并不是老是如此,这是由于朴素贝叶斯模型给定输出类别的状况下,假设属性之间相互独立,这个假设在实际应用中每每是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果很差。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法经过考虑部分关联性适度改进。
2)须要知道先验几率,且先验几率不少时候取决于假设,假设的模型能够有不少种,所以在某些时候会因为假设的先验模型的缘由致使预测效果不佳。
3)因为咱们是经过先验和数据来决定后验的几率从而决定分类,因此分类决策存在必定的错误率。
4)对输入数据的表达形式很敏感。 以上就是朴素贝叶斯算法的一个总结,但愿能够帮到朋友们。 (欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121) ```