1、 =P(A|B0)。分别算出 取其中的最大值,其中,P(A)的值相同,可以不算出来。If(P(B|A)最大 = 测试样例.ClassValues) return true;Else return false;4、实验内容及步骤实验内容:利用贝叶斯算法或者决策树算法进行数据分类操作数据集:汽车评估数据集(见附录)实验步骤:1仔细阅读并了解实验数据集;2使用任何一种熟悉的计算机语言(比如C,Java或者matlab)实现朴素贝叶斯算法或者决策树算法;3利用朴素贝叶斯算法或者决策树算法在训练数据上学习分类器,训练数据的大小分别设置为:前100个数据,前200个数据,前500个数据,前700个数据,前
2、1000个数据,前1350个数据;4利用测试数据对学习的分类器进行性能评估;5统计分析实验结果并上交实验报告;定义和初始化变量2统计并计算条件概率P(Ai|Bi),(i=0,1,2,3),当训练数据比较小时会出现Bi等于0的情况,这时P(Ai|Bi)=nan,所以可以加一个判断,当P(Ai|Bi)1时,让P(Ai|Bi)=0.3计算(四个里面取最大)4实验结果四、思考题:1. 两种算法在训练数据集和测试数据集上的性能一致吗?哪个比较好? 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出
3、,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。 不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。决策树的成功率为: 61.80372% ,贝叶斯成功率为:68.7831% (贝叶斯更好一点)相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。2. 提出一种提高分类器性
4、能的方法并通过实验验证。5、实验心得通过这次实验加深了我对朴素贝叶斯的认识,学会了用朴素贝叶斯算法解决具体的问题。朴素贝叶斯分类是一种十分简单的分类算法,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就觉得此待分类项属于哪个类别。朴素贝叶斯的原理决定了其成功率不可能太高,但是朴素贝叶斯的简单易用性使得其在一些日常生活中应用广泛。附件(代码)#includecstdlibcstringvectorfstreamstdio.husing namespace std;int countTrain = 0;/训练样本数目int countTest = 0;/测试样本数目int
5、 countTestSuc = 0;/测试样本正确的数目int countF=100; /训练和测试的分界 string CVname4=unacc,accgoodvgood;int ClassValues4; /unacc, acc, good, vgood 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
6、 safety44; /low, med, high. float ClassValuesL4;float buyingL44;float maintL44;float doorsL44;float personsL44;float lug_bootL44;float safetyL44;*/统计个数 void Tonji(string a,string b,string c,string d,string e,string f,string g)/couta bcdefgendl;for(int i=0;i0 & fina &b&c &d &e &f &g) countTrain+; Ton
7、ji(a,b,c,d,e,f,g); fin.close(); cout训练样本countTrain=countTrain/统计得到在各类别下各个特征属性的条件概率估计void CalAP() /概率P(yi) for(int i=0;i+) ClassValuesLi = (float) ClassValuesi/countTrain; /特别注意的是P(ai|yi)=ai/0的情况!,会使 P(ai|yi)等于nan;i+) /概率P(ai|yi) for(int j=0;jj+) buyingLij = (float) buyingij/ClassValuesj; if(buyingLi
8、j1) buyingLij=0; maintLij = (float) maintij/ClassValuesj; if(maintLij1) maintLij=0; doorsLij = (float) doorsij/ClassValuesj; if(doorsLij1) doorsLij=0; 3;i+) /概率P(ai|yi) personsLij = (float) personsij/ClassValuesj; if(personsLij1) personsLij=0; lug_bootLij = (float) lug_bootij/ClassValuesj; if(lug_bo
9、otLij1) 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,string fi,string gi) int b, m, d, p, l, s; /buying: if(ai=) b=0; else if(ai=) b=1;) b
10、=2;) b=3; /maint: if(bi=) m=0; else if(bi=) m=1;) m=2;) m=3; /doors: if(ci=) d=0; else if(ci=) d=1;) d=2; else d=3; /persons: if(di=) p=0; else if(di=) p=1; else p=2; /lug_boot: if(ei=) l=0; else if(ei=) l=1;) l=2; /safety: if(fi=) s=0; else if(fi=) s=1;) s=2; float Bi; float MaxB=0; int t=0; /计算四个P
11、(Bi|A)的概率取最大的 for(int i=0; Bi=buyingLbi * maintLmi * doorsLdi * personsLpi * lug_bootLli * safetyLsi * ClassValuesLi; if(MaxB Bi & BicountF) countTest+; t=TestLine(a,b,c,d,e,f,g); if(t) countTestSuc+;void setZero();int main() int a5=100,200,500,700,1350;5; setZero(); countF=ai; ReadFileTrain(); /读取文
12、件并且统计个数 CalAP(); /计算条件概率 ReadFileTest(); /测试样本 cout预测正确countTestSuc=countTestSuc测试样本countTest=countTest准确率为:100.0*(float)countTestSuc/(float)countTest)%endl return 0;void setZero() countTrain = 0; countTest = 0; countTestSuc = 0; for(int j=0; ClassValuesi=0; buyingij=0; maintij=0; doorsij=0; personsij=0; lug_bootij=0; safetyij=0; ClassValuesLi=0; buyingLij=0; maintLij=0; doorsLij=0; personsLij=0; lug_bootLij=0; safetyLij=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1