朴素贝叶斯(Naive Bayesian algorithm)学习是机器学习中的一个重要的部分。本文主要对贝叶斯的公式推导做了一个详细的探究,了解朴素贝叶斯算法的原理, 并对算法的计算复杂度做了一个简单的分析。
初学者对于这个模型可能有一堆疑问,包括但不限于:
* 如何理解贝叶斯概率模型。
* 这个是如何训练的,计算量大小和哪些因素有关。
* 有哪些好的关于贝叶斯模型的实战案例。
* 由于从事安全方向,思考一下如何将贝叶斯模型应用于安全模型的检测。
通过“类别”推算出“类别特征”发生的的概率的方法叫作“似然度”。这里的似然就是“可能性”的意思。
O为观察结果,θ为描述随机过程的参数集(即表示导致观察结果O的特征集合)。
当θ已知,O未知时,P(O|θ)可称为概率函数(Probability Function);
而当θ未知,O已知时,P(O|θ)可称为似然函数(Likelihood Function)或似然度。
贝叶斯定理就是求解后验概率的过程,而核心方法是通过似然度预测后验概率,通过不断提高似然度,自然也就达到了提高后验概率的目的。
对应举例:
条件概率公式是这样:
P(AB)=P(A)P(B|A)=P(B)P(A|B)
可以推导为贝叶斯公式:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)= \frac {P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
和机器学习的模型对应起来可以等同于下列公式,便于理解:
P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) P ( 类别 ) P ( 特征 ) P(类别|特征)= \frac {P(特征|类别)P(类别)}{P(特征)} P(类别∣特征)=P(特征)P(特征∣类别)P(类别)
这个是贝叶斯公式的输出值, 对应机器学习中的场景是: 如果我们知道了西瓜的各个特征,判断这个瓜是否熟了。
特征是有多个的, 可以用F1,…,Fn表示, 公式对应转化为:
P ( C ∣ F 1 , . . . , F n ) = P ( F 1 , . . . , F n ∣ C ) P ( C ) P ( F 1 , . . . , F n ) P(C|F1,...,Fn)= \frac {P(F1,...,Fn|C)P(C)}{P(F1,...,Fn)} P(C∣F1,...,Fn)=P(F1,...,Fn)P(F1,...,Fn∣C)P(C)
如果上述的公式可以计算,那么我们每个类别的概率都计算出来,选一个概率最大的类别就是预测的结果啦。其中P(F1,…,Fn)就看作常数不计算了。
那么计算过程就可以演变为下面这样:
我想求已知特征情况下的类别概率结果:
P ( C ∣ F 1 , . . . , F n ) P(C|F1,...,Fn) P(C∣F1,...,Fn)
就要求(可以忽略分母):
P ( C ) P ( F 1 , . . . , F n ∣ C ) {P(C)P(F1,...,Fn|C)} P(C)P(F1,...,Fn∣C)
其中:(根据条件概率公式可得)
P(F1,…,Fn|C)
= P((F1|C),(F2,…,Fn|C))
= P(F1|C) * P(F2,…,Fn|C,F1)
= P(F1|C) * P(F2|C,F1) * P(F3| C,F1,F2)…(Fn|C,F1,F2,…,Fn-1)
就要求:
结果 = P ( C ) P ( F 1 ∣ C ) ∗ P ( F 2 ∣ C , F 1 ) ∗ P ( F 3 ∣ C , F 1 , F 2 ) . . . ( F n ∣ C , F 1 , F 2 , . . . , F n − 1 ) 结果={P(C) P(F1|C) * P(F2|C,F1) * P(F3| C,F1,F2)...(Fn|C,F1,F2,...,Fn-1)} 结果=P(C)P(F1∣C)∗P(F2∣C,F1)∗P(F3∣C,F1,F2)...(Fn∣C,F1,F2,...,Fn−1)
上面这个公式计算起来还是比较复杂的, 但是,“朴素”的条件独立假设开始发挥作用了,由于朴素贝叶斯假定所有特征相互独立, 公式就可以简化为
结果 = P ( C ) P ( F 1 ∣ C ) ∗ P ( F 2 ∣ C ) ∗ P ( F 3 ∣ C ) . . . ( F n ∣ C ) 结果={P(C) P(F1|C) * P(F2|C) * P(F3| C)...(Fn|C)} 结果=P(C)P(F1∣C)∗P(F2∣C)∗P(F3∣C)...(Fn∣C)
由此,分类器就得出来了:
通过朴素贝叶斯算法,计算每个类别的概率, 取最大的概率对应的类别,即为结果。
对于分母P(B)的理解:
上面已经提到, 在多分类情况下, 分母都是一样的, 可以看作一个固定值, 因此每个分类的概率的比较可以不考虑分母。
但是, 如果想让所有分类的概率相加起来都等于1的话,可以计算分母的值,如果计算呢?
也研究搜索了一下:
分母的值是一个和,可以表示如下,其中Ci表示类别, 所有类别都计算一次求和。
P ( C 1 ) P ( F 1 , . . . , F n ∣ C 1 ) + P ( C 2 ) P ( F 1 , . . . , F n ∣ C 2 ) + . . . {P(C_1)P(F1,...,Fn|C_1) + P(C_2)P(F1,...,Fn|C_2) + ...} P(C1)P(F1,...,Fn∣C1)+P(C2)P(F1,...,Fn∣C2)+...
每次计算都需要全量遍历一下数据集合的所有元素, 计算量与数据量成正比。一些数据可以提前计算好, 等预测的时候,可以直接拿过来用,比如某个类别的某个特征的比例。
个人理解离散情况下大概的时间复杂度是:
类别个数 * 特征个数 * 每个特征的情况个数
这个算法在安全的应用有,后续会整理案例。
学习这个知识点, 需要参考一些好的资料,网络上的资料质量参差不齐, 找到了几个比较好的参考文档。
http://c.biancheng.net/ml_alg/bayes-theorem.html
这篇文章,例子讲的不太清晰, 没怎么看懂。
知乎上的参考资料:
https://zhuanlan.zhihu.com/p/37575364
这篇文章主要对贝叶斯的公式推导做了一个详细的探究,了解朴素贝叶斯算法的原理, 并对算法的计算复杂度做了一个简单的分析。