Matlab实现决策树算法进行数字识别

来源:互联网 发布:海关进口数据查询 编辑:程序博客网 时间:2024/06/07 00:20

决策树是一个与流程图相似的树状结构;其中,每一个内部结点都是对一个属性的测试,每一个分枝代表一个结果输出,而每个树叶结点代表一个特定的类或者类的分布。决策树最顶层结点称作根结点。一棵典型的决策树如图1所示。它表示概念“购买计算机”,即他预测顾客是否可能购买计算机。

决策树模型
图1 决策树模型

决策树的每个节点的子节点的个数与决策树所使用的算法有关。例如,CART(分类与回归树)算法得到的决策树每个节点有两个分支,这种树称为二叉树。允许节点含有多于两个子节点的树称为多叉树。
Matlab中可以利用treefit函数实现决策树分类算法,treefit函数的语法如下:
t = treefit(X,y),其中X样本的特征向量,y为样本的类别。

现在要实现通过matlab自带的treefit 函数进行手写阿拉伯数字识别;
所要识别的图像是这样的:
阿拉伯数字0
阿拉伯数字1

这里所使用的数据集来自“数据堂”,已经将图片导入进了matlab,图片像素是28*28=784;这里将每张图片的所有像素点存储在一行当中,对0来说一共有5923行,就是5923张图片。其他的图片以此类推导入到matlab中。

这里写图片描述

我们需要准备:

  1. 训练数据
  2. 测试数据

    训练数据准备:

dtrain0=train0(1:2000,:);dtrain1=train1(1:2000,:);dtrain2=train2(1:2000,:);dtrain3=train3(1:2000,:);dtrain4=train4(1:2000,:);dtrain5=train5(1:2000,:);dtrain6=train6(1:2000,:);dtrain7=train7(1:2000,:);dtrain8=train8(1:2000,:);dtrain9=train9(1:2000,:);trainset10=[dtrain0;dtrain1;dtrain2;dtrain3;dtrain4;dtrain5;dtrain6;dtrain7;dtrain8;dtrain9]tt=double(trainset10);

在每个阿拉伯数字训练集中取出2000行作为训练数据,(1:2000,:)代表 1-2000行,所有的列;
trainset10=[dtrain0;dtrain1;dtrain2;dtrain3;dtrain4;dtrain5;dtrain6;dtrain7;dtrain8;dtrain9]
表示将所有的dtrain合并在一个变量中,行追加,列不变,生成的trainset10 有20000行;

这里写图片描述

测试数据准备:
过程相同,随便从测试数据集里面挑出一些数据,合并在一起,这里我每个数字取10个;

testset0=test0(1:10,:);testset1=test1(1:10,:);testset2=test2(1:10,:);testset3=test3(1:10,:);testset4=test4(1:10,:);testset5=test5(1:10,:);testset6=test6(1:10,:);testset7=test7(1:10,:);testset8=test8(1:10,:);testset9=test9(1:10,:);testsetAll=[testset0;testset1;testset2;testset3;testset4;testset5;testset6;testset7;testset8;testset9];testsetAll_d=double(testsetAll);

生成决策树:

Trainingset=(tt);y=['0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'0';'"'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';'1';"'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2';'2'"'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';'3';........];Testingset=(testsetAll_d);tree = treefit(Trainingset, y); [dtnum,dtnode,dtclass] = treeval(tree,Testingset);

y是对应于Trainingset的训练数据,就是正确答案,因为太长了,只摘了一部分,其中要按顺序和Trainingset 一一对应;
通过 tree = treefit(Trainingset, y); 生成一个决策树

最后的结果 存储在dtclass中;
这里写图片描述
这里写图片描述
这里写图片描述

可以看到 2 的识别是最差的一个,其他的数字很少出错。

0 0