决策树ID3算法(C++实现)与浅谈

本文介绍了决策树ID3算法的原理,包括信息熵、信息增益和决策树的构建过程。通过一个NBA球员薪资预测的例子,阐述了如何使用ID3算法构建决策树,并强调了其在分类问题中的应用和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

样本从网上找的。

 

要求样本为:对于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;
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值