出现背景:
在贝叶斯公式出现之前,人们只会解决正向概率问题,即“假如一个袋子里有5个白球,3个黑球。现从中摸一个球,取得白球的概率。”实际上,这是从上帝视角来看待问题,在实际生活中的用途并不大。
而贝叶斯公式要解决的是逆向概率问题,即“袋子里白球和黑球两种颜色的球的个数是未知的,现从中多次摸球,推断袋中两种颜色的球各有多少。”这就很符合实际生活中的场景,站在“普通人的角度”一步步解决问题。当然,也可以细心的发现这很符合机器学习的思想,因为很明显,摸球的次数会决定推断的准确性,而一次次的摸球实际上就是一个学习的过程。而解决这个逆向概率问题的算法就是贝叶斯算法。
相关公式:
条件概率:
贝叶斯公式:
全概率公式:
朴素贝叶斯公式:
原理及大致流程:
贝叶斯定理
之前有一门概率论课程,已经学习过贝叶斯定理,但是当时学习的时候没有考虑到它的应用,只知道在机器学习中很有用。现在看着这道题目,再回头重新理解贝叶斯定理。在这之前,首先介绍两个概念:先验概率和后验概率。
先验概率:指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现(公式中的P(B)即为先验概率)。
后验概率:指依据得到"结果"信息所计算出的最有可能是那种事件发生,如贝叶斯公式中的,是"执果寻因"问题中的"因"(公式中的P(B|A)即为后验概率)。
因此实际上先验概率就是利用以往的数据通过古典概率模型加以定义的,较为容易计算得到结果。而后验概率则需要使用贝叶斯公式。
从另一个角度理解的话,就是实际上如果没有大量数据的话,我们只知道先验概率P(B),而作为机器学习算法,贝叶斯算法可以通过大量的样本A,通过判断P(A|B)/P(A)是否大于1,来对P(B)进行修正,即B的条件下A发生的概率大于A本身发生的概率,那么就认为A的条件下B发生的概率大于B本身的概率,当然,这是根据公式严密的推导得到的。
得到贝叶斯算法后,进一步考虑这个公式,A是结果B发生的一个条件,或者说是样本的一个特征,而样本的特征往往不是一维的,比如决策一个人是否健康的标准,特征可能会有“身高,体重,肺活量,血压…”多维变量,若用Ai表示其中的n个特征中的每个标签,则贝叶斯公式分子中的P(A|B)便需要计算结果B发生的条件下这n个标签同时发生的概率,在这里假设n=2,则公式为
朴素贝叶斯
当n的值较大时,计算P(A1,A2,…An|Bi)的难度是很大的,此时便需要用到很重要的一个假设:假设这n个标签是相互独立的。这样假设的目的是简化计算,因为可以化成单标签概率的乘积。但假设是需要前提的,即不同的标签是不一定独立的,甚至大多数时候都是不独立的。尽管如此,事实上这样的独立假设产生的效果是很好的。而这也是朴素贝叶斯中的“朴素”二字的由来。经过这样的假设以后,得到的式子便是上面的朴素贝叶斯公式。
拉普拉斯平滑
但是不能忽视的一点是如果P(Ai|B)或者P(Bi)的值为0该如何,按照公式我们会得到P(Bi|A)=0的结果,即下结论为“这种情况下Bi绝不可能发生”,然而这样貌似是不准确的,比如实际生活中,假如国足连输了10场,如果我们用这10场数据应用朴素贝叶斯公式,会发现预测第11场胜利的概率为0,但这个说法未免过于绝对。因此,我们引入了一种方法,叫做拉普拉斯平滑,它在每个标签的条件概率计算时分子加1,分母加上标签分量个数。这样做正确的依据是当数据量很大时,加的值几乎可以忽略,同时还可以避免分子为0的情况。
结论
最终,贝叶斯算法要得到的是使得P(Bj|A)最大的j,此时可以负责任的说“Bj”是最有可能发生的。
应用
题目
(中文请自行翻译)
思路
这个题目中,给定了训练数据集和测试数据集,要求利用训练数据集的数据来应用到测试数据集中,对孩子是否应该入学进行不同等级的划分。这里我们抽象出上面的A和B:最终判断孩子是否应该入学的5个等级即为B,而其中的特征向量便是A,每个特征向量是一个包含8个标签的Ai,我们要做的就是基于训练数据,对于测试数据中的每个特征向量,找到P(Bj|A)(j=1,…,5)中使得概率最大的j,Bj即为最终要做出的判断。由于此题中的所有数据均是离散的,并不是连续数据,因此不需要考虑概率分布问题,只需要统计数据即可。我们可以根据数据集很容易的统计出P(Bj)的值,当然,这里需要加入拉普拉斯平滑;同时也可以得到P(Ai|Bj)的值(根据条件概率的公式得到)。这样分子就可以通过数据集统计得到,而针对一个特征向量,需要比较的不同的Bj中,分母的P(A)是完全相同的,因此可以只通过比较分子来判断即可。
解题步骤(这里使用matlab实现)
- 导入训练数据和测试数据集。
- 借助拉普拉斯平滑计算P(Bj)。
for i=1:5
p_y(i)=(length(find(train_data(:,9)==i-1))+1)/(length(train_data)+5);%应用拉普拉斯平滑
- 计算测试集中每一行的特征向量A对应的P(A|Bj),并找出其中最大的概率,记录此时的概率之和Bj。
for i=1:1:length(test_data)
max=zeros(1,2);%保存
for y=0:1:4
a=1;
for t=1:8
b=length(find(train_data(