样本从网上找的。
要求样本为:对于NBA选手的各项能力,预测出他所应得的薪资水平。
ID3.h:
#ifndef ID3_h
#define ID3_h
#include <iostream>
#include <string>
#include <math.h>
#include <vector>
using namespace std;
using namespace std;
#define Dataset vector< vector<int> > //数据
const int Pro_num = 5;//属性的数量-1 因为最前保存了答案
const int Data_num = 14;//数据的数量
const int Ans_num = 2;//答案的数量
const int Pre_zinum[Pro_num]={0,3,3,2,2}; // 属性的种数 //比如outlook有3种
class treedata{
public:
Dataset data;
int use[Pro_num];
};
class Node{
public:
int At;//接下来要用的属性 0就有答案了。
int ans;//是答案节点
int pre;//选择了什么属性
vector<Node*> child;
};
class Tree{
public:
void init();
void CreateTree(Node* root,treedata now,int pre);
int Biggest(treedata now); //返回信息增益最高的属性
double Entropy(treedata now,int xing);//计算xing这个属性的熵
int most(treedata now); //返回最普遍的答案
void output(Node *root,int pre);
int ask(int data[],Node *root);
int kind[1111];
int fsn;
std::string S[5][4]={"0"};
std::string Pres[Pro_num]={"0"};
};
//enum outlook {SUNNY, OVERCAST, RAIN };
//enum temp {HOT, MILD, COOL };
//enum hum {HIGH, NORMAL };
//enum windy {WEAK, STRONG };
void Tree::init()
{
fsn=0;
S[1][0]="SUNNY";S[1][1]="OVERCAST";S[1][2]="RAIN";
S[2][0]="HOT"; S[2][1]="MILD"; S[2][2]="COOL";
S[3][0]="HIGH"; S[3][1]="NORMAL";
S[4][0]="WEAK"; S[4][1]="STRONG";
Pres[1]="outlook";Pres[2]="temp";Pres[3]="hum";Pres[4]="windy";
}
void Tree::output(Node *root,int pre)
{
fsn++;
int now=fsn;
if(root->At==0){
printf("节点%02d : 父亲节点:%d 答案节点:%d 这个节点选择了属性",fsn,pre,root->ans);
cout<<S[kind[pre]][root->pre]<<endl;
}else{
kind[fsn]=root->At;
printf("节点%02d : 父亲节点:%d",fsn,pre);
cout<<" 接下来以"<<Pres[root->At]<<"属性分";
if(root->pre==-1) cout<<" 这个节点是根节点"<<endl;
else{
cout<<" 这个节点选择了属性"<<S[kind[pre]][root->pre]<<endl;
}
}
for(int i=0;i<root->child.size();i++){
output(root->child[i], now);
}
}
int Tree::most(treedata now)
{
int num[Ans_num];
for(int i=0;i<now.data.size();i++){
num[now.data[i][0]]++;
}
int Max=0;
int ans=0;
for(int i=0;i<Ans_num;i++){
if(Max<num[i]){
Max=num[i];
ans=i;
}
}
return ans;
}
int Tree::ask(int now[],Node *root)
{
if(root->At==0){
return root->ans;
}