机器学习朴素贝叶斯学习原理分析与C语言代码实现.docx
- 文档编号:4096193
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:13
- 大小:43.70KB
机器学习朴素贝叶斯学习原理分析与C语言代码实现.docx
《机器学习朴素贝叶斯学习原理分析与C语言代码实现.docx》由会员分享,可在线阅读,更多相关《机器学习朴素贝叶斯学习原理分析与C语言代码实现.docx(13页珍藏版)》请在冰点文库上搜索。
机器学习朴素贝叶斯学习原理分析与C语言代码实现
数据挖掘课程大作业
题目:
机器学习-朴素贝叶斯
班级:
信管2014-2班
指导教师:
汪传建
日期:
2017年11月21日
机器学习-朴素贝叶斯学习
原理分析与C语言代码实现
一,任务介绍
本文介绍朴素贝叶斯学习的基本原理以及其算法实现的C语言代码。
朴素贝叶斯学习也叫朴素贝叶斯分类器,它是根据贝叶斯法则进行学习的一种算法。
贝
叶斯法则是条件概率相互计算的法则,即在已知P(A|B)的情况下怎么计算P(B|A)。
P(A|B)是
条件概率,表示在条件B成立的条件下条件A发生的概率,贝叶斯法则的表达式如下:
即在条件A成立的条件下条件B发生的概率,等于条件B成立的条件下条件A发生的概率,乘以条件B发生的概率,再除以条件A发生的概率。
朴素贝叶斯学习器(分类器)就是需要计算在某个样例条件下,计算每个目标属性项发生的概率,然后选出概率最大的目标属性。
举例说明,假设现在我们在已知某一天气候的情况
下(用weather表示),需要确定是否打网球(用yes和no表示)。
朴素贝叶斯分类器就是要计算在已知weather的条件下,打网球的概率P(yes|weather)和P(no|weather),如果前者大于后者,就去打网球,否则就不去打网球。
二,朴素贝叶斯学习器的原理说明
根据前面的介绍,朴素贝叶斯学习器就是需要计算在已知气候的情况下,分别计算出打
网球的概率和不打网球得概率,然后选择概率大者作为最终的学习(分类)结果。
在这里,气
候weather用四个属性表示,分别是Outlook(天气)、Temperature(温度)、Humidity(湿度)和
Wind(风强度)。
先用贝叶斯公式表示为:
称vMAP为在给定实例的属性值(weather的各属性值)下,得到的最可能的目标值,也就是条件概率最大的值。
其中V={yes,no},也就是说vMAP为目标属性集V中各取值(yes或no)
的概率最大的。
朴素贝叶斯学习器即使根据上面的公式推导而来。
现在我们根据贝叶斯法则重写上面的公式:
要作一些相应的假定,即给定目标值时,各属性值之间的相互条件独立。
我们把weather用{Outlook,Temperature,Humidity,Wind}表示,把式3重写为:
根据假定,给定目标值时,某气候下的概率就等于给定该目标值时各属性的概率的乘积:
P(Outlook,Temperature,Humidity,Wind|vj)=P(Outlook|vj)*P(Temperature|Vj)*P(Humidity|vj)*P(Wind|vj)……………………………5
把式5带入式4中就得到我们要求的朴素贝叶斯的表达式:
三,示例
为了能更进一步了解朴素贝叶斯学习的原理,我们用一个示例来加以说明。
该示例用表
1中的数据作为训练样例,然后根据表达式6对测试样例进行朴素贝叶斯分类,测试样例如
下:
weather={Outlook=sunny,Temperature=cool,Humidity=high,Winds=strong};
Day
Outlook
Temperature
Humidity
Wind
PlayTennis
Dl
Sunny
Hot
High
Weak
No
D2
Sunny
Hot
High
Strong
No
D3
Overcast
Hot
High
Weak
Yes
D4
Rain
Mild
High
Weak
Yes
D5
Rain
Cool
Normal
Weak
Yes
D6
Rain
Cool
Normal
Strong
No
D7
Overcast
Cool
Normal
Strong
Yes
D8
Sunny
Mild
High
Weak
No
D9
Sunny
Cool
Normal
Weak
Yes
Dl0
Rain
Mild
Normal
Weak
Yes
Dl1
Sunny
Mild
Normal
Strong
Yes
Dl2
Overcast
Mild
High
Strong
Yes
Dl3
Overcast
Hot
Normal
Weak
Yes
Dl4
Rain
Mild
High
Strong
No
表1:
朴素贝叶斯学习起使用的训练样例
我们先计算P(Vj)的值,Vj有两个值,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_估计的方法,计算出的概率是:
P(sunny|yes)=(nc+m*p)/(n+m)=(2+14*0.33)/(9+14),nc=2和n=9代表的意思和上一样,
m=14代表训练样例总数,p=0.33代表在属性Outlook下共有3个属性值,所以这个先验概
率就等于1/3。
选择m-估计的原因是为了避免当训练样例数量较小时,训练样例中有可能没有测试样
例中列出的某些属性值,也就是上面的nc=0,如果按照普通的方法,采用公式nnc,计算出的
条件概率(比如P(sunny|yes))就会等于0,这样,根据式6计算出的条件概率因为是相乘的
nc+m∗p
关系,其值也会为0,这样就会出现对训练样例过拟合的情况。
而m-估计采用公式n+m的
形式,就可以避免出现过拟合的情况,m取值一般为训练样例的总数,p的值如果某个属性
有k个可能值,则p=1/k,如上面P(sunny|yes)中,因为Outlook有3个可能值,所以p=1/3。
有了条件概率的计算公式,我们就可计算出式6中的所有项的值:
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;
所以根据式6:
P(vj=yes)=P(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。
四,朴素贝叶斯学习器代码
朴素贝叶斯学习器的代码很简单,先训练样例统计各个属性的概率,然后根据测试样例的各个属性值取出对应的概率,并相乘即可,测试结果如下:
朴素贝叶斯学习器完整代码如下:
//朴素贝叶斯学习器算法C语言代码实现
//Copyright:
wxh5055
#include
//天气类型typedefenum_outlook
{
sunny,
overcast,rain
}_outlook;
//温度类型typedefenum_temperature
{
hot,
mild,cool}_temperature;
//湿度类型typedefenum_humidity
{
high,normal
}_humidity;
//风强度类型typedefenum_wind
{
weak,strong
}_wind;
//目标属性
typedefenum_targetAttribute
{
yes,no
}_targetAttribute;
//训练实例
#defineTRAIN_NUM14//定义14个训练实例
#defineATTR_NUM4//每个训练实例有4个属性
inttrainSample[][ATTR_NUM+1]={
{sunny,ho
{sunny
hot,high
strong,no},//2
{overcast,hot,high
weak
yes},//3
{rain
mild,high
weak
yes},//4
{rain
cool,normal,weak
yes},//5
{rain
cool,normal,strong,no},//6
{overcast,cool,normal,strong,yes},//7
{sunny
mild,high
weak
no},//8
{sunny
cool,normal,weak
yes},//9
{rain
mild,normal,weak
yes},//10
{sunny
mild,normal,strong,yes},//11
{overcast,mild,high
strong,yes},//12
{overcast,hot,normal,weak
yes},//13
{rain
mild,high
strong,no},//14
t,high,weak,no},//1
};
//需要分类的新实例intnewSanple[ATTR_NUM]={sunny,cool,high,strong};
//m-估计的每个属性对应的先验概率floatpreP[ATTR_NUM]={(float)0.333,(float)0.333,(float)0.50,(float)0.50};//m-估计的m值等于训练样例数
#definemTRAIN_NUM
//计算训练样例集的正样本数和负样本数//输入训练样例集
//输出训练样例集的正样本数和负样本数voidCalcPosAndNegNum(int*pPosNum,int*pNegNum)
{
inti;
//取出训练样例
//先清0*pPosNum=0;*pNegNum=0;
for(i=0;i { //trainSample为训练样例首地址,每个训练样本共有ATTR_NUM个属性//根据目标属性地址存储的yes或no值来增加pPosNum或pNegNumif(trainSample[i][ATTR_NUM]==yes) { (*pPosNum)++; } else { (*pNegNum)++; } } return; } //朴素贝叶斯学习器算法程序 voidNaiveBayes(void) { inti,j,cntY,cntN; //存储训练样例目标属性为yes和no的样本数 intposNum,negNum; //存储目标值yes和no的概率 floatPVyes,PVno,PVyesTemp,PVnoTemp; //存储目标值为yes时需分类的每个属性的概率 floatPAttrYes[ATTR_NUM]; //存储目标值为no时需分类的每个属性的概率 floatPAttrNo[ATTR_NUM]; //计算训练样例集的正样本数和负样本数 CalcPosAndNegNum(&posNum,&negNum); //计算目标值yes的概率 PVyes=(float)posNum/(float)TRAIN_NUM; //计算目标值no的概率 PVno=(float)negNum/(float)TRAIN_NUM; //计算目标值分别为yes和no时各个需分类属性对应的概率 for(j=0;j { //清0计数变量 cntY=0; cntN=0; for(i=0;i { //统计目标值为yes时各个需分类的属性在训练样例中的个数 if(trainSample[i][ATTR_NUM]==yes) { //如果训练样例的目标属性是yes //且该训练样例的属性值和需要分类的样例的属性值相等,则计数 if(trainSample[i][j]==newSanple[j]) { cntY++; } } //统计目标值为no时各个需分类的属性在训练样例中的个数 elseif(trainSample[i][ATTR_NUM]==no) { //如果训练样例的目标属性是no //且该训练样例的属性值和需要分类的样例的属性值相等,则计数 if(trainSample[i][j]==newSanple[j]) { cntN++; } } } //计算目标值为yes时需分类的各个属性的概率 PAttrYes[j]=((float)cntY+(float)m*preP[j])/(float)(posNum+m); //计算目标值为no时需分类的各个属性的概率 PAttrNo[j]=((float)cntN+(float)m*preP[j])/(float)(negNum+m); } //分别计算需要分类的样例的目标值为yes和no的概率 for(i=0;i { PVyes=PVyes*PAttrYes[i]; PVno=PVno*PAttrNo[i]; } //做归一化处理 PVyesTemp=PVyes/(PVyes+PVno); PVnoTemp=PVno/(PVyes+PVno); //打印 printf("实例分类为yes的概率为: %f\n",PVyesTemp); printf("实例分类为no的概率为: %f\n",PVnoTemp); if(PVyesTemp>PVnoTemp) { printf("所以实例被分类为: yes\n"); } else { printf("所以实例被分类为: no\n"); } return; } //主函数intmain(void) { //调用朴素贝叶斯学习器算法 NaiveBayes(); return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器 学习 朴素 贝叶斯 原理 分析 语言 代码 实现