实验三:分类算法实验(10页).doc
-第 1 页实验三实验三:分类算法分类算法实验实验-第 2 页HUNANHUNANUNIVERSITYUNIVERSITY人工智能实验报告题目实验三:分类算法实验学生姓名蒙寿伟学生学号201408070120专业班级智能科学与技术 1401 班指导老师袁进日期2017年5月15日一实验目的一实验目的1.了解朴素贝叶斯算法和决策树算法的基本原理;2.能够使用朴素贝叶斯算法或者决策树算法对数据进行分类3.学会对于分类器的性能评估方法二、实验的硬件、软件平台二、实验的硬件、软件平台硬件:计算机软件:操作系统:WINDOWS2000应用软件:C,Java 或者 Matlab三、三、实验实验相关知识相关知识贝叶斯定理:)()()|()|(PAPBPBAPABP(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。P(B)是 B 的先验概率,也作标淮化常量(normalizing constant)。以第一条数据为例:vhigh,vhigh,2,2,small,low,unaccClassValues:unacc,acc,good,vgood 对应 P(Bi)。(i=0,1,2,3)-第 3 页P(Ai)六 个 属 性 相 互 独 立:P(A0|B0)*P(A1|B0)*.P(A5|B0)=P(A|B0)。分别算出取其中的最大值,其中,P(A)的值相同,可以不算出来。If(P(B|A)最大=测试样例.ClassValues)return true;Else return false;四、四、实验内容及步骤实验内容及步骤实验内容:利用贝叶斯算法或者决策树算法进行数据分类操作数据集:汽车评估数据集(见附录)实验步骤:1仔细阅读并了解实验数据集;2使用任何一种熟悉的计算机语言(比如 C,Java 或者 matlab)实现朴素贝叶斯算法或者决策树算法;3 利用朴素贝叶斯算法或者决策树算法在训练数据上学习分类器,训练数据的大小分别设置为:前100个数据,前200个数据,前500个数据,前700个数据,前1000个数据,前1350个数据;4利用测试数据对学习的分类器进行性能评估;5统计分析实验结果并上交实验报告;定义和初始化变量统计并计算条件概率 P(Ai|Bi),(i=0,1,2,3),当训练数据比较小时会出现Bi 等于0的情况,这时 P(Ai|Bi)=nan,所以可以加一个判断,当 P(Ai|Bi)1时,让 P(Ai|Bi)=0.计算)()()|()|(PAPBiPBiAPABi(四个里面取最大)实验结果四、思考题:四、思考题:1.两种算法在训练数据集和测试数据集上的性能一致吗?哪个比较好?)()0()0|()|0(PAPBPBAPAB)()1()1|()|1(PAPBPBAPAB)()2()2|()|2(PAPBPBAPAB)()3()3|()|3(PAPBPBAPAB-第 4 页决策树决策树(decision tree)是一个树结构是一个树结构(可以是二叉树或非二叉树可以是二叉树或非二叉树)。其每个非叶节点表其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别放一个类别。使用决策树进行决策的过程就是从根节点开始使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。决策树的成功率为:61.80372%,贝叶斯成功率为:68.7831%(贝叶斯更好一点)相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。2.提出一种提高分类器性能的方法并通过实验验证。五、五、实验实验心得心得通过这次实验加深了我对朴素贝叶斯的认识,学会了用朴素贝叶斯算法解决具体的问题。朴素贝叶斯分类是一种十分简单的分类算法,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就觉得此待分类项属于哪个类别。朴素贝叶斯的原理决定了其成功率不可能太高,但是朴素贝叶斯的简单易用性使得其在一些日常生活中应用广泛。附件(代码)#include#include#include#include#include#includeusing namespace std;int countTrain=0;/训练样本数目int countTest=0;/测试样本数目int countTestSuc=0;/测试样本正确的数目int countF=100;/训练和测试的分界string CVname4=unacc,acc,good,vgood;int ClassValues4;/unacc,acc,good,vgood-第 5 页int buying44;/vhigh,high,med,low.int maint44;/vhigh,high,med,low.int doors44;/2,3,4,5more.int persons44;/2,4,more.int lug_boot44;/small,med,big.int safety44;/low,med,high.float ClassValuesL4;/unacc,acc,good,vgoodfloat buyingL44;/vhigh,high,med,low.float maintL44;/vhigh,high,med,low.float doorsL44;/2,3,4,5more.float personsL44;/2,4,more.float lug_bootL44;/small,med,big.float safetyL44;/low,med,high./统计个数void Tonji(string a,string b,string c,string d,string e,string f,stringg)/couta b c d e f gendl;for(int i=0;i0&fina&finb&finc&find&fine&finf&fing)countTrain+;Tonji(a,b,c,d,e,f,g);fin.close();-第 7 页cout训练样本 countTrain=countTrainendl;/统计得到在各类别下各个特征属性的条件概率估计void CalAP()/概率 P(yi)for(int i=0;i4;i+)ClassValuesLi=(float)ClassValuesi/countTrain;/特别注意的是 P(ai|yi)=ai/0的情况!,会使 P(ai|yi)等于 nan;for(int i=0;i4;i+)/概率 P(ai|yi)for(int j=0;j4;j+)buyingLij=(float)buyingij/ClassValuesj;if(buyingLij1)buyingLij=0;maintLij=(float)maintij/ClassValuesj;if(maintLij1)maintLij=0;doorsLij=(float)doorsij/ClassValuesj;if(doorsLij1)doorsLij=0;for(int i=0;i3;i+)/概率 P(ai|yi)for(int j=0;j4;j+)personsLij=(float)personsij/ClassValuesj;if(personsLij1)personsLij=0;lug_bootLij=(float)lug_bootij/ClassValuesj;if(lug_bootLij1)lug_bootLij=0;safetyLij=(float)safetyij/ClassValuesj;if(safetyLij1)safetyLij=0;/一行数据的准确与否,P(Bi|A)=P(A|Bi)P(Bi)/P(A),其中 P(A)相同,只需比较分子的大小即可bool TestLine(string ai,string bi,string ci,string di,string ei,stringfi,string gi)int b,m,d,p,l,s;/buying:if(ai=vhigh)b=0;-第 8 页else if(ai=high)b=1;else if(ai=med)b=2;else if(ai=low)b=3;/maint:if(bi=vhigh)m=0;else if(bi=high)m=1;else if(bi=med)m=2;else if(bi=low)m=3;/doors:if(ci=2)d=0;else if(ci=3)d=1;else if(ci=4)d=2;elsed=3;/persons:if(di=2)p=0;else if(di=4)p=1;else p=2;/lug_boot:if(ei=small)l=0;else if(ei=med)l=1;else if(ei=big)l=2;/safety:if(fi=low)s=0;else if(fi=med)s=1;else if(fi=high)s=2;float Bi;float MaxB=0;int t=0;/计算四个 P(Bi|A)的概率取最大的-第 9 页for(int i=0;i4;i+)Bi=buyingLbi*maintLmi*doorsLdi*personsLpi*lug_bootLli*safetyLsi*ClassValuesLi;if(MaxB Bi&Bia&finb&finc&find&fine&finf&fing)if(icountF)countTest+;t=TestLine(a,b,c,d,e,f,g);if(t)countTestSuc+;fin.close();void setZero();int main()int a5=100,200,500,700,1350;for(int i=0;i5;i+)setZero();countF=ai;/训练和测试的分界ReadFileTrain();/读取文件并且统计个数-第 10 页CalAP();/计算条件概率ReadFileTest();/测试样本cout预测正确 countTestSuc=countTestSucendl;cout测试样本 countTest=countTestendl;cout准确率为:100.0*(float)countTestSuc/(float)countTest)%endlendl;return 0;void setZero()countTrain=0;/训练样本数目countTest=0;/测试样本数目countTestSuc=0;/测试样本正确的数目for(int i=0;i4;i+)for(int j=0;j4;j+)ClassValuesi=0;/unacc,acc,good,vgoodbuyingij=0;/vhigh,high,med,low.maintij=0;/vhigh,high,med,low.doorsij=0;/2,3,4,5more.personsij=0;/2,4,more.lug_bootij=0;/small,med,big.safetyij=0;/low,med,high.ClassValuesLi=0;/unacc,acc,good,vgoodbuyingLij=0;/vhigh,high,med,low.maintLij=0;/vhigh,high,med,low.doorsLij=0;/2,3,4,5more.personsLij=0;/2,4,more.lug_bootLij=0;/small,med,big.safetyLij=0;/low,med,high.