版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
朴素贝叶斯分类算法・贝叶斯分类的原理贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化。贝叶斯分类器是用于分类的贝叶斯网络。该网络中应包含类结点C,其中C的取值来自于类集合(cl,c2, ,cm),还包含一组结点X=(XI,X2,...,Xn),表示用于分类的特征。对于贝叶斯网络分类器,若某一待分类的样本D,其分类特征值为x=(xl,x2, ,xn),则样本D属于类别ci的概率P(C=ci|XI=xl,X2=x2,...,Xn=xn),(i=1,2,...,m)应满足下式:P(C=ci|X=x)=Max{P(C=cl|X=x),P(C=c2|X=x),,P(C=cm|X=x)}贝叶斯公式:P(C=ci|X=x)=P(X=x|C=ci)*P(C=ci)/P(X=x)其中,P(C=ci)可由领域专家的经验得至I],而P(X=x|C=ci)和P(X=x)的计算则较困难。二.贝叶斯伪代码整个算法可以分为两个部分,“建立模型”与“进行预测”,其建立模型的伪代码如下:numAttrValues等简单的数据从本地数据结构中直接读取构建儿个关键的计数表for(为每一个实例){for(每个属性){为numClassAndAttr中当前类,当前属性,当前取值的单元加1为attFrequencies中当前取值单元加1))预测的伪代码如下:for(每一个类别){for(对每个属性xj){for(对每个属性xi){
if(F(xi)小于m){出现的次数没有超过阀值,}else{查if(F(xi)小于m){出现的次数没有超过阀值,}else{查numClassAndAttr计算))查numClassAndAttr计算)不予考虑F(y,xi,F(y,xi)xj)计算公式(7)中的评价函数,记录下这个类别的评价函数值)得到了各个类别上的条件概率,再带入贝叶斯公式算出最后的概率三、算法实现代码(1)建立模型voidGetModel::TrainModel0intSplitVal;Cache。;〃为模型分配内存for(inti=0;i<=gi->MaxAttNo;i++)if(!gi->MaxAttValNoLil)SplitPoint[i]=gi->SplitContinuousAtt(i);}for(inti=0;i<=gi->MaxItemNo;i++)for(intj=0;j<=gi->MaxAttNo;j++)(if(gi->MaxAttValNo[j])PostFreq.gi">MaxAttNo+l..DiscrValue][j][gi->ItemLi][j].DiscrValue]++•else(if(gi*>ItemLil[j].continuousVal<=SplitPointEj])SplitVal=l;elseSplitVal=2;PostFreq[gi->Item[i]Lgi">MaxAttNo+lLDiscrValue][j][SplitVal]++;)voidGetModel::Cache0{PostFreq=(float***)calloc(gi->MaxClassNo+l,sizeof(float**));for(inti=0;i<=gi->MaxClassNo;i++){PostFreq.i.=(float**)calloc(gi->MaxAttNo+l,sizeof(float*));for(intj=0;j<=gi->MaxAttNo;j++)(if(gi->MaxAttValNo[j])PostFreqEi][j]=(float*)calloc(gi->MaxAttValNo[j]+1,sizeof(float));elsePostFreqEi][jj=(float*)calloc(3,sizeof(float));)}SplitPoint=(float*)calloc(gi->MaxAttNo+l,sizeof(float));)⑵预测PredictClass::PredictClass(GetInfo*i,GetModel*m,stringname,stringAttname):MaxClassNo(-1),MaxDiscrValNo(2),MaxAttNo(-1){gi二i;gm=m;filename=name;this">Inc=1024;AttFi1eName=Attname;)voidPredictClass::Predict(){float*prob;intBestl=-1;floatMaxProb=0;intj;GetName0;GetDataO;prob=(float*)calloc(MaxClassNo+1,sizeof(float));for(inti=0;i<=MaxClassNo;i++)prob[i]=l.0;for(inti=0;i<=MaxItemNo;i++)for(j=0;j<=MaxClassNo;j++)(for(intk=0;k<=MaxAttNo;k++)(if(MaxAttValNo[k])prob[j]*=(gm->PostFreq[j][k]EltemEiZ[kJ.DiscrValue]/gi->ClassFreq[j]);else{if(ItemLil[k].continuousVal<=gm->SplitPoint[k])prob[j]*=(gm->PostFreq[j][k][l]/gi">ClassFreq[j]);elseprob[j]*=(gm->PostFreq[j][k][2]/gi->ClassFreq[j]);))prob[*=(gi->ClassFreq[j]/(gi->MaxItemNo+l));if(prob[j]>MaxProb)(MaxProb=prob[j];Bestl=j;))概率最大“〈〈MaxProb<X〃类别=“〈〈ClassName[Bestl]«endl;ItemLil[MaxAttNo+1].DiscrValue=BestI;/*重置*/(Bestl=-1;MaxProb=0;for(inti=0;i<=MaxClassNo;i++)probZi]=l.0;)}show();)voidPredictClass::show(){inti,j;for(i=0;i<=MaxItemNo;i++)(for(j=0;j<=MaxAttNo;j++)(if(MaxAttValNo[j])cout<<A11VaIName[j] [j].DiscrValue] ;elsecout<<Item[i][j].continuousVal<<,z}cout<<〃预测结果为:,,«ClassName[Item[i][j].DiscrValue]<<endl;})voidPredictClass::GetData(){FILE*Nf;charFn[50];fi1ename=fi1ename+,z.data”;filename,copy(Fn,filename,length0);Fn[filename,length0J=NULL;if(!(Nf=fopen(Fn,"r")))Error(0,Fn,〃“);intItemNo=0;intItemSpace=0;do{MaxItemNo=ItemNo;/*Makesurethereisroomforanotheritem*/if(ItemNo>=ItemSpace){if(ItemSpace)(ItemSpace+=Inc;Item = (Description *)realloc(Item,ItemSpace*sizeof(Description));}else(Item = (Description*)malloc((ItemSpace=Inc)*sizeof(Description));)}ItemritemNo]=GetDescription(Nf);}while(ItemEltemNo]!=0&&++ItemNo);fclose(Nf);Max11emNo=11emNo-1;)void PredictClass::Error(intn,stringsi,strings2)/* */cout«"ERR0R:switch(n)case0:cout«/zcannotopenfilez,<<sl«s2«endl;break;case1:cout«/zcolonexpectedafterattributename,z«sl«endl;break;case2:cout«/zunexpectedEOFwhilereadingattributesl«endl;break;:cout<<,zattribute hasonlyonevalue,z«endl;break;cout«z,caseMaxItemNo+l«/z,svalueof' forattributez,«sl«z/isillegal,z«endl;//Error(4,AttName[AttNo],name);break;case5:cout«,zcase/z«MaxItemNo+l«,z,sclassof' isillegalz,«endl;break;)cout«z,processstop!,z«endl;exit(1);)DescriptionPredictClass::GetDescription(FILE*Df){intAttNo;/*attributenumber,0..MaxAttNo*/charname[50],*endname;intDv;floatCv;DescriptionDvec;if(ReadName(Df,name)){Dvec=(Description)calloc(MaxAttNo+2,sizeof(AttValue));〃因为aMaxAttN。是从a开始计数的在加上类别属性,所以+2for(AttNo=0;AttNo<=MaxAttNo;AttNo++){if(Ma^ttValNoEAttNo])(/*Discretevalue*/Dv=Which(name,AttValName[AttNo],1,MaxAttValNo[AttNo]);if(!Dv)Error(4,AttName[AttNo],name);DvecTAttNo].DiscrValue=Dv;else(/*Continuousvalue*/Cv=(float)strtod(name,&endname);if(endname=nameI|*endname!='\0')Error(4,AttName[AttNo],name);DvecLAttNo].continuousVal=Cv;)ReadName(Df,name);}returnDvec;)else{return0;))voidPredictClass::GetName0{FILE*Nf;charBuffer[1000.;charFn[100];intAttCeiling=100;intClassCeiling=100;intValCeiling;AttFileName,copy(Fn,AttFileName.length0);FnEAttFileName.length()]=NULL;strcat_s(Fn,"・names");if(!(Nf=fopen(Fn,"r")))Error(0,Fn,;ClassName=(string*)calloc(ClassCeiling,sizeof(string));do{ReadName(Nf,Buffer);if(++MaxClassNo>=ClassCeiling){ClassCeiling+=100;realloc(ClassName,ClassName = (string *)realloc(ClassName,ClassCeiling*sizeof(string));}ClassName[MaxClassNo]=string(Buffer);)while(Delimiter= );/*Getattributeandattributevaluenamesfromnamesfile*/AttName=(string*)calloc(AttCeiling,sizeof(string));MaxAttValNo=(short*)calloc(AttCeiling,sizeof(short));AttValName=(string**)calloc(AttCeiling,sizeof(string*));//SpecialStatus=(char*)malloc(AttCeiling);while(ReadName(Nf,Buffer)){if(Delimiter!=':')Error(1,Buffer,");if(++MaxAttNo>=AttCeiling)〃扩大空间{AttCeiling+=100;AttName=(string*)realloc(AttName,AttCeiling*sizeof(string));MaxAttValNo=(short*)realloc(MaxAttValNo,AttCeiling*sizeof(short));AttValName=(string**)realloc(AttValName,AttCeiling*sizeof(string*));//SpecialStatus=(char*)realloc(SpecialStatus,AttCeiling);}AttName[MaxAttNo.=string(Buffer);//SpecialStatus[MaxAttNo]=0;MaxAttValNo[MaxAttNo]=0;ValCeiling=100;AttValName.MaxAttNo.=(string*)calloc(ValCeiling,sizeof(string));do{if(!(ReadName(Nf,Buffer)))Error(2,AttName[MaxAttNo],“〃);if(++MaxAttValNo[MaxAttNo]>=ValCeiling)(ValCeiling+:100;AttValName[MaxAttNo.=(string*)realloc(AttValName[MaxAttNo],ValCeiling*sizeof(string));)AttValName[MaxAttNoZ[MaxAttValNoZMaxAttNoZ]=string(Buffer);}while(Delimiter=;if(MaxAttValNo[MaxAttNo]=1){/*Checkforspecialtreatment*/if(!strcmp(Buffer,“continuous"))//MaxContAttNo++;else(/*Cannothaveonlyonediscretevalueforanattribute*/Error(3,AttName[MaxAttNo],");)MaxAttValNo[MaxAttNo]=0;}elseif(MaxAttValNo[MaxAttNo]>MaxDiscrValNo)MaxDiscrValNo=MaxAttValNo[MaxAttNoJ;)fclose(Nf);)boolPredictClass::ReadName(FILE*f,char*Buffer){registerchar*Sp=Buffer;registerintc;while((c=getc(f))=''Ispace(c)){if(c='')SkipComment;)if(c==EOF){Delimiter=EOF;returnfalse;)〃读数据while(c &&c &&c!='\n'&&c!='|'&&c!=EOF){if(c='.'){if((c=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年软件思维测试题及答案
- 2026年广汽丰田招聘测试题及答案
- 2026年四头狼的测试题及答案
- 2026年普通话口音测试题及答案
- 2026年学霸及格测试题及答案
- 2026年神奇英语测试题及答案
- 2026年入学趣味测试题及答案
- 2026年智商高度测试题及答案
- 2026年天津倾向能力测试题及答案
- 某钢铁厂钢材质量管控细则
- 【三年级下册英语】【人教PEP版】阅读理解专项训练91篇带答案
- 【安庆】2026年安徽桐城师范高等专科学校公开招聘工作人员8人笔试历年典型考题及考点剖析附带答案详解
- 2026江苏苏州工业园区苏相合作区助理人员招聘6人备考题库附参考答案详解(综合题)
- 《建筑施工模板安全技术规范》JGJ162-2025
- SD高达G世纪 超越世界 金手指
- 大型工业吊扇销售合同
- 国家突发事件总体应急预案编制指南
- 2026云南临沧国投宏华招聘综合业务开单员3人备考题库及答案详解(必刷)
- 飞机构造基础试题库含结构
- 2022年高一下学期数学期末试卷(有答案)
- 北师大版七年级数学上册章节同步练习题(全册-共57页)
评论
0/150
提交评论