天气决策树ID3.doc
文本预览下载声明
一、上机目的及内容
1.上机内
根据下列给定的14个样本数据,运用ID3算法构造一个是否适宜打网球的天气决策树。
例子编号 属 性 分类 天况 温度 湿度 风况 1 晴 热 大 无 N 2 晴 热 大 有 N 3 多云 热 大 无 P 4 雨 中 大 无 P 5 雨 冷 正常 无 P 6 雨 冷 正常 有 N 7 多云 冷 正常 有 P 8 晴 中 大 无 N 9 晴 冷 正常 无 P 10 雨 中 正常 无 P 11 晴 中 正常 有 P 12 多云 中 大 有 P 13 多云 热 正常 无 P 14 雨 中 大 有 N
1、决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。树上的每一个节点说明了对实例的某个属性的测试,并且该节点的每一个后继分支对应于该属性的一个可能值#include stdio.h
#include math.h
int trnum;
struct tr
{
int key,childs,father,kind;
int child[4];
}tree[100];
int n=14,c[100][5],keykind[10][2],keykind_num;
int p,q;
int captionnum=4;
float mc;
int outtree[5];
int caption[10]={3,3,2,2};
char caption_name[5][10]={天况,温度,湿度,风况,分类};
char key_name[5][3][10]={{晴,多云,雨},{热,中,冷},{大,正常},{无,有},{-,+}};
void initdata()//初始化数据 c[0][0]=1: 表示第一个实例的天况为晴
{
c[0][0]=1;c[0][1]=1;c[0][2]=1;c[0][3]=1;c[0][4]=1;
c[1][0]=1;c[1][1]=1;c[1][2]=1;c[1][3]=2;c[1][4]=1;
c[2][0]=2;c[2][1]=1;c[2][2]=1;c[2][3]=1;c[2][4]=2;
c[3][0]=3;c[3][1]=2;c[3][2]=1;c[3][3]=1;c[3][4]=2;
c[4][0]=3;c[4][1]=3;c[4][2]=2;c[4][3]=1;c[4][4]=2;
c[5][0]=3;c[5][1]=3;c[5][2]=2;c[5][3]=2;c[5][4]=1;
c[6][0]=2;c[6][1]=3;c[6][2]=2;c[6][3]=2;c[6][4]=2;
c[7][0]=1;c[7][1]=2;c[7][2]=1;c[7][3]=1;c[7][4]=1;
c[8][0]=1;c[8][1]=3;c[8][2]=2;c[8][3]=1;c[8][4]=2;
c[9][0]=3;c[9][1]=2;c[9][2]=2;c[9][3]=1;c[9][4]=2;
c[10][0]=1;c[10][1]=2;c[10][2]=2;c[10][3]=2;c[10][4]=2;
c[11][0]=2;c[11][1]=2;c[11][2]=1;c[11][3]=2;c[11][4]=2;
c[12][0]=2;c[12][1]=1;c[12][2]=2;c[12][3]=1;c[12][4]=2;
c[13][0]=3;c[13][1]=2;c[13][2]=1;c[13][3]=2;c[13][4]=1;
tree[0].father=-1;
}
void calculate_pq()//计算在当前条件限制下,p=正例多少个,q=反例多少个,
{
int u,k,i;
p=0;q=0;
for (i=0;in;i++)
{
u=1;
for (k=1;k=keykind_num;k++)
if (c[i][keykind[k][0]]!=keykind[k][1])
{
u=0;
break;
}
if (u)
if (c[i][4]==1) q++;else p++;
}
}
void calculate_keykind(int x)//找出从当前节点出发,所有父节点的属性
{
int i;
i=x;keykind_num=0;
while (tree[i].father=0)
{
keykind_num++;
keykind[keykind_num][0
显示全部