1 / 15
文档名称:

ID3算法.doc

格式:doc   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

ID3算法.doc

上传人:xxj16588 2016/6/7 文件大小:0 KB

下载得到文件列表

ID3算法.doc

文档介绍

文档介绍:ID3 算法#include<> #include<> #include<> #include<> #include<> #include<> #define N 500 //N 定义为给定训练数据的估计个数#define M6 //M 定义为候选属性的个数#define c2 // 定义 c=2 个不同类#define s_max 5 // 定义 s_max 为每个候选属性所划分的含有最大的子集数 int av[M]={3,3,2,3,4,2}; int s[N][M+2],a[N][M+2]; // 数组 s[j] 用来记录第 i 个训练样本的第 j 个属性值 int path_a[N][M+1],path_b[N][M+1]; //用 path_a[N][M+1],path_b[N][M+1] 记录每一片叶子的路径 int count_list=M; //count_list 用于记录候选属性个数 int count=-1; //用 count+1 记录训练样本数 int attribute_test_list[M]; int leaves=1;// 用数组 ss[k][j] 表示第k 个候选属性划分的子集Sj 中类 Ci 的样本数,数组的具体大小可根据给定训练数据调整 int ss[M][c][s_max]; //第k 个候选属性划分的子集 Sj 中样本属于类 Ci 的概率 double p[M][c][s_max];//count_s[j] 用来记录第i 个候选属性的第 j 个子集中样本个数 int count_s[M][s_max];// 分别定义 E[M] , Gain[M] 表示熵和熵的期望压缩 double E[M]; double Gain[M];// 变量 max_Gain 用来存储最大的信息增益 double max_Gain; int Trip=-1; //用 Trip 记录每一个叶子递归次数 int most; void Generate_decision_tree(int b[][M+2],int bn,int attribute_test_list[],int sn,int ai,int aj) { // 定义数组 a 记录目前待分的训练样本集, 定义数组 b 记录目前要分结点中所含的训练样本集//same_class 用来记数,判别 samples 是否都属于同一个类 Trip+=1;// 用 Trip 记录每一个叶子递归次数 path_a[leaves][Trip]=ai;// 用 path_a[N][M+1],path_b[N][M+1] 记录每一片叶子的路径 path_b[leaves][Trip]=aj; int same_class,i,j,k,l,ll,lll; if(bn==0) {// 待分结点的样本集为空时,加上一个树叶,标记为训练集中最普通的类// 记录路径与前一路径相同的部分 for(i=1;i<Trip;i++) if(path_a[leaves][i]==0){ path_a[leaves][i]=path_a[leaves-1][i]; path_b[leaves][i]=path_b[leaves-1][i]; } cout<<'\n'<<"IF "; for(i=1;i<=Trip;i++) if(i==1) cout<<"a["<<path_b[leaves][i]<<"]="<<path_a[leaves][i]; else cout<<"^a["<<path_b[leaves][i]<<"]="<<path_a[leaves][i]; cout<<" THEN class="<<most; path_a[leaves][0]=most; // 修改树的深度 if(path_a[leaves][Trip]==av[path_b[leaves][Trip]-1]) for(i=Trip;i>1;i--) if(path_a[leaves][i]==av[path_b[leaves][i]-1]) Trip-=1; else break; Trip-=1; leaves+=1; } else { same_class=1; for(i=0;i<bn-1;i++) if(b[i][0]==b[i+1][0]) same_class+=1; if(same_class==bn){// 待分样本集属于同一类时以该类标记// 记录路径与前一路径相同的部分 for(i=1;i<Trip;i++) if(path_a[leaves][i]==0){ path_a[leaves