白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现

贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务。概率推理是与确定性推理相对应的。而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概4英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换而言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够取得相当好的效果。我们先看看一个简单的例子,这里要特别感谢博客园网友:leoo2sk,因为这一节的内容和例子基本都来自他的这篇关于朴素贝叶斯分类器的简单介绍的文章:文章链接,只不过我整理了一下,鉴于文章编辑不方便,我在word中编辑好了,截图上来:

白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现

注意:上述的推导有2个地方比较难懂,1个是把分母p(x)去掉了,应该好理解,分母都一样,比较的时候,直接比较分子就可以了。另外一个是为什么这个公式是成立的: P(x|yi) = P(a1|yi)*P(a2|yi)*...*P(aj|yi) 这个公式的成立是因为各个属性a1,a2,..,aj都是独立的,才能成立。 根据上述原理,朴素贝叶斯分类主要分为三个阶段: 1.准备阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。 2.分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算。 3.应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。   至于贝叶斯的其他问题如 估计类别下特殊属性划分的条件概率,以及分类器的评价问题,我认为对于初学者可以暂时跳过,等把基本流程理顺了,懂了,越到更多的问题后再回过头来反思后,按需学习。   这个例子完全取自于博客园网友:leoo2sk,的文章“算法杂货铺——分类算法之朴素贝叶斯分类”,因为这个例子很短,而且有现成数据,手动计算量很小,所以我认为非常适合在这里使用。所以冒昧借用一下,同时3.3节中,我会介绍一个更加复杂的朴素贝叶斯分类器的代码。这个例子适合入门,而且最好是动手拿笔在纸上画一画,这样更容易理解,光看公式和数据虽然简单,但未必能了解整个过程,要想自己写出类似的代码,这个过程还是要清楚的,至少我是这么过来的。看看SNS社区不真实帐号问题   对于SNS社区来说,不真实账号(使用虚假身份或用户的小号)是一个普遍存在的问题,作为SNS社区的运营商,希望可以检测出这些不真实账号,从而在一些运营分析报告中避免这些账号的干扰,亦可以加强对SNS社区的了解与监管。如果通过纯人工检测,需要耗费大量的人力,效率也十分低下,如能引入自动检测机制,必将大大提升工作效率。这个问题说白了,就是要将社区中所有账号在真实账号和不真实账号两个类别上进行分类。   下面我们一步一步的使用朴素贝叶斯实现这个过程。 1.首先设C=0表示真实账号,C=1表示不真实账号。其他例子中不一定只有2类,也可以是N个类别,只不过计算更复杂,要借助计算机和程序了。 2.找出可以区分真实与不真实账号的特征属性,实际应用中,特征属性的数量可能很多,划分也会更细致。作为例子,这里只用少量的特征属性以及较粗的划分,并对数据做了修改。同时我们也假设这3个属性是独立的,这是使用朴素贝叶斯的基本要求。 选择三个特征属性,在SNS社区中这三项是可以直接从数据库里得到的。粗略划分如下几个区间: a1:日志数量/注册天数,划分:{a1<=0.05, 0.05=0.2} a2:好友数量/注册天数,划分:{a2<=0.1, 0.1=0.8} 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=0.2 | C=0) = 0.2 ; 2)计算已知C=1的条件下,a1属性属于不同划分类别的条件概率 P( a1<=0.05| C=1) = 0.8 ; 在帐号不真实的情况下,日志数量/注册天数的值<=0.05的比例有80% p(0.05=0.2 | C=1) = 0.1 ; 3)计算已知C=0的条件下,a2属性属于不同划分类别的条件概率 P( a2 <= 0.1 | C=0) = 0.1 ; P( 0.1= 0.8 | C=0) = 0.2 ; 4)计算已知C=1的条件下,a2属性属于不同划分类别的条件概率 P( a2 <= 0.1 | C=1) = 0.7 ;不真实条件下的帐号,好友数量在这个范围是非常多的 P( 0.1= 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