人工智能天气决策树源代码
- 格式:doc
- 大小:277.13 KB
- 文档页数:17
一、上机目的及内容1.上机内根据下列给定的14个样本数据,运用ID3算法构造一个是否适宜打网球的天气决策树。
2.上机目的(1)学习用Information Gain构造决策树的方法;(2)在给定的例子上,构造出正确的决策树; (3)理解并掌握构造决策树的技术要点。
二、实验原理及基本技术路线图(方框原理图或程序流程图)1、决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。
树上的每一个节点说明了对实例的某个属性的测试,并且该节点的每一个后继分支对应于该属性的一个可能值。
构造好的决策树的关键在于如何选择好的逻辑判断或属性。
对于同样一组例子,可以有很多决策树能符合这组例子。
人们研究出,一般情况下或具有较大概率地说,树越小则树的预测能力越强。
要构造尽可能小的决策树,关键在于选择恰当的逻辑判断或属性。
由于构造最小的树是NP-难问题,因此只能采取用启发式策略选择好的逻辑判断或属性。
用信息增益度量期望熵最低,来选择分类属性。
公式为算法:创建树的Root 结点如果Examples 都为正,那么返回label=+中的单结点Root 如果Examples 都为反,那么返回lable=-单结点树Root如果Attributes 为空,那么返回单节点树Root ,lable=Examples 中最普遍的目标属性值否则开始∑∑=∈⨯-=-=ci ii v A Values v v p p S Entropy S Entropy SS S Entropy A S Gain 12)(log )()()(),(A<-Attributes中分类能力最好的属性Root的决策属性<-A对于每个可能值在Root下加一个新的分支对应测试A=vi令Example-vi为Examples中满足A属性值为vi的子集如果Examples-vi为空在这个新分支下加一个叶子结点,节点的lable=Examples中最普遍的目标属性值否则在这个新分支下加一个子树ID3(example-vi,target-attribute,attributes-|A|)结束返回 Root算法实现:天气数据存放在data.txt 中;第一行为样本数量14和每个样本中属性的数量4;第二行为每个属性取值的数量;后面n行皆为例子;节点数据结构struct DTNode{int name; //用 1,2,3,4表示选择的属性,0表示不用分类,即叶节点int data[D_MAX+1]; //表示此节点包含的数据,data[i]=1,表示包含二维数组data[][]中的第i条数据int leaf; //leaf=1 正例叶节点;leaf=2 反例叶节点;leaf=0不是节点 int c; //c=1 正类;c=0 反类DTNode *child[P+1]; //按属性值的个数建立子树};定义函数void Read_data() //从数据文件data.txt中读入训练数据DT_pointer Create_DT(DT_pointer Tree,int name,int value) //创建决策树int chose(int *da) //选择分类属性float Gain(int *da,int p) //计算以p属性分类的期望熵float Entropy(int *da) //计算数据的熵int test_leaf(int *da) //测试节点属性void Out_DT(DT_pointer Tree) //用线性表形式输出建立的决策树int Class(int *da) //对输入的测试样本分类全局变量FILE *fp;int p_num; //属性的数量int pi[P_MAX+1]; //每个属性有几种取值int d_num; //数据的数量int data[P_MAX+1][D_MAX+1];//存储训练数据三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)#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;i<n;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]=tree[tree[i].father].key;keykind[keykind_num][1]=tree[i].kind;i=tree[i].father;}}float calculate_mc(float x,float y)//计算相对于当前正例和反例的熵{if (x==0||y==0) return 0;return -(x/(x+y))*(log(x/(x+y))/log(2))-(y/(x+y))*(log(y/(x+y))/log(2));}float calculate_gain(int x,int num,float mc1)//计算以属性x对当前节点进行决策的gain值{float bc=0;int i;keykind[keykind_num][0]=x;for (i=0;i<caption[x];i++)//计算B(C,属性X){keykind[keykind_num][1]=i+1;calculate_pq();bc=bc+((p+q)/(num+0.0))*calculate_mc(p,q);}return mc1-bc;}int findkey(int x)//找出当前点x的决策属性{int not_use[10],i;calculate_keykind(x);//找出X节点及其父节点的所有决策calculate_pq();//计算正反实例的个数if (p==0||q==0) return -1;mc=calculate_mc(p,q);//计算正反实例的熵int num=p+q,nowkey=-2;float max=-1,ans;for (i=0;i<=captionnum;i++) not_use[i]=1;for (i=1;i<=keykind_num;i++) not_use[keykind[i][0]]=0;keykind_num++;for (i=0;i<captionnum;i++)//枚举法一次讨论每个可用属性对X节点进行决策的gain值,取gain 值最大的属性为决策属性if (not_use[i]){ans=calculate_gain(i,num,mc);if (ans>max){max=ans;nowkey=i;}}return nowkey;}void output_con(int x)//输出满足X节点以及其所有父节点的决策的实例集合{calculate_keykind(x);int u,k,i;p=0;q=0;for (i=0;i<n;i++){u=1;for (k=1;k<=keykind_num;k++)if (c[i][keykind[k][0]]!=keykind[k][1]){u=0;break;}if (u){for (k=0;k<captionnum;k++)printf("%s,",key_name[k][c[i][k]-1]);printf("%s\n",key_name[k][c[i][k]-1]);}}}void output(int x,int deep)//输出X节点的实例,如果X不是叶子节点,则递归,一直找到叶节点才输出满足相应决策的实例集合{outtree[deep]=x;if (tree[x].childs>=0){for (int i=0;i<=tree[x].childs;i++)output(tree[x].child[i],deep+1);}else{printf("\n");for (int j=0;j<=deep-1;j++){printf("%s(%s)-->",caption_name[tree[outtree[j]].key],key_name[tree[outtree[j]].key][tree[outtree[j+1]].ki nd-1]);}printf("\n");output_con(outtree[deep]);}}void main(){int i;initdata();trnum=0;int open=0;while (open<=trnum)//open用来一次访问决策树的每个节点//每次访问一个节点,就对其进行决策,如果决策成功,则将新的点加入到决策树中,直至不能再扩展{tree[open].key=findkey(open);//寻找决策属性tree[open].childs=-1;if (tree[open].key>=0){for (i=0;i<caption[tree[open].key];i++)//决策成功,向决策树加入新的节点{trnum++;tree[trnum].kind=i+1;tree[open].childs++;tree[open].child[tree[open].childs]=trnum;tree[trnum].father=open;}}open++;}output(0,0);}五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
决策树算法python代码决策树是一种常见的机器学习算法,它可以用来做分类和回归问题。
决策树算法可以帮助我们从一组数据中找出有用的信息,并且可以把这些信息用来做出决策。
一般来说,决策树算法的基本思想是:从一组数据中提取最重要的特征,并根据这些特征来做出决策。
这些特征可以是数值型的,也可以是类别型的,也可以是组合型的。
下面我们来看一下决策树算法的python代码:## 一、导入库首先,我们需要导入相关的库,比如`numpy`,`pandas`,`sklearn`等。
```pythonimport numpy as npimport pandas as pdfrom sklearn.tree import DecisionTreeClassifier```## 二、准备数据然后,我们需要准备用于训练决策树的数据。
我们可以使用`pandas`库读取数据,并将其转换为`numpy`数组。
```python# 读取数据data = pd.read_csv('data.csv')# 将数据转换为numpy数组X = data.iloc[:,:-1].valuesy = data.iloc[:,-1].values```## 三、构建决策树接下来,我们就可以构建决策树了。
我们可以使用`sklearn`库中的`DecisionTreeClassifier`类来构建决策树。
```python# 创建决策树clf = DecisionTreeClassifier()# 训练决策树clf.fit(X,y)```## 四、预测结果最后,我们可以使用训练好的决策树来做预测。
```python# 预测结果y_pred = clf.predict(X)```## 五、评估模型最后,我们还可以使用`sklearn`库中的`accuracy_score`函数来评估模型的准确率。
```python# 评估模型from sklearn.metrics import accuracy_scoreprint(accuracy_score(y, y_pred))```以上就是决策树算法的python代码。
id3决策树算法python程序关于ID3决策树算法的Python程序。
第一步:了解ID3决策树算法ID3决策树算法是一种常用的机器学习算法,用于解决分类问题。
它基于信息论的概念,通过选择最佳的特征来构建决策树模型。
ID3算法的核心是计算信息增益,即通过选择最能区分不同类别的特征来构建决策树。
第二步:导入需要的Python库和数据集在编写ID3决策树算法的Python程序之前,我们需要导入一些必要的Python库和准备好相关的数据集。
在本例中,我们将使用pandas库来处理数据集,并使用sklearn库的train_test_split函数来将数据集拆分为训练集和测试集。
pythonimport pandas as pdfrom sklearn.model_selection import train_test_split# 读取数据集data = pd.read_csv('dataset.csv')# 将数据集拆分为特征和标签X = data.drop('Class', axis=1)y = data['Class']# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 第三步:实现ID3决策树算法的Python函数在此步骤中,我们将编写一个名为ID3DecisionTree的Python函数来实现ID3决策树算法。
该函数将递归地构建决策树,直到满足停止条件。
在每个递归步骤中,它将计算信息增益,并选择最佳特征作为当前节点的分裂依据。
pythonfrom math import log2from collections import Counterclass ID3DecisionTree:def __init__(self):self.tree = {}def calc_entropy(self, labels):label_counts = Counter(labels)entropy = 0for count in label_counts.values():p = count / len(labels)entropy -= p * log2(p)return entropydef calc_info_gain(self, data, labels, feature):feature_values = data[feature].unique()feature_entropy = 0for value in feature_values:subset_labels = labels[data[feature] == value]feature_entropy += len(subset_labels) / len(labels) * self.calc_entropy(subset_labels)return self.calc_entropy(labels) - feature_entropydef choose_best_feature(self, data, labels):best_info_gain = 0best_feature = Nonefor feature in data.columns:info_gain = self.calc_info_gain(data, labels, feature)if info_gain > best_info_gain:best_info_gain = info_gainbest_feature = featurereturn best_featuredef build_tree(self, data, labels):if len(set(labels)) == 1:return labels[0]elif len(data.columns) == 0:return Counter(labels).most_common(1)[0][0] else:best_feature = self.choose_best_feature(data, labels)sub_data = {}for value in data[best_feature].unique():subset = data[data[best_feature] == value].drop(best_feature, axis=1)sub_labels = labels[data[best_feature] == value]sub_data[value] = (subset, sub_labels)tree = {best_feature: {}}for value, (subset, sub_labels) in sub_data.items():tree[best_feature][value] = self.build_tree(subset, sub_labels)return treedef fit(self, data, labels):self.tree = self.build_tree(data, labels)def predict(self, data):predictions = []for _, row in data.iterrows():node = self.treewhile isinstance(node, dict):feature = list(node.keys())[0]value = row[feature]node = node[feature][value]predictions.append(node)return predictions第四步:使用ID3决策树模型进行训练和预测最后一步是使用我们实现的ID3DecisionTree类进行训练和预测。
人工智能c语言源代码人工智能是一个广泛的领域,涉及多种算法和技术。
在C语言中,可以实现一些基本的人工智能功能。
下面是一个简单的示例,展示了如何使用C语言编写一个简单的决策树算法:c.#include <stdio.h>。
// 定义决策树节点结构。
typedef struct DecisionTreeNode {。
char question;struct DecisionTreeNode yesNode;struct DecisionTreeNode noNode;} DecisionTreeNode;// 创建决策树节点。
DecisionTreeNode createNode(char question) {。
DecisionTreeNode node = (DecisionTreeNode)malloc(sizeof(DecisionTreeNode));node->question = question;node->yesNode = NULL;node->noNode = NULL;return node;}。
// 决策树算法。
void decisionTree() {。
DecisionTreeNode root = createNode("Is it a mammal?");root->yesNode = createNode("Does it have fur?");root->yesNode->yesNode = createNode("It's amammal!");root->yesNode->noNode = createNode("It's not a mammal!");root->noNode = createNode("Does it have feathers?");root->noNode->yesNode = createNode("It's a bird!");root->noNode->noNode = createNode("It's not abird!");printf("%s\n", root->question);char answer;scanf(" %c", &answer);DecisionTreeNode currentNode = root;while (currentNode != NULL) {。
人工智能决策树例题经典案例一、经典案例:天气预测决策树在天气预测中有广泛应用,下面是一个关于是否适宜进行户外运动的示例:1. 数据收集:- 温度:高(>30℃)/中(20℃-30℃)/低(<20℃)- 降水:是/否- 风力:高/中/低- 天气状况:晴朗/多云/阴天/雨/暴雨- 应该户外运动:是/否2. 构建决策树:- 根据温度将数据分为三个分支:高温、中温、低温- 在每个分支中,继续根据降水、风力和天气状况进行划分,最终得到是否适宜户外运动的决策3. 决策树示例:温度/ / \高温中温低温/ | | \ |降水无降水风力适宜/ \ | | / \是否高中低| |不适宜适宜- 如果温度是高温且有降水,则不适宜户外运动- 如果温度是高温且无降水,则根据风力判断,如果风力是高,则不适宜户外运动,如果风力是中或低,则适宜户外运动 - 如果温度是中温,则不论降水和风力如何,都适宜户外运动- 如果温度是低温,则需要考虑风力,如果风力是高,则适宜户外运动,如果风力是中或低,则不适宜户外运动4. 参考内容:决策树的构建和应用:决策树通过对输入特征进行划分,构建了一棵树形结构,用于解决分类或回归问题。
构建决策树主要包括数据预处理、特征选择、划分策略和停止条件等步骤。
特征选择可以使用信息增益、基尼指数等算法,划分策略可以使用二叉划分或多叉划分,停止条件可以是叶子节点纯度达到一定阈值或达到预定的树深度。
决策树的应用包括数据分类、特征选择和预测等任务。
天气预测案例中的决策树:将天气预测问题转化为分类问题,通过构建决策树,可以得到识别是否适宜户外运动的规则。
决策树的决策路径可以用流程图或树状图表示,帮助理解和解释决策过程。
决策树的节点表示特征值,分支表示判断条件,叶子节点表示分类结果。
决策树的生成算法可以基于启发式规则或数学模型,如ID3、C4.5、CART等。
决策树的优缺点:决策树具有可解释性强、易于理解和实现、能处理非线性关系等优点。
机器学习-ID3决策树算法(附matlaboctave代码)ID3决策树算法是基于信息增益来构建的,信息增益可以由训练集的信息熵算得,这⾥举⼀个简单的例⼦data=[⼼情好天⽓好出门⼼情好天⽓不好出门⼼情不好天⽓好出门⼼情不好天⽓不好不出门]前⾯两列是分类属性,最后⼀列是分类分类的信息熵可以计算得到:出门=3,不出门=1,总⾏数=4分类信息熵 = -(3/4)*log2(3/4)-(1/4)*log2(1/4)第⼀列属性有两类,⼼情好,⼼情不好⼼情好 ,出门=2,不出门=0,⾏数=2⼼情好信息熵=-(2/2)*log2(2/2)+(0/2)*log2(0/2)同理⼼情不好信息熵=-(1/2)*log2(1/2)-(1/2)*log2(1/2)⼼情的信息增益=分类信息熵 - ⼼情好的概率*⼼情好的信息熵 - ⼼情不好的概率*⼼情不好的信息熵由此可以得到每个属性对应的信息熵,信息熵最⼤的即为最优划分属性。
还是这个例⼦,加⼊最优划分属性为⼼情然后分别在⼼情属性的每个具体情况下的分类是否全部为同⼀种,若为同⼀种则该节点标记为此类别,这⾥我们在⼼情好的情况下不管什么天⽓结果都是出门所以,有了⼼情不好的情况下有不同的分类结果,继续计算在⼼情不好的情况下,其它属性的信息增益,把信息增益最⼤的属性作为这个分⽀节点,这个我们只有天⽓这个属性,那么这个节点就是天⽓了,天⽓属性有两种情况,如下图在⼼情不好并且天⽓好的情况下,若分类全为同⼀种,则改节点标记为此类别有训练集可以,⼼情不好并且天⽓好为出门,⼼情不好并且天⽓不好为不出门,结果⼊下图对于分⽀节点下的属性很有可能没有数据,⽐如,我们假设训练集变成data=[⼼情好晴天出门⼼情好阴天出门⼼情好⾬天出门⼼情好雾天出门⼼情不好晴天出门⼼情不好⾬天不出门⼼情不好阴天不出门]如下图:在⼼情不好的情况下,天⽓中并没有雾天,我们如何判断雾天到底是否出门呢?我们可以采⽤该样本最多的分类作为该分类,这⾥天⽓不好的情况下,我们出门=1,不出门=2,那么这⾥将不出门,作为雾天的分类结果在此我们所有属性都划分了,结束递归,我们得到了⼀颗⾮常简单的决策树。
matlab决策树代码例子当涉及到决策树的代码示例时,MATLAB提供了一个强大的工具箱,称为Statistics and Machine Learning Toolbox。
下面是一个使用MATLAB的决策树分类器的简单代码示例:matlab.% 导入数据。
load fisheriris.X = meas;Y = species;% 创建决策树模型。
tree = fitctree(X, Y);% 可视化决策树。
view(tree, 'Mode', 'Graph');% 预测新样本。
newX = [5 3.5 1.4 0.2; 6 3 4.5 1.5];predictedY = predict(tree, newX);disp(predictedY);这个示例中,我们首先导入了经典的鸢尾花数据集(fisheriris),其中包含了鸢尾花的测量数据(花萼长度、花萼宽度、花瓣长度和花瓣宽度)以及对应的鸢尾花种类。
然后,我们使用`fitctree`函数创建了一个决策树分类器模型,其中`X`是输入特征矩阵,`Y`是对应的目标变量。
接下来,我们使用`view`函数可视化生成的决策树模型,可以以图形方式展示决策树的结构。
最后,我们使用新的样本数据`newX`来预测其所属的鸢尾花种类,并使用`predict`函数进行预测。
这只是一个简单的决策树代码示例,你可以根据自己的需求进行更复杂的决策树模型构建和预测。
MATLAB的决策树工具箱提供了更多的选项和功能,例如控制树的最大深度、最小叶节点数等参数,以及交叉验证和剪枝等技术来优化模型。
决策树算法代码
简单来说,决策树算法是一种基于特征的方法,能够从训练数据中按照某种规则构建出决策树,用于预测未知数据。
它是非参数研究算法,不需要设定任何参数,只需要使用训练数据和特征,就可以构建出一个决策树。
决策树算法的基本思想是将数据集分解为更小的子集,每个子集都可以用一个决策来表示。
决策树算法通过不断地将数据集分解,最终形成一个“决策树”,用于预测未知数据。
决策树算法的基本步骤如下:
1. 从训练集中选择一个最优特征;
2. 根据最优特征的不同值,将训练集分成多个子集;
3. 对每一个子集,如果子集中的所有实例属于同一类,则该子集为“叶子结点”;否则,选择一个新的最优特征,重复1-2步;
4. 重复1-3步,直到所有子集都属于同一类,形成一棵决策树;
5. 利用决策树预测未知数据。
决策树算法具有许多优点,如容易理解、可视化和实现简单等。
决策树算法也有一些缺点,如容易过拟合、对异常数据敏感等。
总之,决策树算法是一种非常有用的机器研究算法,它可以用来解决分类和回归问题,它的优点和缺点都要注意,在使用时要谨慎,以达到最佳的效果。
昆明理工大学信息工程与自动化学院学生实验报告( 2011 — 2012 学年第 1 学期)课程名称:人工智能开课实验室:信自楼计算机机房444 2011 年12月 16 日一、上机目的及内容1.上机内容根据下列给定的14个数据,运用Information Gain构造一个天气决策树。
13 多云热正常无P14 雨中大有N2.上机目的(1)学习用Information Gain构造决策树的方法;(2)在给定的例子上,构造出正确的决策树;(3)理解并掌握构造决策树的技术要点。
二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)设计并实现程序,构造出正确的决策树;(2)对所设计的算法采用大O符号进行时间复杂性和空间复杂性分析;主函数流程图:Attributevalue.cpp流程图Basefun流程图:Datapiont.cpp流程图:Dataset主要流程图:三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)工程源代码:Main.cpp:#include <fstream>#include <iostream>#include <list>#include <sstream>#include <string>#include <vector>#include "AttributeValue.h"#include "DataPoint.h"#include "DataSet.h"DataPoint processLine(std::string const& sLine){std::istringstream isLine(sLine, std::istringstream::in);std::vector<AttributeValue> attributes;// TODO: need to handle beginning and ending empty spaces.while( isLine.good() ){std::string rawfield;isLine >> rawfield;attributes.push_back( AttributeValue( rawfield ) );}AttributeValue v = attributes.back();attributes.pop_back();bool type = v.GetType();return DataPoint(attributes, type);}void main(){std::ifstream ifs("in.txt", std::ifstream::in);DataSet initDataset;while( ifs.good() ){// TODO: need to handle empty lines.std::string sLine;std::getline(ifs, sLine);initDataset.addDataPoint( processLine(sLine) );}std::list<DataSet> processQ;std::vector<DataSet> finishedDataSet;processQ.push_back(initDataset);while ( processQ.size() > 0 ){std::vector<DataSet> splittedDataSets;DataSet dataset = processQ.front();dataset.splitDataSet(splittedDataSets);processQ.pop_front();for (int i=0; i<splittedDataSets.size(); ++i){float prob = splittedDataSets[i].getPositiveProb();if (prob == 0.0 || prob == 1.0){finishedDataSet.push_back(splittedDataSets[i]);}else{processQ.push_back(splittedDataSets[i]);}}}std::cout << "The dicision tree is:" << std::endl;for (int i = 0; i < finishedDataSet.size(); ++i){finishedDataSet[i].display();}}Attributevalue.cpp:#include "AttributeValue.h"#include "base.h"AttributeValue::AttributeValue(std::string const& instring): m_value(instring){}bool AttributeValue::GetType(){if (m_value == "P"){return true;}else if (m_value == "N"){return false;}else{throw DataErrException();}}Basefun.cpp:#include <math.h>float log2 (float x){return 1.0 / log10(2) * log10(x);}float calEntropy(float prob){float sum=0;if (prob == 0 || prob == 1){return 0;}sum -= prob * log2(prob);sum -= (1 - prob) * log2 ( 1 - prob );return sum;}Datapiont.cpp:#include <iostream>#include "DataPoint.h"DataPoint::DataPoint(std::vector<AttributeValue> const& attributes, bool type) : m_type(type){for (int i=0; i<attributes.size(); ++i){m_attributes.push_back( attributes[i] );}}void DataPoint::display(){for (int i=0; i<m_attributes.size(); ++i){std::cout << "\t" << m_attributes[i].getValue();}if (true == m_type){std::cout << "\tP";}else{std::cout << "\tN";}std::cout << std::endl;}Dataset.cpp:#include <iostream>#include <map>#include "base.h"#include "DataSet.h"void SplitAttributeValue::display(){std::cout << "\tSplit attribute ID(" << m_attributeIndex << ")\t";std::cout << "Split attribute value(" << m_v.getValue() << ")" << std::endl; }void DataSet::addDataPoint(DataPoint const& datapoint){m_data.push_back(datapoint);}float DataSet::getPositiveProb(){float nPositive = 0;for(int i=0; i<m_data.size(); ++i){if ( m_data[i].isPositive() ){nPositive++;}}return nPositive / m_data.size();。