按关键词阅读: 实现 C 算法 ID3
1、目录第一次作业:实现ID3算法21、对程序有关说明22、程序32.1头文件32.2 主程序153、输出结果图:87第一次作业:实现ID3算法1、对程序有关说明操作系统windows xp , 软件Microsoft Visual C+本程序只能计算列数为17的数据集 , 若要更高列数 , 可以更改程序增加级数通过程序实现ID3算法 , 绘出决策树本程序没有计算一级节点就删除无用的数据 , 数据集始终为同一个数据集 , 通过不断增加条件判断来选择节点某一状态的个数来计算信息熵和增益当测试时 , 只需要更换头文件shuju.h即可 。
本程序只能计算列数(即类属个数)不超过17的数据集 , 若要更高列数 , 可以更改程序增加级数 。
ID3 。
2、文件夹中的截图的节点或判决对应的标号与程序运行生成的不一样 , 是因为头文件中第9行#define state 3/类属的最大状态数 , 这一句将3改为2就与图对照 , 仍为3输出也是对的 , 这是由于程序认为所有的节点都对应state个状态 , 对输出显示的节点或判决前的标号理解如下:第一级生成为根节点:a4 , 其状态为y4,n4 。
(在显示上 , y4默认为第0个 , 与下一级0-a11相对应 , n4认为第1个 , 与下一级1-a3相对应)第二级生成节点为:a11, a3。
a11后面的166/188含义为:188是指a11对应的上级节点即根节点的状态y4的个数 , 166是指在满足判决条件下(即class为republican) 。
3、时a11对应的上级节点即根节点的状态y4的个数 , 类似对于a3(2/247)状态为第0组(y11,n11);
第1组(y3,n3), 其中y11认为第0-个 , 与下一级0*state-a7即0-a7相对应,n11认为第1个 , 与下一级0*state+1-a10即1a10相对应,(第1组) y3认为第0个 , 与下一级1*state+0-democrat相对应n3认为第1个 , 与下一级1*state+1-a11相对应 。
其他级排布类似 , 之所以对其输出标号 , 是因为随着级别加深 , 有的节点的某个状态在满足相应条件下个数可能为0 , 不会输出任何标记的东西 , 还有的节点不足state个状态 , 因此采用标号来显示 。
即假设第t1级 。
4、状态分组(为节点的每个节点算一组 , 为判决不算)为:第0组(ax1,ax2.) , 第1组(bx1,bx2.) , 第2组(cx1,cx2,.),第3组(dx1,dx2 , .) , 第4组(e1,e2,.),.则第0组的状态对应t1+1级标号为0*state+0-X(X代表节点或判决) , 0*state+1-X(X代表节点或判决) , .直到0*state+state-1-X(X代表节点或判决);X代表节点或判决第1组的状态对应t1+1级标号为1*state+0-X(对应状态ax1) , 1*state+1-X(对应状态ax2) , .直到1*state+state-1-X(对应状态ax(state-1);第2组的状态对应 。
5、t1+1级标号为2*state+0-X(对应状态bx1) , 2*state+1-X(对应状态bx2) , .直到2*state+state-1-X(对应状态bx1(state-1);.第n组的状态对应t1+1级标号为n*state+0-X(对应第n组的第0个状态,状态从0开始排 , 0 , 1 , 2.) , n*state+1-X(对应第n组的第1个状态).直到n*state+state-1-X(对应第n组的第state-1个状态);若某一状态对应的下一级没有显示其相应的节点或判决 , 则说明该状态对应为空 。
对显示的level 15进行说明 , 输出节点为a14,a15,a14 , 说明第14级的节点的状态第0组:y13,n 。
6、13;
第一组:y14,n14;
第二组:y13,n13 , 第0组对应0*state-ax , 0*state+1-ax,0*state+2-ax.第1组对应1*state-ax , 1*state+1-ax.第2组对应2*state-ax , 2*state+1-ax.其中ax表示节点或判决,若有的状态没有对应节点或判决 , 说明该状态不存在 , 为null 。
其后面的括号里为(1/2),说明该节点对应的上一级节点的对应状态沿着二叉树的状态条件到其共有2个 , 在加上判决条件则只有1个 。
level15 , 16输出为空 , 说明第15级节点的状态没有满足此条件仍成立的节点 , 也不符合判决 , 即就是为空,null 。
该程序在3份数据集中的 。
7、进行了验证 , (只能针对所有的类属的离散的状态) , 在对(任一个)类属的最大状态小于3时 , 且样本类属个数小于17时 , 只需更改shju.h头文件的相关内容(在shuju.h文件进行了说明) , 可以正常运行 。
当样本类属个数大于17时 , 若运行需要添加程序中的相应level 级别程序内容 , 当样本类属个数小于17 , 且对(任一个)类属的最大状态大于3时 , 主程序需要更改一下状态输出语句(在每个级别的最后一句) , 再在shuju.h文件作相应小的改动即可 。
通过与weka软件对数据集的二叉树输出 , 发现程序输出结果没有差错 。
通过对ID3编程实现 , 增加了对数据挖掘的认识 。
2、程序2.1头文件/*shuju.h*/*数据头文 。
8、件 , 存储数据集及行数列数*/下面的一些内容 , 数据集不同可能需要改动/*数据头文件 , 由于采用了枚举类型 , 各类属状态不能表示成相同内容 , 比如 , 类属1有状态yes,类属2也有状态yes,则需要更改表示 , 如一个为yes1,另一个为yes2等等 。
来源:(未知)
【学习资料】网址:/a/2021/0406/0021864141.html
标题:c|c++实现ID3算法