决策树C++实现

本文介绍了使用C++编程实现决策树的过程,作者参考了相关资料进行代码修改,主要内容涉及训练集和测试集的处理。
摘要由CSDN通过智能技术生成



由于使用c++语言不太熟练,要用C++编写完整的程序有点难度,于是参考了http://blog.csdn.net/yangliuy/article/details/7322015.

下面是修改后的代码:

#include <iostream>  
#include <string>  
#include <vector>  
#include <map>  
#include <algorithm>  
#include <cmath>  

#include <fstream>

using namespace std;  
#define MAXLEN 6//输入每行的数据个数  
  
//多叉树的实现   
//1 广义表  
//2 父指针表示法,适于经常找父结点的应用  
//3 子女链表示法,适于经常找子结点的应用  
//4 左长子,右兄弟表示法,实现比较麻烦  
//5 每个结点的所有孩子用vector保存  
//教训:数据结构的设计很重要,本算法采用5比较合适,同时  
//注意维护剩余样例和剩余属性信息,建树时横向遍历考循环属性的值,  
//纵向遍历靠递归调用  
  
vector <vector <string> > state;//实例集  

vector <vector <string> > state2;//实例集  


vector <string> item(MAXLEN);//对应一行实例集  

//vector <string> item2(MAXLEN);//对应一行实例集  

vector <string> attribute_row;//保存首行即属性行数据  
string end("end");//输入结束  
string yes("yes");  
string no("no");  
string blank("");  
map<string,vector < string > > map_attribute_values;//存储属性对应的所有的值  
int tree_size = 0;  


 
struct Node{//决策树节点  
    string attribute;//属性值  
    string arrived_value;//到达的属性值  
    vector<Node *> childs;//所有的孩子  
    Node(){  
        attribute = blank;  
        arrived_value = blank;  
    }  
};  
Node * root;  
  
//根据数据实例计算属性与值组成的map  
void ComputeMapFrom2DVector(){  
    unsigned int i,j,k;  
    bool exited = false;  
    vector<string> values;  
    for(i = 1; i < MAXLEN-1; i++){//按照列遍历  
        for (j = 1; j < state.size(); j++){  
            for (k = 0; k < values.size(); k++){  
                if(!values[k].compare(state[j][i])) exited = true;  
            }  
            if(!exited){  
                values.push_back(state[j][i]);//注意Vector的插入都是从前面插入的,注意更新it,始终指向vector头  
            }  
            exited = false;  
        }  
        map_attribute_values[state[0][i]] = values;  
        values.erase(values.begin(), values.end());  
    }     
}  
  
//根据具体属性和值来计算熵  
double ComputeEntropy(vector <vector <string> > remain_state, string attribute, string value,bool ifparent){  
    vector<int> count (2,0);  
    unsigned int i,j;  
    bool done_flag = false;//哨兵值  
    for(j = 1; j < MAXLEN; j++){  
        if(done_flag) break;  
    
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值