资源描述:
《天气决策树id3》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一、上机目的及内容1.上机内根据下列给定的14个样木数据,运用ID3算法构造一个是否适宜打IM球的天气决策树。例子编号属性分类天况温度湿度风况1晴执/»\大无N2晴热大有N3多云执大无P4雨中大无P5雨冷正常无P6雨冷正常有N7多云冷正常有P8晴中大无N9晴冷正常无P10雨中正常无P11晴中正常有P12多云中大有P13多云执正常无P14雨中大有NN:不适合打,P:适宜打2.上机目的(1)学〉』用InformationGain构造决策树的方法;(1)在给定的例子上,构造出正确的决策树;(2)理解并掌握构造决策树的技术要点。二、实验原理及基本技术路线图(方框原理图或程序流程图)1、决
2、策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。树上的每一个节点说明了对实例的某个属性的测试,并II该节点的每一个后继分支对应于该属性的一个可能值。构造好的决策树的关键在于如何选择好的逻辑判断或属性。对于同样一组例子,可以有很多决策树能符合这组例子。人们研宄出,一般情况不或具有较大概率地说,树越小则树的预测能力越强。要构造尽可能小的决策树,关键在于选择恰当的逻辑判断或属性。由于构造最小的树是NP-难问题,因此只能采取用启发式策略选择好的逻辑判断或属性。用信息增益度量期望熵最低,来选择分类属性。公式为kIGain(S.A)=Entropy(S)-^En
3、tropy(Sv)cEntropy(S、=/?zxlog2/=!算法:创建树的Root结点如果Examples都为正,那么返回label=+屮的单结点Root如梁Examples都为反,那么返回lable=-单结点树Root如果Attributes为空,那么返回单节点树Root,lable=Examples中最普遍的目标属性值否则开始△〈-Attributes中分类能力最好的属性Root的决策属性〈-A对于每个可能值在Root下加一个新的分支对应测试A=vi令Example-vi为Examples中满足A属性值为vi的子集如果Examples-vi为空在这个新分支下加一个叶子结点,
4、节点的lable=Examples中最普遍的目标属性值否则在这个新分支下加一个子树ID3(example-vi,target-attribute,attributes-A)结束返回Root算法实现:天气数据存放在data,txt中;第一行为样本数量14和每个样本屮属性的数量4;第二行为每个属性取值的数量;后面n行皆为例子;节点数据结构structDTNodeintname;//用1,2,3,4表示选择的属性,0表示不用分类,即叶节点intdata[D_MAX+l];//表示此节点包含的数据,data[i]=l,表示包含二维数组data[][]中的第i条数据intleaf;//lea
5、f=l正例叶节点;leaf=2反例叶节点;leaf=0不是节点intc;//c=l正类;c=0反类DTNode*child[P+l];//按属性值的个数建立子树定义函数voidReaddata()//从数据文件data,txt中读入训练数据DTpointerCreate_DT(DTpointerTree,intname,intvalue)//创建决策树intchose(int*da)//选择分类属性floatGain(int氺da,intp)//计算以p属性分类的期望嫡floatEntropy(int氺da)//计算数据的熵inttestleaf(int*da)//测试节点属性vo
6、idOut_DT(DT_pointerTree)//用线性表形式输出建立的决策树intClass(int*da)//对输入的测试样本分类全局变量FILE*fp;intp_num;//属性的数量intpi[PJWX+1];//每个属性有几种取值intdnum;//数据的数量intdata[P一MAX+1][DJIAX+l];//存储训练数据三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUALC++6.0软件实验方法、步骤(或:程序代码或操作过程)#include"stdio.h”#include"math.h"inttrnum;structtr{intkey,
7、childs,father,kind;intchildl4J;}tree[100];intn=14,c[100][5],keykind[10][2],keykind_num;intp,q;intcaptionnum=4;floatme;intouttree[5];intcaption[10]={3,3»2,2};charcaption_name[5][10]={"天况","温度","湿度","风况","分类"};charkey_name[5][3][10]={{"晴"