设P(A|B)表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。下面就是贝叶斯公式:
其中的符号定义为:
按这些术语,贝叶斯定理可表述为:后验概率=(相似度*先验概率)/标准化常量。简单的讲,贝叶斯定理是基于假设的先验概率,给定假设条件下,观察到不同数据的概率,提供一种计算后验概率的方法。
1、已知类条件概率密度参数表达式和先验概率。
2、利用贝叶斯公式转换成后验概率。
3、根据后验概率大小进行决策分类。
贝叶斯的这种基本思想可以在大量的实际案例中得到使用,因为很多现实社会中,积累了很多历史先验数据,想进行一些决策推理,也可以说是预测,就可以按照上面的步骤进行,当然贝叶斯理论的发展中,出现了很多新的推理算法,更加复杂,和面向不同的领域。一般来说,使用贝叶斯推理就是,预测某个事件下一次出现的概率,或者属于某些类别的概率,使用贝叶斯来进行分类的应用应该是最广泛的,很多实际的推理问题也可以转换为分类问题。下面将介绍一些贝叶斯理论的应用例子。
在人工智能领域,贝叶斯方法是一种非常有代表性的不确定性知识表示和推理方法。目前贝叶斯的应用非常广泛,如文本分类,问题分类,反垃圾邮件等等,根据问题特征因素的独立性可以分为:朴素贝叶斯和贝叶斯网络。
1.朴素贝叶斯的核心在于它假设向量的所有分量之间是独立的。(这一点在很多复杂的实际情况中都不太容易达到,各个因素直接可能都有一定的关联);
2.贝叶斯网络又叫概率因果网络或者知识图,是相对于朴素贝叶斯而言的。它是一种有方向的无环关系图;贝叶斯网络用图形来表示变量之间的连接个概率关系;它是为了解决不确定性问题和不完整性问题而提出的,在如文字处理,图像处理,决策支持等很多领域都得到广泛的应用。
注意:上述的推导有2个地方比较难懂,1个是把分母p(x)去掉了,应该好理解,分母都一样,比较的时候,直接比较分子就可以了。另外一个是为什么这个公式是成立的:
P(x|yi)=P(a1|yi)*P(a2|yi)*...*P(aj|yi)
这个公式的成立是因为各个属性a1,a2,..,aj都是独立的,才能成立。
根据上述原理,朴素贝叶斯分类主要分为三个阶段:1.准备阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。2.分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算。3.应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
至于贝叶斯的其他问题如估计类别下特殊属性划分的条件概率,以及分类器的评价问题,我认为对于初学者可以暂时跳过,等把基本流程理顺了,懂了,越到更多的问题后再回过头来反思后,按需学习。
对于SNS社区来说,不真实账号(使用虚假身份或用户的小号)是一个普遍存在的问题,作为SNS社区的运营商,希望可以检测出这些不真实账号,从而在一些运营分析报告中避免这些账号的干扰,亦可以加强对SNS社区的了解与监管。如果通过纯人工检测,需要耗费大量的人力,效率也十分低下,如能引入自动检测机制,必将大大提升工作效率。这个问题说白了,就是要将社区中所有账号在真实账号和不真实账号两个类别上进行分类。
下面我们一步一步的使用朴素贝叶斯实现这个过程。
1.首先设C=0表示真实账号,C=1表示不真实账号。其他例子中不一定只有2类,也可以是N个类别,只不过计算更复杂,要借助计算机和程序了。
2.找出可以区分真实与不真实账号的特征属性,实际应用中,特征属性的数量可能很多,划分也会更细致。作为例子,这里只用少量的特征属性以及较粗的划分,并对数据做了修改。同时我们也假设这3个属性是独立的,这是使用朴素贝叶斯的基本要求。
选择三个特征属性,在SNS社区中这三项是可以直接从数据库里得到的。粗略划分如下几个区间:
a1:日志数量/注册天数,划分:{a1<=0.05,0.05
a2:好友数量/注册天数,划分:{a2<=0.1,0.1
a3:是否使用真实头像。划分:{a3=0(不是),a3=1(是)}
使用1万个人工检测过的账号作为训练样本。我们根据上面特征属性的划分计算每个类别的频率以及各个类别在各个条件下的条件概率,以供后面的预测需要。
计算类别频率
P(C=0)=0.89;也就说这1万个人工检测过的帐号中,有89%是真实的
P(C=1)=0.11;人工检测的帐号中,有11%是不真实的
计算条件概率
1)计算已知C=0的条件下,a1属性属于不同划分类别的条件概率
P(a1<=0.05|C=0)=0.3;在帐号真实的情况下,日志数量/注册天数的值<=0.05的比例有30%
p(0.05 P(a1>=0.2|C=0)=0.2; 2)计算已知C=1的条件下,a1属性属于不同划分类别的条件概率 P(a1<=0.05|C=1)=0.8;在帐号不真实的情况下,日志数量/注册天数的值<=0.05的比例有80% p(0.05 P(a1>=0.2|C=1)=0.1; 3)计算已知C=0的条件下,a2属性属于不同划分类别的条件概率 P(a2<=0.1|C=0)=0.1; P(0.1 P(a2>=0.8|C=0)=0.2; 4)计算已知C=1的条件下,a2属性属于不同划分类别的条件概率 P(a2<=0.1|C=1)=0.7;不真实条件下的帐号,好友数量在这个范围是非常多的 P(0.1 P(a2>=0.8|C=1)=0.1; 5)计算已知C=0的条件下,a3属性属于不同划分类别的条件概率 P(a3=0|C=0)=0.2; P(a3=1|C=0)=0.8;真实帐号中,使用真实图像的比例是80% 6)计算已知C=1的条件下,a3属性属于不同划分类别的条件概率 P(a3=0|C=1)=0.9;不真实帐号中,使用不真实图像的比例是90% P(a3=1|C=1)=0.1; 上面这些数据从样本中可以直接统计得到。我也手动对几个条件概率进行了解释,我们假设还是比较符合真实情况的,虽然这个数据是原作者修正过的。 某帐号使用非真实头像,日志数量与注册天数的比率为0.1,好友数与注册天数的比率为0.2。这些数据是从该数据库直接获取的。 那么这个人的账户是真实账户还是不真实账户呢?相应的概率又有多少呢? 直接使用3.1节中的公式,我们计算在当前数据x发生的情况下,属于不同类别的概率,这里有2类,所以要计算一下2个东西: 要计算P(C=0|x)和P(C=1|x)的概率,然后比较大小,取最大值所在的类别就是我们分类的类别。当然我们不一定非要分类,而是可以将求出的概率提供给客户,作为一个参考值等等。而根据3.1节的推导,上述2个值的计算完整公式应该是下面这样的: P(C=0|x)=P(x|C=0)*P(C=0) =P(a1|C=0)*P(a2|C=0)*P(a3|C=0)*P(C=0)根据x的属性范围选择对应的概率 =P(0.05 =0.5*0.7*0.2*0.89=0.0623 同理: P(C=1|x)=P(0.05 =0.1*0.2*0.9*0.11=0.00198 所以根据属性结果和计算,当事件X发生时,属于C=0的概率要高得多,是C=1的30倍。因此我们有理由将这个帐号划分为真实帐号的范畴。 当然实际中的情况可能更加复杂,计算量也更加大,朴素贝叶斯不一定能很好的完成复杂的任务。但有些时候,我们将文件简化为朴素贝叶斯也能收获一些意外的东西。下面我们就来看将贝叶斯分类应用到足球彩票胜平负结果的预测中的情况。纯C#代码。欢迎支持。 关于足球彩票预测的几点说明: 1.本文分析的足球胜平负比赛的结果预测,采集的数据有近10年的全世界主要联赛; 2.足球彩票的预测方法各种各样,八仙过海各显神通,我这里也只是初步的测试,还有很多工作待完成,有没有完善的地方大家也不要急。 3.足球比赛的结果不仅与球队实力,状态,伤病,彩票,天气,还与场上的重大随机因素有关,因此想完成预测100%准确是一个不可能的任务,我们只是想在欧赔的概率基础上有少部分(5-10%)的提高,这样才可以做很多有意义的事情。 4.准确的说,足球比赛的很多因素都是有关联的,我也只是处于好奇,先使用了朴素贝叶斯来进行了一些工作,同时也在着手开始研究贝叶斯网络的预测方法,比较复杂,还在学习与堆码中。 5.1场足球比赛的基本要点有:主队,客队,比分,结果,至于辅助的因素有很多,如赛前的主客队积分,进球率,失球率,净胜球等等。 为了简单起见,我暂时只选取2个属性:主客队总积分的差;主队主场积分与客队客场积分的差;结果有胜平负3种类别,分别记为(3,1,0)。属性集的划分我们在程序中动态获取,这样可以计算各种不同划分的准确率,更加方便,这和上面的例子是不一样的。当然上面的例子也可以这样做,只是一个小的技巧而已。 在这个测试过程中,我们是选取前N轮的比赛场次数据,然后对后M轮的结果进行预测。所有首先要从数据库获取贝叶斯的训练数据,看代码: 1/// 1.几个基本的属性。注意字典存储条件概率,直接全部计算,对数据量大的情况,可能会吃不消,应该按需计算比较好。不过这里是测试,无所谓了。先看看效果才行。 预测的过程也和第2节的例子一样,只不过是程序化了。预测的方法是每次一条记录的数据,并计算属于每一类的概率,所以返回的是一个字典,key为类别,value为概率。具体方法如下所示: 1/// 基本过程和代码完成了,我们采集5大联赛(西甲,德甲,英超,意甲,法甲)的数据进行测试,看看贝叶斯预测算法的准确性如何。测试的核心代码如下: 我们可以看到,针对不同的划分集,指数1的准确率都超过了57%,比正常的欧赔指数45-50%,高出了5-10%。结果还是比较可观的。但是我们也看到指数3的比例都有22%,说明对于一些特别冷门的场次,算法还是做不到,这些特殊情况不是简单2个因素就可以左右的,因此还有待对模型更深一步的研究,找出这些特别冷门场次的一些共同因素,从而进行一定程度的防范,减少指数3的比例,从而提高指数1,2的比例。 2.同时,我们对上一步的测试方法进行了一定的更改,将预测结果和欧赔bet365指数1结果一致的比赛拿出来进行统计;将预测结果和欧赔bet365指数1,2结果一致的比赛进行统计: 同样是上述481场比赛进行筛选和属性划分,我们对实际的准确率进行比较: 通过结合欧赔指数,进行一定的过滤后,预测的整理准确率有了一定的提高。这个结果还是很理想的,懂的人应该知道里面的含义。所以贝叶斯理论的确是非常强大,当然这里只采用了2个因素,而且本身是关联的,但实际中没有考虑关联性,看成了朴素贝叶斯,必定会对问题结果产生一定的影响。这和我解决问题的思路有关系,先简单,后复杂,逐步过渡,延伸。。 1.在博客正文加上本文的链接,当然部分网站会无良的把所有链接给去掉,但可以防范部分,另外水印这些也有点用,只是比较麻烦,懒得搞