机器学习决策树 ID3算法的源代码

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档