版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选文档机器学习课内实验报告(1) ID算法实现决策树2015 - 2016学年 第 2 学期专业:智能科学与技术班级:智能1301班学号:06133029姓名:张争辉一、 实验目的:理解ID3算法的基本原理,并且编程实现。二、 实验要求:使用C/C+/MATLAB实现ID3算法。输入:若干行,每行 5 个字符串,表示Outlook Temperature Humidity Wind Play ball如上表。输出:决策树。实验结果如下:输入: Sunny Hot High Weak No Sunny Hot High Strong No Overcast Hot High Weak Yes
2、Rain Mild High Weak Yes Rain Cool Normal Weak Yes Rain Cool Normal Strong No Overcast Cool Normal Strong Yes Sunny Mild High Weak No Sunny Cool Normal Weak Yes Rain Mild Normal Weak Yes Sunny Mild Normal Strong Yes Overcast Mild High Strong Yes Overcast Hot Normal Weak Yes Rain Mild High Strong No输出
3、:Outlook Rain Wind Strong No Weak Yes Overcast Yes Sunny Humidity Normal Yes High No 三、 具体实现:实现算法如下:#include #include #include #include using namespace std;#define ROW 14#define COL 5#define log2 0.69314718055typedef struct TNode char data15; char weight15; TNode * firstchild,*nextsibling;*tree;type
4、def struct LNode char OutLook15; char Temperature15; char Humidity15; char Wind15; char PlayTennis5; LNode *next;*link;typedef struct AttrNode char attributes15;/属性 int attr_Num;/属性的个数 AttrNode *next;*Attributes;char * ExamplesROWCOL = /OverCast,Cool,High,Strong,No, /Rain,Hot,Normal,Strong,Yes, Sunn
5、y,Hot,High,Weak,No, Sunny,Hot,High,Strong,No, OverCast,Hot,High,Weak,Yes, Rain,Mild,High,Weak,Yes, Rain,Cool,Normal,Weak,Yes, Rain,Cool,Normal,Strong,No, OverCast,Cool,Normal,Strong,Yes, Sunny,Mild,High,Weak,No, Sunny,Cool,Normal,Weak,Yes, Rain,Mild,Normal,Weak,Yes, Sunny,Mild,Normal,Strong,Yes, Ove
6、rCast,Mild,Normal,Strong,Yes, OverCast,Hot,Normal,Weak,Yes, Rain,Mild,High,Strong,No ;char * Attributes_kind4 = OutLook,Temperature,Humidity,Wind;int Attr_kind4 = 3,3,2,2;char * OutLook_kind3 = Sunny,OverCast,Rain;char * Temperature_kind3 = Hot,Mild,Cool;char * Humidity_kind2 = High,Normal;char * Wi
7、nd_kind2 = Weak,Strong;/*int i_Exampple145 = 0,0,0,0,1, 0,0,0,1,1, 1,0,0,1,0, 2,1,0,0,0, 2,2,1,0,0, 2,2,1,1,1, 1,2,1,1,0, 0,1,0,0,1, 0,2,1,0,0, 2,1,1,0,0, 0,1,1,1,0, 1,1,1,1,0, 1,1,1,0,0, 2,1,0,0,1 ;*/void treelists(tree T);void InitAttr(Attributes &attr_link,char * Attributes_kind,int Attr_kind);vo
8、id InitLink(link &L,char * ExamplesCOL);void ID3(tree &T,link L,link Target_Attr,Attributes attr);void PN_Num(link L,int &positve,int &negative);double Gain(int positive,int negative,char * atrribute,link L,Attributes attr_L);void main() link LL,p; Attributes attr_L,q; tree T; T = new TNode; T-first
9、child = T-nextsibling = NULL; strcpy(T-weight,); strcpy(T-data,); attr_L = new AttrNode; attr_L-next = NULL; LL = new LNode; LL-next = NULL; /成功建立两个链表 InitLink(LL,Examples); InitAttr(attr_L,Attributes_kind,Attr_kind); ID3(T,LL,NULL,attr_L); cout决策树以广义表形式输出如下:endl; treelists(T);/以广义表的形式输出树/coutGain(9
10、,5,OutLook,LL,attr_L)endl; coutendl;/以广义表的形式输出树void treelists(tree T) tree p; if(!T) return; coutweight; coutdata; p = T-firstchild; if (p) coutnextsibling; if (p)cout,; cout); void InitAttr(Attributes &attr_link,char * Attributes_kind,int Attr_kind) Attributes p; for (int i =0;i next = NULL; strcpy
11、(p-attributes,Attributes_kindi); p-attr_Num = Attr_kindi; p-next = attr_link-next; attr_link-next = p; void InitLink(link &LL,char * ExamplesCOL) link p; for (int i = 0;i next = NULL; strcpy(p-OutLook,Examplesi0); strcpy(p-Temperature,Examplesi1); strcpy(p-Humidity,Examplesi2); strcpy(p-Wind,Example
12、si3); strcpy(p-PlayTennis,Examplesi4); p-next = LL-next; LL-next = p; void PN_Num(link L,int &positve,int &negative) positve = 0; negative = 0; link p; p = L-next; while (p) if (strcmp(p-PlayTennis,No) = 0) negative+; else if(strcmp(p-PlayTennis,Yes) = 0) positve+; p = p-next; /计算信息增益/link L: 样本集合S/
13、attr_L:属性集合double Gain(int positive,int negative,char * atrribute,link L,Attributes attr_L) int atrr_kinds;/每个属性中的值的个数 Attributes p = attr_L-next; link q = L-next; int attr_th = 0;/第几个属性 while (p) if (strcmp(p-attributes,atrribute) = 0) atrr_kinds = p-attr_Num; break; p = p-next; attr_th+; double en
14、tropy,gain=0; double p1 = 1.0*positive/(positive + negative); double p2 = 1.0*negative/(positive + negative); entropy = -p1*log(p1)/log2 - p2*log(p2)/log2;/集合熵 gain = entropy; /获取每个属性值在训练样本中出现的个数 /获取每个属性值所对应的正例和反例的个数 /声明一个3*atrr_kinds的数组 int * kinds= new int * 3; for (int j =0;j 3;j+) kindsj = new i
15、ntatrr_kinds;/保存每个属性值在训练样本中出现的个数 /初始化 for (int j = 0;j 3;j+) for (int i =0;i atrr_kinds;i+) kindsji = 0; while (q) if (strcmp(OutLook,atrribute) = 0) for (int i = 0;i OutLook,OutLook_kindi) = 0) kinds0i+; if(strcmp(q-PlayTennis,Yes) = 0) kinds1i+; else kinds2i+; else if (strcmp(Temperature,atrribute
16、) = 0) for (int i = 0;i Temperature,Temperature_kindi) = 0) kinds0i+; if(strcmp(q-PlayTennis,Yes) = 0) kinds1i+; else kinds2i+; else if (strcmp(Humidity,atrribute) = 0) for (int i = 0;i Humidity,Humidity_kindi) = 0) kinds0i+; if(strcmp(q-PlayTennis,Yes) = 0) kinds1i+;/ else kinds2i+; else if (strcmp
17、(Wind,atrribute) = 0) for (int i = 0;i Wind,Wind_kindi) = 0) kinds0i+; if(strcmp(q-PlayTennis,Yes) = 0) kinds1i+; else kinds2i+; q = q-next; /计算信息增益 double * gain_kind = new doubleatrr_kinds; int positive_kind = 0,negative_kind = 0; for (int j = 0;j next; Link-next = NULL; while (p) q = p; p = p-nex
18、t; free(q); void ID3(tree &T,link L,link Target_Attr,Attributes attr) Attributes p,max,attr_child,p1; link q,link_child,q1; tree r,tree_p; int positive =0,negative =0; PN_Num(L,positive,negative); /初始化两个子集合 attr_child = new AttrNode; attr_child-next = NULL; link_child = new LNode; link_child-next =
19、NULL; if (positive = 0)/全是反例 strcpy(T-data,No); return; else if( negative = 0)/全是正例 strcpy(T-data,Yes); return; p = attr-next; /属性链表 double gain,g = 0; /*/ /* 建立属性子集合与训练样本子集合有两个方案: 一:在原来链表的基础上进行删除; 二:另外申请空间进行存储子集合; 采用第二种方法虽然浪费了空间,但也省了很多事情,避免了变量之间的应用混乱 */ /*/ if(p) while (p) gain = Gain(positive,nega
20、tive,p-attributes,L,attr); coutattributes gain g) g = gain; max = p;/寻找信息增益最大的属性 p = p-next; strcpy(T-data,max-attributes);/增加决策树的节点 coutattributes = attributesendlnext; while (p) if (strcmp(p-attributes,max-attributes) != 0) p1 = new AttrNode; strcpy(p1-attributes,p-attributes); p1-attr_Num = p-att
21、r_Num; p1-next = NULL; p1-next = attr_child-next; attr_child-next = p1; p = p-next; /需要区分出是哪一种属性 /建立每一层的第一个节点 if (strcmp(OutLook,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,OutLook_kind0); T-firstchild = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child
22、 q = L-next; while (q) if (strcmp(q-OutLook,OutLook_kind0) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL; q1-next = link_child-next; link_child-next =
23、 q1; q = q-next; else if (strcmp(Temperature,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,Temperature_kind0); T-firstchild = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next; while (q) if (strcmp(q-Temperature,Temperature_kind0) = 0) q1 = new
24、 LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL; q1-next = link_child-next; link_child-next = q1; q = q-next; else if (strcmp(Humidity,max-attributes) = 0) r = new T
25、Node; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,Humidity_kind0); T-firstchild = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next; while (q) if (strcmp(q-Humidity,Humidity_kind0) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temp
26、erature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL; q1-next = link_child-next; link_child-next = q1; q = q-next; else if (strcmp(Wind,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,Wind_kind0); T-firstchild = r
27、; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next; while (q) if (strcmp(q-Wind,Wind_kind0) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL;
28、q1-next = link_child-next; link_child-next = q1; q = q-next; int p = 0,n = 0; PN_Num(link_child,p,n); if (p != 0 & n != 0) ID3(T-firstchild,link_child,Target_Attr,attr_child); FreeLink(link_child); else if(p = 0) strcpy(T-firstchild-data,No); FreeLink(link_child); /strcpy(T-firstchild-data,q1-PlayTe
29、nnis);/-此处应该需要修改-:) else if(n = 0) strcpy(T-firstchild-data,Yes); FreeLink(link_child); /建立每一层上的其他节点 tree_p = T-firstchild; for (int i = 1;i attr_Num;i+) /需要区分出是哪一种属性 if (strcmp(OutLook,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,OutLook_kindi); tree_p-ne
30、xtsibling = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next; while (q) if (strcmp(q-OutLook,OutLook_kindi) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis
31、); q1-next = NULL; q1-next = link_child-next; link_child-next = q1; q = q-next; else if (strcmp(Temperature,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,Temperature_kindi); tree_p-nextsibling = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next
32、; while (q) if (strcmp(q-Temperature,Temperature_kindi) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL; q1-next = link_child-next; link_child-next = q1
33、; q = q-next; else if (strcmp(Humidity,max-attributes) = 0) r = new TNode; r-firstchild = r-nextsibling = NULL; strcpy(r-weight,Humidity_kindi); tree_p-nextsibling = r; /获取与属性值相关的训练样例Example(vi),建立一个新的训练样本链表link_child q = L-next; while (q) if (strcmp(q-Humidity,Humidity_kindi) = 0) q1 = new LNode; strcpy(q1-OutLook,q-OutLook); strcpy(q1-Humidity,q-Humidity); strcpy(q1-Temperature,q-Temperature); strcpy(q1-Wind,q-Wind); strcpy(q1-PlayTennis,q-PlayTennis); q1-next = NULL; q1-next = link_child-next; link_child-nex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025昆明学院教师招聘考试题目及答案
- 2025江西管理职业学院教师招聘考试题目及答案
- 2026年经济学基础专项训练及答案
- 2026广东珠海市横琴粤澳深度合作区面向社会招聘公办小学筹建人员1人建设考试参考试题及答案解析
- 2026年国药集团春季校园招聘建设笔试模拟试题及答案解析
- 2025年鞍山市立山区城管协管招聘考试试题及答案解析
- 2026四川成都彭州市中医医院招聘14人建设考试参考试题及答案解析
- 2026年蚌埠市城市投资控股集团有限公司所属公司社会招聘建设考试备考题库及答案解析
- 2026年上半年四川省汶川中学校公开考核招聘紧缺学科教师(10人)建设考试参考试题及答案解析
- 屏山县审计局2026年公开招聘编外聘用人员建设笔试模拟试题及答案解析
- 2025年01月上海市金山区储备人才公开招聘25人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 建筑工程的机器人应用
- JY521HART设备通信器培训(2023.08.15)
- 2025江苏常熟服装城集团公司公开招聘工作人员20人高频重点提升(共500题)附带答案详解
- GB/T 12412-2024牦牛绒
- 幼儿园课件之大班语言《青蛙歌》
- T-CBIA 009-2022 饮料浓浆标准
- 护理人文案例分享
- 触电应急桌面演练
- 【百数表】易错专项练习 一下数学
- 2024电力电子变压器调试与试验技术导则
评论
0/150
提交评论