机器学习实验报告(DOC).doc
《机器学习实验报告(DOC).doc》由会员分享,可在线阅读,更多相关《机器学习实验报告(DOC).doc(19页珍藏版)》请在冰豆网上搜索。
《机器学习》
课内实验报告
(1)ID算法实现决策树
2015-2016学年第2学期
专业:
智能科学与技术
班级:
智能1301班
学号:
06133029
姓名:
张争辉
一、实验目的:
理解ID3算法的基本原理,并且编程实现。
二、实验要求:
使用C/C++/MATLAB实现ID3算法。
输入:
若干行,每行5个字符串,表示
OutlookTemperatureHumidityWindPlayball
如上表。
输出:
决策树。
实验结果如下:
输入:
SunnyHotHighWeakNo
SunnyHotHighStrongNo
OvercastHotHighWeakYes
RainMildHighWeakYes
RainCoolNormalWeakYes
RainCoolNormalStrongNo
OvercastCoolNormalStrongYes
SunnyMildHighWeakNo
SunnyCoolNormalWeakYes
RainMildNormalWeakYes
SunnyMildNormalStrongYes
OvercastMildHighStrongYes
OvercastHotNormalWeakYes
RainMildHighStrongNo
输出:
Outlook
RainWind
StrongNo
WeakYes
OvercastYes
SunnyHumidity
NormalYes
HighNo
三、具体实现:
实现算法如下:
#include
#include
#include
#include
usingnamespacestd;
#defineROW14
#defineCOL5
#definelog20.69314718055
typedefstructTNode
{
chardata[15];
charweight[15];
TNode*firstchild,*nextsibling;
}*tree;
typedefstructLNode
{
charOutLook[15];
charTemperature[15];
charHumidity[15];
charWind[15];
charPlayTennis[5];
LNode*next;
}*link;
typedefstructAttrNode
{
charattributes[15];//属性
int attr_Num;//属性的个数
AttrNode*next;
}*Attributes;
char*Examples[ROW][COL]={//"OverCast","Cool","High","Strong","No",
// "Rain","Hot","Normal","Strong","Yes",
"Sunny","Hot","High","Weak","No",
"Sunny","Hot","High","Strong","No",
"OverCast","Hot","High","Weak","Yes",
"Rain","Mild","High","Weak","Yes",
"Rain","Cool","Normal","Weak","Yes",
"Rain","Cool","Normal","Strong","No",
"OverCast","Cool","Normal","Strong","Yes",
"Sunny","Mild","High","Weak","No",
"Sunny","Cool","Normal","Weak","Yes",
"Rain","Mild","Normal","Weak","Yes",
"Sunny","Mild","Normal","Strong","Yes",
"OverCast","Mild","Normal","Strong","Yes",
"OverCast","Hot","Normal","Weak","Yes",
"Rain","Mild","High","Strong","No"
};
char*Attributes_kind[4]={"OutLook","Temperature","Humidity","Wind"};
int Attr_kind[4]={3,3,2,2};
char*OutLook_kind[3]={"Sunny","OverCast","Rain"};
char*Temperature_kind[3]={"Hot","Mild","Cool"};
char*Humidity_kind[2]={"High","Normal"};
char*Wind_kind[2]={"Weak","Strong"};
/*inti_Exampple[14][5]={0,0,0,0,1,
0,0,0,1,1,
1,0,0,1,0,
2,1,0,0,0,
2,2,1,0,0,
2,2,1,1,1,
1,2,1,1,0,
0,1,0,0,1,
0,2,1,0,0,
2,1,1,0,0,
0,1,1,1,0,
1,1,1,1,0,
1,1,1,0,0,
2,1,0,0,1
};*/
voidtreelists(treeT);
voidInitAttr(Attributes&attr_link,char*Attributes_kind[],intAttr_kind[]);
voidInitLink(link&L,char*Examples[][COL]);
voidID3(tree&T,linkL,linkTarget_Attr,Attributesattr);
voidPN_Num(linkL,int&positve,int&negative);
doubleGain(intpositive,intnegative,char*atrribute,linkL,Attributesattr_L);
voidmain()
{
linkLL,p;
Attributesattr_L,q;
treeT;
T=newTNode;
T->firstchild=T->nextsibling=NULL;
strcpy(T->weight,"");
strcpy(T->data,"");
attr_L=newAttrNode;
attr_L->next=NULL;
LL=newLNode;
LL->next=NULL;
//成功建立两个链表
InitLink(LL,Examples);
InitAttr(attr_L,Attributes_kind,Attr_kind);
ID3(T,LL,NULL,attr_L);
cout<<"决策树以广义表形式输出如下:
"<treelists(T);//以广义表的形式输出树
// cout<cout<}
//以广义表的形式输出树
voidtreelists(treeT)
{
treep;
if(!
T)
return;
cout<<"{"<weight<<"}";
cout<data;
p=T->firstchild;
if(p)
{
cout<<"(";
while(p)
{
treelists(p);
p=p->nextsibling;
if(p)cout<<',';
}
cout<<")";
}
}
voidInitAttr(Attributes&attr_link,char*Attributes_kind[],intAttr_kind[])
{
Attributesp;
for(inti=0;i<4;i++)
{
p=newAttrNode;
p->next=NULL;
strcpy(p->attributes,Attributes_kind[i]);
p->attr_Num=Attr_kind[i];
p-