天气决策树
- 格式:doc
- 大小:90.50 KB
- 文档页数:10
一、上机目的及内容1.上机内根据下列给定的14个样本数据,运用ID3算法构造一个是否适宜打网球的天气决策树。
2.上机目的(1)学习用Information Gain构造决策树的方法;(2)在给定的例子上,构造出正确的决策树; (3)理解并掌握构造决策树的技术要点。
二、实验原理及基本技术路线图(方框原理图或程序流程图)1、决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。
树上的每一个节点说明了对实例的某个属性的测试,并且该节点的每一个后继分支对应于该属性的一个可能值。
构造好的决策树的关键在于如何选择好的逻辑判断或属性。
对于同样一组例子,可以有很多决策树能符合这组例子。
人们研究出,一般情况下或具有较大概率地说,树越小则树的预测能力越强。
要构造尽可能小的决策树,关键在于选择恰当的逻辑判断或属性。
由于构造最小的树是NP-难问题,因此只能采取用启发式策略选择好的逻辑判断或属性。
用信息增益度量期望熵最低,来选择分类属性。
公式为算法:创建树的Root 结点如果Examples 都为正,那么返回label=+中的单结点Root 如果Examples 都为反,那么返回lable=-单结点树Root如果Attributes 为空,那么返回单节点树Root ,lable=Examples 中最普遍的目标属性值否则开始∑∑=∈⨯-=-=ci ii v A Values v v p p S Entropy S Entropy SS S Entropy A S Gain 12)(log )()()(),(A<-Attributes中分类能力最好的属性Root的决策属性<-A对于每个可能值在Root下加一个新的分支对应测试A=vi令Example-vi为Examples中满足A属性值为vi的子集如果Examples-vi为空在这个新分支下加一个叶子结点,节点的lable=Examples中最普遍的目标属性值否则在这个新分支下加一个子树ID3(example-vi,target-attribute,attributes-|A|)结束返回 Root算法实现:天气数据存放在data.txt 中;第一行为样本数量14和每个样本中属性的数量4;第二行为每个属性取值的数量;后面n行皆为例子;节点数据结构struct DTNode{int name; //用 1,2,3,4表示选择的属性,0表示不用分类,即叶节点int data[D_MAX+1]; //表示此节点包含的数据,data[i]=1,表示包含二维数组data[][]中的第i条数据int leaf; //leaf=1 正例叶节点;leaf=2 反例叶节点;leaf=0不是节点 int c; //c=1 正类;c=0 反类DTNode *child[P+1]; //按属性值的个数建立子树};定义函数void Read_data() //从数据文件data.txt中读入训练数据DT_pointer Create_DT(DT_pointer Tree,int name,int value) //创建决策树int chose(int *da) //选择分类属性float Gain(int *da,int p) //计算以p属性分类的期望熵float Entropy(int *da) //计算数据的熵int test_leaf(int *da) //测试节点属性void Out_DT(DT_pointer Tree) //用线性表形式输出建立的决策树int Class(int *da) //对输入的测试样本分类全局变量FILE *fp;int p_num; //属性的数量int pi[P_MAX+1]; //每个属性有几种取值int d_num; //数据的数量int data[P_MAX+1][D_MAX+1];//存储训练数据三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)#include "stdio.h"#include "math.h"int trnum;struct tr{int key,childs,father,kind;int child[4];}tree[100];int n=14,c[100][5],keykind[10][2],keykind_num;int p,q;int captionnum=4;float mc;int outtree[5];int caption[10]={3,3,2,2};char caption_name[5][10]={"天况","温度","湿度","风况","分类"};char key_name[5][3][10]={{"晴","多云","雨"},{"热","中","冷"},{"大","正常"},{"无","有"},{"-","+"}};void initdata()//初始化数据c[0][0]=1: 表示第一个实例的天况为晴{c[0][0]=1;c[0][1]=1;c[0][2]=1;c[0][3]=1;c[0][4]=1;c[1][0]=1;c[1][1]=1;c[1][2]=1;c[1][3]=2;c[1][4]=1;c[2][0]=2;c[2][1]=1;c[2][2]=1;c[2][3]=1;c[2][4]=2;c[3][0]=3;c[3][1]=2;c[3][2]=1;c[3][3]=1;c[3][4]=2;c[4][0]=3;c[4][1]=3;c[4][2]=2;c[4][3]=1;c[4][4]=2;c[5][0]=3;c[5][1]=3;c[5][2]=2;c[5][3]=2;c[5][4]=1;c[6][0]=2;c[6][1]=3;c[6][2]=2;c[6][3]=2;c[6][4]=2;c[7][0]=1;c[7][1]=2;c[7][2]=1;c[7][3]=1;c[7][4]=1;c[8][0]=1;c[8][1]=3;c[8][2]=2;c[8][3]=1;c[8][4]=2;c[9][0]=3;c[9][1]=2;c[9][2]=2;c[9][3]=1;c[9][4]=2;c[10][0]=1;c[10][1]=2;c[10][2]=2;c[10][3]=2;c[10][4]=2;c[11][0]=2;c[11][1]=2;c[11][2]=1;c[11][3]=2;c[11][4]=2;c[12][0]=2;c[12][1]=1;c[12][2]=2;c[12][3]=1;c[12][4]=2;c[13][0]=3;c[13][1]=2;c[13][2]=1;c[13][3]=2;c[13][4]=1;tree[0].father=-1;}void calculate_pq()//计算在当前条件限制下,p=正例多少个,q=反例多少个,{int u,k,i;p=0;q=0;for (i=0;i<n;i++){u=1;for (k=1;k<=keykind_num;k++)if (c[i][keykind[k][0]]!=keykind[k][1]){u=0;break;}if (u)if (c[i][4]==1) q++;else p++;}}void calculate_keykind(int x)//找出从当前节点出发,所有父节点的属性{int i;i=x;keykind_num=0;while (tree[i].father>=0){keykind_num++;keykind[keykind_num][0]=tree[tree[i].father].key;keykind[keykind_num][1]=tree[i].kind;i=tree[i].father;}}float calculate_mc(float x,float y)//计算相对于当前正例和反例的熵{if (x==0||y==0) return 0;return -(x/(x+y))*(log(x/(x+y))/log(2))-(y/(x+y))*(log(y/(x+y))/log(2));}float calculate_gain(int x,int num,float mc1)//计算以属性x对当前节点进行决策的gain值{float bc=0;int i;keykind[keykind_num][0]=x;for (i=0;i<caption[x];i++)//计算B(C,属性X){keykind[keykind_num][1]=i+1;calculate_pq();bc=bc+((p+q)/(num+0.0))*calculate_mc(p,q);}return mc1-bc;}int findkey(int x)//找出当前点x的决策属性{int not_use[10],i;calculate_keykind(x);//找出X节点及其父节点的所有决策calculate_pq();//计算正反实例的个数if (p==0||q==0) return -1;mc=calculate_mc(p,q);//计算正反实例的熵int num=p+q,nowkey=-2;float max=-1,ans;for (i=0;i<=captionnum;i++) not_use[i]=1;for (i=1;i<=keykind_num;i++) not_use[keykind[i][0]]=0;keykind_num++;for (i=0;i<captionnum;i++)//枚举法一次讨论每个可用属性对X节点进行决策的gain值,取gain 值最大的属性为决策属性if (not_use[i]){ans=calculate_gain(i,num,mc);if (ans>max){max=ans;nowkey=i;}}return nowkey;}void output_con(int x)//输出满足X节点以及其所有父节点的决策的实例集合{calculate_keykind(x);int u,k,i;p=0;q=0;for (i=0;i<n;i++){u=1;for (k=1;k<=keykind_num;k++)if (c[i][keykind[k][0]]!=keykind[k][1]){u=0;break;}if (u){for (k=0;k<captionnum;k++)printf("%s,",key_name[k][c[i][k]-1]);printf("%s\n",key_name[k][c[i][k]-1]);}}}void output(int x,int deep)//输出X节点的实例,如果X不是叶子节点,则递归,一直找到叶节点才输出满足相应决策的实例集合{outtree[deep]=x;if (tree[x].childs>=0){for (int i=0;i<=tree[x].childs;i++)output(tree[x].child[i],deep+1);}else{printf("\n");for (int j=0;j<=deep-1;j++){printf("%s(%s)-->",caption_name[tree[outtree[j]].key],key_name[tree[outtree[j]].key][tree[outtree[j+1]].ki nd-1]);}printf("\n");output_con(outtree[deep]);}}void main(){int i;initdata();trnum=0;int open=0;while (open<=trnum)//open用来一次访问决策树的每个节点//每次访问一个节点,就对其进行决策,如果决策成功,则将新的点加入到决策树中,直至不能再扩展{tree[open].key=findkey(open);//寻找决策属性tree[open].childs=-1;if (tree[open].key>=0){for (i=0;i<caption[tree[open].key];i++)//决策成功,向决策树加入新的节点{trnum++;tree[trnum].kind=i+1;tree[open].childs++;tree[open].child[tree[open].childs]=trnum;tree[trnum].father=open;}}open++;}output(0,0);}五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
ID3算法是一种用于构建决策树的经典机器学习算法,它可以根据给定的数据集,自动构建出一个决策树模型,用于对未知数据进行分类。
在实际应用中,ID3算法被广泛应用于各种领域,包括天气预测和决策制定。
本文将以天气和是否适合打球这一主题为例,具体介绍ID3算法对于天气-打球关系的决策树。
1. 背景介绍天气对于人们的日常生活有着重要的影响,尤其是对于室外活动,比如打球。
在实际生活中,人们往往会根据当天的天气情况来决定是否适合进行打球活动。
而要根据天气来进行决策,就需要建立一个天气-打球的决策模型。
而ID3算法正是用来构建这样的决策模型的利器。
2. 数据采集为了构建天气-打球的决策树模型,首先需要收集一定量的天气相关数据和打球相关数据。
可以记录每天的天气情况(如晴天、阴天、下雨)、温度、湿度等天气指标,以及当天是否适合进行打球活动(是/否)。
通过收集大量的这样的数据,就可以构建出一个合适的数据集。
3. 分析数据在收集到足够的数据后,就可以开始分析这些数据,寻找天气与打球之间的关系。
ID3算法的核心思想是选择最佳的属性来进行划分,以便对数据进行分类。
在本例中,可以将天气指标(如晴天、阴天、下雨)作为属性,将打球活动(是/否)作为分类结果,然后根据ID3算法来选择最佳的属性进行数据划分,从而构建出决策树模型。
4. 构建决策树在进行数据分析后,就可以利用ID3算法来构建天气-打球的决策树。
ID3算法通过计算信息增益来确定最佳的属性,然后进行递归地对数据进行划分,直到构建出完整的决策树模型。
在这个过程中,ID3算法会根据不同的属性值来确定最佳的决策点,从而使得对于未知天气情况的打球决策变得更加准确。
5. 评估和优化构建出决策树模型后,还需要对模型进行评估和优化。
可以利用交叉验证等方法来检验模型的准确性,并根据验证结果对模型进行调整和优化。
这一步骤是非常重要的,可以帮助进一步提高决策树模型的预测能力。
6. 应用和推广构建出决策树模型后,可以将其应用到实际的天气预测和打球决策中。
决策树的三种算法一、决策树算法的简单介绍决策树算法就像是一个超级智能的树状决策指南。
你可以把它想象成一棵倒着长的树,树根在上面,树枝和树叶在下面。
它的任务呢,就是根据不同的条件来做出各种决策。
比如说,你想决定今天穿什么衣服,天气就是一个条件,如果天气冷,你可能就选择穿厚衣服;如果天气热,那薄衣服就比较合适啦。
决策树算法在很多地方都超级有用,像预测一个人会不会买某个商品,或者判断一个邮件是不是垃圾邮件之类的。
二、决策树的三种算法1. ID3算法这个算法就像是一个很会找重点的小机灵鬼。
它主要是根据信息增益来构建决策树的。
啥是信息增益呢?就是通过计算某个属性带来的信息量的增加。
比如说,在判断一个水果是苹果还是香蕉的时候,颜色这个属性可能就有很大的信息增益。
如果一个水果是红色的,那它是苹果的可能性就比较大。
ID3算法会优先选择信息增益大的属性来作为树的节点,这样就能更快更准地做出决策啦。
不过呢,这个算法也有个小缺点,就是它比较容易对噪声数据敏感,就像一个很敏感的小娃娃,稍微有点风吹草动就可能受到影响。
2. C4.5算法C4.5算法就像是ID3算法的升级版。
它在ID3算法的基础上做了一些改进。
它不仅仅考虑信息增益,还考虑了信息增益率。
这就好比是一个更加全面考虑的智者。
通过考虑信息增益率,它能够更好地处理那些属性值比较多的情况。
比如说,在一个数据集中有一个属性有很多很多不同的值,C4.5算法就能比ID3算法更好地处理这种情况,不会轻易地被这种复杂情况给弄晕。
而且C4.5算法还能够处理连续的属性值,这就像是它多了一项特殊的技能,让它在更多的情况下都能发挥作用。
3. CART算法CART算法又有自己的特点。
它使用的是基尼系数来选择属性进行划分。
基尼系数就像是一个衡量公平性的小尺子,在决策树这里,它是用来衡量数据的纯度的。
如果基尼系数越小,说明数据越纯,就越容易做出准确的决策。
CART算法既可以用于分类问题,就像前面说的判断水果是苹果还是香蕉这种,也可以用于回归问题,比如预测房价之类的。
人工智能决策树例题经典案例一、经典案例:天气预测决策树在天气预测中有广泛应用,下面是一个关于是否适宜进行户外运动的示例:1. 数据收集:- 温度:高(>30℃)/中(20℃-30℃)/低(<20℃)- 降水:是/否- 风力:高/中/低- 天气状况:晴朗/多云/阴天/雨/暴雨- 应该户外运动:是/否2. 构建决策树:- 根据温度将数据分为三个分支:高温、中温、低温- 在每个分支中,继续根据降水、风力和天气状况进行划分,最终得到是否适宜户外运动的决策3. 决策树示例:温度/ / \高温中温低温/ | | \ |降水无降水风力适宜/ \ | | / \是否高中低| |不适宜适宜- 如果温度是高温且有降水,则不适宜户外运动- 如果温度是高温且无降水,则根据风力判断,如果风力是高,则不适宜户外运动,如果风力是中或低,则适宜户外运动 - 如果温度是中温,则不论降水和风力如何,都适宜户外运动- 如果温度是低温,则需要考虑风力,如果风力是高,则适宜户外运动,如果风力是中或低,则不适宜户外运动4. 参考内容:决策树的构建和应用:决策树通过对输入特征进行划分,构建了一棵树形结构,用于解决分类或回归问题。
构建决策树主要包括数据预处理、特征选择、划分策略和停止条件等步骤。
特征选择可以使用信息增益、基尼指数等算法,划分策略可以使用二叉划分或多叉划分,停止条件可以是叶子节点纯度达到一定阈值或达到预定的树深度。
决策树的应用包括数据分类、特征选择和预测等任务。
天气预测案例中的决策树:将天气预测问题转化为分类问题,通过构建决策树,可以得到识别是否适宜户外运动的规则。
决策树的决策路径可以用流程图或树状图表示,帮助理解和解释决策过程。
决策树的节点表示特征值,分支表示判断条件,叶子节点表示分类结果。
决策树的生成算法可以基于启发式规则或数学模型,如ID3、C4.5、CART等。
决策树的优缺点:决策树具有可解释性强、易于理解和实现、能处理非线性关系等优点。
决策树过拟合例子
以下是 9 条关于决策树过拟合例子:
1. 你看哈,就像预测天气的时候,决策树可能会过度依赖某一天的特殊情况,比如突然下了一场特别大的暴雨,然后就把这个当成常态啦!这不是就过拟合了嘛。
2. 想想选水果那事儿,决策树可能因为某个苹果上有个小小的斑点就判定它是坏的,而忽略了其他好的地方呀,这不就是过拟合了嘛!
3. 嘿,就比如判断一个人爱不爱运动,决策树如果因为这个人某一天跑了个步,就说他超级爱运动,这是不是很不准确,明显过拟合啦!
4. 哎呀呀,在预测股票走势的时候,要是决策树仅凭某几次特殊的波动就得出很离谱的结论,这可咋整,不就是过拟合了嘛。
5. 你想想,用决策树预测学生的成绩,如果因为一次考试超常发挥就觉得会一直这么好,那可不行呀,过拟合啦!
6. 就像判断一种食物好不好吃,决策树不能因为你某一顿特别饿的时候觉得好吃,就一直说好吃呀,这不是过拟合了是啥。
7. 哟呵,判断一部电影好不好看,要是决策树因为你在心情特别好的时候看觉得好,就一直这么认为,这也太容易过拟合啦!
8. 就说判断一个地方适不适合居住,决策树可不能因为你某一次偶然的喜欢就认定啦,这不是妥妥的过拟合嘛。
9. 最后呀,我觉得决策树过拟合真的是要很小心呢,不然得出的结果可就太不靠谱啦!。
人工智能实验报告天气决策树解读
天气决策树是人工智能领域中一种常见的分类与决策技术,它利用决策树(decision tree)的思想结构,将气象数据的空间空间构建为一个分层结构,按照一定的标准来衡量这些数据,最终将气象状况确定为特定的天气状况。
它是一种基于规则的机器学习方法,用于从海量历史气象数据中学习到特定地区的天气预报规律,以便预测该地区的未来天气情况。
天气决策树的基本原理是构建一棵树,按照特定的决策规则来对气象数据进行分类,以最终把气象状况确定为特定的天气状况。
其具体过程如下:
1.数据采集:根据给定的特定地区,搜集这个地区过去一段时间内的气象数据,包括温度、湿度、风速、降水量等多个要素。
2.建立决策树:以一定的规则来建立决策树,将特定地区的所有气象数据按照一定的分类标准构建分层结构。
每一层决策节点都以特定的条件分割数据,最终将气象状况确定为特定天气状况。
3.学习与评估:建立完决策树后,按照一定的标准对决策树估分类的准确率进行评估,例如按照日平均温、降水量、湿度、气温最高和最低等特征,以及每个节点预测气象状况的准确度等,来评估决策树的准确性。
精品文档供您编辑修改使用专业品质权威编制人:______________审核人:______________审批人:______________编制单位:____________编制时间:____________序言下载提示:该文档是本团队精心编制而成,希望大家下载或复制使用后,能够解决实际问题。
文档全文可编辑,以便您下载后可定制修改,请根据实际需要进行调整和使用,谢谢!同时,本团队为大家提供各种类型的经典资料,如办公资料、职场资料、生活资料、学习资料、课堂资料、阅读资料、知识资料、党建资料、教育资料、其他资料等等,想学习、参考、使用不同格式和写法的资料,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!And, this store provides various types of classic materials for everyone, such as office materials, workplace materials, lifestylematerials, learning materials, classroom materials, reading materials, knowledge materials, party building materials, educational materials, other materials, etc. If you want to learn about different data formats and writing methods, please pay attention!基于决策树算法的鄂东地区冰雹识别技术1. 引言气象灾难对人们的生命财产安全造成了巨大恐吓。
昆明理工大学信息工程与自动化学院学生实验报告(2011 —2012 学年第 1 学期)课程名称:人工智能开课实验室:信自楼计算机机房444 2011 年12月 23日一、上机目的及内容1.上机内根据下列给定的14个数据,运用Information Gain构造一个天气决策树。
2.上机目的(1)学习用Information Gain构造决策树的方法;(2)在给定的例子上,构造出正确的决策树;(3)理解并掌握构造决策树的技术要点。
二、实验原理及基本技术路线图(方框原理图或程序流程图)1、决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。
树上的每一个节点说明了对实例的某个属性的测试,并且该节点的每一个后继分支对应于该属性的一个可能值。
构造好的决策树的关键在于如何选择好的逻辑判断或属性。
对于同样一组例子,可以有很多决策树能符合这组例子。
人们研究出,一般情况下或具有较大概率地说,树越小则树的预测能力越强。
要构造尽可能小的决策树,关键在于选择恰当的逻辑判断或属性。
由于构造最小的树是NP-难问题,因此只能采取用启发式策略选择好的逻辑判断或属性。
用信息增益度量期望熵最低,来选择分类属性。
公式为算法:创建树的Root 结点如果Examples 都为正,那么返回label=+中的单结点Root 如果Examples 都为反,那么返回lable=-单结点树Root如果Attributes 为空,那么返回单节点树Root ,lable=Examples 中最普遍的目标属性值否则开始 A<-Attributes 中分类能力最好的属性 Root 的决策属性<-A对于每个可能值在Root 下加一个新的分支对应测试A=vi令Example-vi 为Examples 中满足A 属性值为vi 的子集 如果Examples-vi 为空在这个新分支下加一个叶子结点,节点的lable=Examples 中最普遍的目标属性值否则在这个新分支下加一个子树ID3(example-vi,target-attribute,attributes-|A|)结束 返回 Root∑∑=∈⨯-=-=ci ii v A Values v v p p S Entropy S Entropy SS S Entropy A S Gain 12)(log )()()(),(算法实现:天气数据存放在data.txt 中;第一行为样本数量14和每个样本中属性的数量4;第二行为每个属性取值的数量;后面n行皆为例子;节点数据结构struct DTNode{int name; //用 1,2,3,4表示选择的属性,0表示不用分类,即叶节点int data[D_MAX+1]; //表示此节点包含的数据,data[i]=1,表示包含二维数组data[][]中的第i条数据int leaf; //leaf=1 正例叶节点;leaf=2 反例叶节点;leaf=0不是节点 int c; //c=1 正类;c=0 反类DTNode *child[P+1]; //按属性值的个数建立子树};定义函数void Read_data() //从数据文件data.txt中读入训练数据DT_pointer Create_DT(DT_pointer Tree,int name,int value) //创建决策树int chose(int *da) //选择分类属性float Gain(int *da,int p) //计算以p属性分类的期望熵float Entropy(int *da) //计算数据的熵int test_leaf(int *da) //测试节点属性void Out_DT(DT_pointer Tree) //用线性表形式输出建立的决策树int Class(int *da) //对输入的测试样本分类全局变量FILE *fp;int p_num; //属性的数量int pi[P_MAX+1]; //每个属性有几种取值int d_num; //数据的数量int data[P_MAX+1][D_MAX+1];//存储训练数据三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)#include "stdio.h"#include "math.h"int trnum;struct tr{int key,childs,father,kind;int child[4];}tree[100];int n=14,c[100][5],keykind[10][2],keykind_num;int p,q;int captionnum=4;float mc;int outtree[5];int caption[10]={3,3,2,2};char caption_name[5][10]={"天况","温度","湿度","风况","分类"};char key_name[5][3][10]={{"晴","多云","雨"},{"热","中","冷"},{"大","正常"},{"无","有"},{"-","+"}};void initdata()//初始化数据c[0][0]=1: 表示第一个实例的天况为晴{c[0][0]=1;c[0][1]=1;c[0][2]=1;c[0][3]=1;c[0][4]=1;c[1][0]=1;c[1][1]=1;c[1][2]=1;c[1][3]=2;c[1][4]=1;c[2][0]=2;c[2][1]=1;c[2][2]=1;c[2][3]=1;c[2][4]=2;c[3][0]=3;c[3][1]=2;c[3][2]=1;c[3][3]=1;c[3][4]=2;c[4][0]=3;c[4][1]=3;c[4][2]=2;c[4][3]=1;c[4][4]=2;c[5][0]=3;c[5][1]=3;c[5][2]=2;c[5][3]=2;c[5][4]=1;c[6][0]=2;c[6][1]=3;c[6][2]=2;c[6][3]=2;c[6][4]=2;c[7][0]=1;c[7][1]=2;c[7][2]=1;c[7][3]=1;c[7][4]=1;c[8][0]=1;c[8][1]=3;c[8][2]=2;c[8][3]=1;c[8][4]=2;c[9][0]=3;c[9][1]=2;c[9][2]=2;c[9][3]=1;c[9][4]=2;c[10][0]=1;c[10][1]=2;c[10][2]=2;c[10][3]=2;c[10][4]=2;c[11][0]=2;c[11][1]=2;c[11][2]=1;c[11][3]=2;c[11][4]=2;c[12][0]=2;c[12][1]=1;c[12][2]=2;c[12][3]=1;c[12][4]=2;c[13][0]=3;c[13][1]=2;c[13][2]=1;c[13][3]=2;c[13][4]=1;tree[0].father=-1;}void calculate_pq()//计算在当前条件限制下,p=正例多少个,q=反例多少个,{int u,k,i;p=0;q=0;for (i=0;i<n;i++){u=1;for (k=1;k<=keykind_num;k++)if (c[i][keykind[k][0]]!=keykind[k][1]){u=0;break;}if (u)if (c[i][4]==1) q++;else p++;}}void calculate_keykind(int x)//找出从当前节点出发,所有父节点的属性{int i;i=x;keykind_num=0;while (tree[i].father>=0){keykind_num++;keykind[keykind_num][0]=tree[tree[i].father].key;keykind[keykind_num][1]=tree[i].kind;i=tree[i].father;}}float calculate_mc(float x,float y)//计算相对于当前正例和反例的熵{if (x==0||y==0) return 0;return -(x/(x+y))*(log(x/(x+y))/log(2))-(y/(x+y))*(log(y/(x+y))/log(2));}float calculate_gain(int x,int num,float mc1)//计算以属性x对当前节点进行决策的gain值{float bc=0;int i;keykind[keykind_num][0]=x;for (i=0;i<caption[x];i++)//计算B(C,属性X){keykind[keykind_num][1]=i+1;calculate_pq();bc=bc+((p+q)/(num+0.0))*calculate_mc(p,q);}return mc1-bc;}int findkey(int x)//找出当前点x的决策属性{int not_use[10],i;calculate_keykind(x);//找出X节点及其父节点的所有决策calculate_pq();//计算正反实例的个数if (p==0||q==0) return -1;mc=calculate_mc(p,q);//计算正反实例的熵int num=p+q,nowkey=-2;float max=-1,ans;for (i=0;i<=captionnum;i++) not_use[i]=1;for (i=1;i<=keykind_num;i++) not_use[keykind[i][0]]=0;keykind_num++;for (i=0;i<captionnum;i++)//枚举法一次讨论每个可用属性对X节点进行决策的gain值,取gain 值最大的属性为决策属性if (not_use[i]){ans=calculate_gain(i,num,mc);if (ans>max){max=ans;nowkey=i;}}return nowkey;}void output_con(int x)//输出满足X节点以及其所有父节点的决策的实例集合{calculate_keykind(x);int u,k,i;p=0;q=0;for (i=0;i<n;i++){u=1;for (k=1;k<=keykind_num;k++)if (c[i][keykind[k][0]]!=keykind[k][1]){u=0;break;}if (u){for (k=0;k<captionnum;k++)printf("%s,",key_name[k][c[i][k]-1]);printf("%s\n",key_name[k][c[i][k]-1]);}}}void output(int x,int deep)//输出X节点的实例,如果X不是叶子节点,则递归,一直找到叶节点才输出满足相应决策的实例集合{outtree[deep]=x;if (tree[x].childs>=0){for (int i=0;i<=tree[x].childs;i++)output(tree[x].child[i],deep+1);}else{printf("\n");for (int j=0;j<=deep-1;j++){printf("%s(%s)-->",caption_name[tree[outtree[j]].key],key_name[tree[outtree[j]].key][tree[outtree[j+1]].ki nd-1]);}printf("\n");output_con(outtree[deep]);}}void main(){int i;initdata();trnum=0;int open=0;while (open<=trnum)//open用来一次访问决策树的每个节点//每次访问一个节点,就对其进行决策,如果决策成功,则将新的点加入到决策树中,直至不能再扩展{tree[open].key=findkey(open);//寻找决策属性tree[open].childs=-1;if (tree[open].key>=0){for (i=0;i<caption[tree[open].key];i++)//决策成功,向决策树加入新的节点{trnum++;tree[trnum].kind=i+1;tree[open].childs++;tree[open].child[tree[open].childs]=trnum;tree[trnum].father=open;}}open++;}output(0,0);}五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。