1、二, 朴素贝叶斯学习器的原理说明根据前面的介绍,朴素贝叶斯学习器就是需要计算在已知气候的情况下,分别计算出打网球的概率和不打网球得概率,然后选择概率大者作为最终的学习(分类)结果。在这里,气候 weather 用四个属性表示,分别是 Outlook(天气)、Temperature(温度)、Humidity(湿度)和Wind(风强度)。先用贝叶斯公式表示为:称 vMAP 为在给定实例的属性值(weather 的各属性值)下,得到的最可能的目标值,也就是条件概率最大的值。其中 V=yes,no,也就是说 vM AP 为目标属性集 V 中各取值(yes 或 no)的概率最大的。朴素贝叶斯学习器即使根
2、据上面的公式推导而来。现在我们根据贝叶斯法则重写上面的公式:要作一些相应的假定,即给定目标值时,各属性值之间的相互条件独立。我们把 weather 用Outlook, Temperature , Humidity ,Wind表示,把式重写为:根据假定,给定目标值时,某气候下的概率就等于给定该目标值时各属性的概率的乘积:P(Outlook,Temperature,Humidity,Wind|vj) =P(Outlook|vj)*P(Temperature|Vj)*P(Humidity|vj)*P(Wind|vj)5把式带入式中就得到我们要求的朴素贝叶斯的表达式:三, 示例为了能更进一步了解朴素贝
3、叶斯学习的原理,我们用一个示例来加以说明。该示例用表1 中的数据作为训练样例,然后根据表达式 6 对测试样例进行朴素贝叶斯分类,测试样例如下:weather=Outlook=sunny,Temperature=cool,Humidity=high,Winds=strong;DayOutlookTemperatureHumidityWindPlayTennisDlSunnyHotHighWeakNoD2StrongD3OvercastYesD4RainMildD5CoolNormalD6D7D8D9Dl0Dl1Dl2Dl3Dl4表 1:朴素贝叶斯学习起使用的训练样例我们先计算 P(Vj)的值,V
4、j 有两个值,yes 和 no:P(yes)=9/14=0.643,P(no)=5/14=0.357。然后分别计算在目标属性为 yes 和 no 时,测试样例的各个属性的条件概率。注意,我们在计算各个属性的条件概率时,采用了 m-估计的方法计算。比如在计算 P(sunny|yes)(目标属性为 yes,Outlook 的属性值为 Sunny 的概率)时,按普通的计算方法:P(sunny|yes)=nc/n=2/9,nc=2 是在训练样例中目标属性为 yes 的条件下 Outlook=sunny的样例数,n=9 是训练样例中目标属性值为 yes 的样例数;但是按 m_估计的方法,计算出的概率是:
5、P(sunny|yes)=(nc+m*p)/(n+m)=(2+14*0.33)/(9+14),nc=2 和 n=9 代表的意思和上一样,m=14 代表训练样例总数,p=0.33 代表在属性 Outlook 下共有个属性值,所以这个先验概率就等于 1/3。选择 m-估计的原因是为了避免当训练样例数量较小时,训练样例中有可能没有测试样例中列出的某些属性值,也就是上面的 nc=0,如果按照普通的方法,采用公式nnc ,计算出的条件概率(比如 P(sunny|yes)就会等于,这样,根据式计算出的条件概率因为是相乘的nc +m p关系,其值也会为,这样就会出现对训练样例过拟合的情况。而 m-估计采用公
6、式 n+m 的形式,就可以避免出现过拟合的情况,m 取值一般为训练样例的总数,p 的值如果某个属性有k 个可能值,则 p=1/k,如上面 P(sunny|yes)中,因为 Outlook 有个可能值,所以 p=1/3。有了条件概率的计算公式,我们就可计算出式中的所有项的值:P(sunny|yes)=0.290;P(cool|yes)=0.333;P(high|yes)=0.435;P(strong|yes)=0.435;P(sunny|no)=0.403;P(cool|no)=0.298;P(high|no)=0.579;P(strong|no)=0.526;所以根据式:P(vj=yes)=P
7、(yes)* P(sunny|yes)* P(cool|yes)* P(high|yes)* P(strong|yes)=0.0117; P(vj=no)=P(no)* P(sunny|no)* P(cool|no)* P(high|no)* P(strong|no)=0.0131。所以,该测试样例的朴素贝叶斯分类结果为 PlayTennis=no,因条件概率 P(vj=no)大于条件概率 P(vj=yes)。如果把这两个概率进行归一化处理,则 P(vj=yes)=0.473,P(vj=no)=0.528。四, 朴素贝叶斯学习器代码朴素贝叶斯学习器的代码很简单,先训练样例统计各个属性的概率,然
8、后根据测试样例的各个属性值取出对应的概率,并相乘即可,测试结果如下:朴素贝叶斯学习器完整代码如下:/朴素贝叶斯学习器算法 C 语言代码实现/Copyright:wxh5055#include /天气类型 typedef enum _outlooksunny,overcast, rain_outlook;/温度类型 typedef enum _temperaturehot,mild, cool _temperature;/湿度类型 typedef enum _humidityhigh, normal_humidity;/风强度类型 typedef enum _windweak, strong_w
9、ind;/目标属性typedef enum _targetAttributeyes, no_targetAttribute;/训练实例#define TRAIN_NUM 14/定义 14 个训练实例#define ATTR_NUM 4/每个训练实例有 4 个属性int trainSampleATTR_NUM+1=sunny , hosunny, hot , high, strong, no ,/2overcast, hot , high, weak, yes,/3rain, mild, high, yes,/4, cool, normal, weak, yes,/5, cool, normal
10、, strong, no ,/6overcast, cool, normal, strong, yes,/7, no ,/8, yes,/9, mild, normal, weak, yes,/10, mild, normal, strong, yes,/11overcast, mild, high, strong, yes,/12overcast, hot , normal, weak, yes,/13, strong, no ,/14t , high , weak , no ,/1;/需要分类的新实例 int newSanpleATTR_NUM=sunny,cool,high,strong
11、;/m-估计的每个属性对应的先验概率 float prePATTR_NUM=(float)0.333,(float)0.333,(float)0.50,(float)0.50; /m-估计的 m 值等于训练样例数#define m TRAIN_NUM/计算训练样例集的正样本数和负样本数/输入训练样例集/输出训练样例集的正样本数和负样本数 void CalcPosAndNegNum(int *pPosNum,int *pNegNum)int i;/取出训练样例/先清 0 *pPosNum=0; *pNegNum=0;for(i=0;iTRAIN_NUM;i+)/trainSample 为训练样例
12、首地址,每个训练样本共有 ATTR_NUM 个属性/根据目标属性地址存储的 yes 或 no 值来增加 pPosNum 或 pNegNum if(trainSampleiATTR_NUM=yes)(*pPosNum)+;else(*pNegNum)+; return; /朴素贝叶斯学习器算法程序 void NaiveBayes(void) int i,j,cntY,cntN; /存储训练样例目标属性为yes和no的样本数 int posNum,negNum; /存储目标值yes和no的概率 float PVyes,PVno,PVyesTemp,PVnoTemp; /存储目标值为yes时需分类的
13、每个属性的概率 float PAttrYesATTR_NUM; /存储目标值为no时需分类的每个属性的概率 float PAttrNoATTR_NUM; /计算训练样例集的正样本数和负样本数 CalcPosAndNegNum(&posNum,&negNum); /计算目标值yes的概率 PVyes=(float)posNum/(float)TRAIN_NUM;/计算目标值no的概率 PVno=(float)negNum/(float)TRAIN_NUM; /计算目标值分别为yes和no时各个需分类属性对应的概率 for(j=0;jPVnoTemp) 所以实例被分类为:yesn);else non /主函数 int main(void) /调用朴素贝叶斯学习器算法 NaiveBayes(); return 1;