机器学习决策树 ID3算法的源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器学习决策树ID3算法的源代码上(VC6.0测试通过)
发布: 2009-4-16 11:42 | 作者: 天涯| 来源: 资讯
[i=s] 本帖最后由天涯于2009-4-17 13:03 编辑
这个的重要,不用多说了吧,有什么意见和建议跟帖留言啊,哈,觉得好,请顶一个
第一部分:
#include
#include
#include
#include
#include
#include
#define N 500 //N定义为给定训练数据的估计个数
#define M 6 //M定义为候选属性的个数
#define c 2 //定义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_list1[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 main(void)
{
int i,j=-1,k,temp,l,count_test,true_class=0,count_train;
char trainname[256],testname[256];
int test[N][8];
cout<<"请输入训练集文件名:";
cin>>trainname;
ifstream trainfile;
trainfile.open(trainname,ios::in|ios::nocreate);
if(!trainfile){
cout<<"无法使用训练集,请重试!"<<'\n';
exit(1);
}
//读取训练集
while(trainfile>>temp){
j=j+1;
k=j%(M+2);
if(k==0||j==0) count+=1;
//count为训练集的第几个,k代表室第几个属性
switch(k){
case 0:s[count][0]=temp;
break;
case 1:s[count][1]=temp;
break;
case 2:s[count][2]=temp;
break;
case 3:s[count][3]=temp;
break;
case 4:s[count][4]=temp;
break;
case 5:s[count][5]=temp;
break;
case 6:s[count][6]=temp;
break;
case 7:s[count][7]=temp;
break;
}
}
trainfile.close();
//输出训练集
for(i=0;i<=count;i++){
if(i%2==0) cout<<'\n';
for(j=0;j cout< } //most记录训练集中哪类样本数比较多,以用于确定递归终止时不确定的类别for(i=0,j=0,k=0;i<=count;i++){ if(s[0]==0) j+=1; else k+=1; } if(j>k) most=0; else most=1; //count_train记录训练集的样本数 count_train=count+1; //训练的属性 for(i=0;i attribute_test_list1=i+1; //首次调用递归函数,即是生成根结点的分支 Generate_decision_tree(s,count+1,attribute_test_list1,count_list,0,0); cout<<'\n'<<"叶子结点的个数为:"< cout<<"请输入测试集文件名:"; cin>>testname; ifstream testfile; testfile.open(testname,ios::in|ios::nocreate); if(!testfile){ cout<<"无法使用训练集,请重试!"<<'\n'; exit(1); } count_test=0; j=-1; //读取测试集数据 while(testfile>>temp){ j=j+1; k=j%(M+2); if(k==0) count_test+=1; switch(k){ case 0:test[count_test][7]=temp; break; case 1:test[count_test][1]=temp; break; case 2:test[count_test][2]=temp; break; case 3:test[count_test][3]=temp;