决策树

//头文件

#ifndef _DECISION_TREE_H
#define _DECISION_TREE_H
#include <iostream>
#include <list>
#include <map>
#include <Windows.h>
#define FEATURE_NUMBER 2//和strut dataset里的特征数一致
#define LABEL_CONTENT_LENGTH 20
#define DATA_CONTENT_LENGTH 20
using namespace std;
typedef struct {
float x;
float y;//x,y作为特征,可进行扩展
char *content;
}DataSet;


class DecisionTree
{
public:
DecisionTree( char *nameData , int dataNumber , char *nameLabel , int labelNumber );
DecisionTree();
~DecisionTree();
private:
float CalcShannonEnt( DataSet *data );
void CreateDataSet( char *nameData, char *nameLabel );
void SplitDataSet( int axis, float values  );
DataSet *data;
int dataNum;
char **label;
int labelNum;


int ChildDataNum;


struct listContent 
{
char content[DATA_CONTENT_LENGTH];
float num;
} myListContent;
list<struct listContent> keys;
list<struct listContent>::iterator it;
map<byte,map<int,bool>> mymap;  //byte内容,int第几张图片,int随便的value值
};


#endif// _DECISION_TREE_H

//主文件

#include "decisionTree.h"

DecisionTree::DecisionTree()
{
data = NULL;
label = NULL;
dataNum = 0;
labelNum = 0;
ChildDataNum = 0;

}
DecisionTree::~DecisionTree()
{
if ( data != NULL)
{
for ( int dataIndex = 0 ; dataIndex < dataNum ; ++ dataIndex )
{
delete [] data[dataIndex].content;
}
delete [] data;
}
if ( label != NULL)
{
for ( int labelIndex = 0 ; labelIndex < labelNum ; ++ labelIndex )
{
delete [] label[labelIndex];
}
delete [] label;
}
}
DecisionTree::DecisionTree( char *nameData , int dataNumber , char *nameLabel , int labelNumber )
{
dataNum = dataNumber;
labelNum = labelNumber;
data = new DataSet[dataNum];
for ( int dataIndex = 0 ; dataIndex < dataNum ; ++ dataIndex )
{
data[dataIndex].content = new char[DATA_CONTENT_LENGTH];
}
label = new char*[labelNum];
for ( int labelIndex = 0 ; labelIndex < labelNum ; ++ labelIndex )
{
label[labelIndex] = new char[LABEL_CONTENT_LENGTH];
}
ChildDataNum = dataNum;
CreateDataSet( nameData, nameLabel );


}
void DecisionTree::CreateDataSet( char *nameData, char *nameLabel )
{
FILE *fpData = fopen( nameData , "rt" );
for ( int dataIndex = 0 ; dataIndex < dataNum ; ++ dataIndex )
{
fscanf( fpData, "%f", &data[dataIndex].x );
fscanf( fpData, "%f", &data[dataIndex].y );
fscanf( fpData, "%s", data[dataIndex].content );
}
fclose( fpData );
FILE *fpLabel = fopen( nameLabel , "rt" );
for ( int labelIndex = 0; labelIndex < labelNum; ++ labelIndex )
{
fscanf( fpLabel, "%s", label[labelIndex] );
}
fclose( fpLabel );


//SplitDataSet(1,0);
float aa = CalcShannonEnt(data);


printf("%f\n",aa);
}
float DecisionTree::CalcShannonEnt( DataSet *data )
{
for ( int dataIndex = 0 ; dataIndex < ChildDataNum ; ++ dataIndex )
{
for ( it = keys.begin() ; it != keys.end() ; ++ it )
{
if ( 0 == strcmp( data[dataIndex].content , it->content ) )
{
it->num += 1;
goto NEXT_LOOP;
}
}
strcpy( myListContent.content , data[dataIndex].content );
myListContent.num = 1;
keys.push_back( myListContent );
NEXT_LOOP:
;
}
float shannoEnt = 0;
for ( it = keys.begin() ; it != keys.end() ; ++ it )
{
float prob = it->num / dataNum ;
shannoEnt -= prob * ( log(prob) / log(2.0) );
}
return shannoEnt;
}
void DecisionTree::SplitDataSet( int axis, float values )
{
//按照给定特征划分数据集
int countNum = 0;
for ( int dataIndex = 0; dataIndex < dataNum; ++ dataIndex )
{
switch(axis)
{
case 0:
if ( data[dataIndex].x == values )
{
data[countNum].x = values;
data[countNum].y = data[dataIndex].y;
strncpy(data[countNum].content, data[dataIndex].content, DATA_CONTENT_LENGTH);
++ countNum;
}
break;
case 1:
if ( data[dataIndex].y == values )
{
data[countNum].y = values;
data[countNum].x = data[dataIndex].x;
strncpy(data[countNum].content, data[dataIndex].content, DATA_CONTENT_LENGTH);
++ countNum;
}
break;
default:
break;
}
}
ChildDataNum = countNum;

}

//测试主函数

#include "decisionTree.h"

int main()
{
DecisionTree test( "dataSet.txt", 5, "label.txt", 2);
return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值