模式识别期末论文9

  • 格式:doc
  • 大小:121.00 KB
  • 文档页数:21

深圳大学研究生课程:模式识别理论与方法

课程作业实验报告

实验名称:Classification and Regression Tree

实验编号:Proj08-01

姓 名:萧嘉慰

学 号:2110130216

规定提交日期:2012年7月14 日

实际提交日期:2012年7月13日

摘 要:本实验编程实现了分类回归树算法,采用非剪枝完全树分类和进行进行非二叉分支。

实验内容:

写一个生成二叉分类树的通用程序,并使用课本 359页的表中的数据来训练该树,使用熵

不纯度进行分支。

(a) 采用非剪枝完全树分类下列模式:

{A,E,I,L,N}, {D,E,J,K,N}, {B,F,J,K,M}, {C,D,J,L,N}。

(b) 对叶节点进行剪枝,使剪枝后树的不纯度的增加尽可能小。

(c) 修改程序,使之可以进行非二叉分支,以生成多叉树。其中每个节点的分叉数可根据该节点

在训练时的情况进行自动确定。 用增益比不纯度重新训练生成一个新树, 并用该树重新对(a)进行分类。

技术论述:

分类回归树算法其采用基于最小距离的基尼指数估计函数, 这是因为基尼指数可以单独考虑子数据集中类属性的分布情况, 用来决定由该子数据集生成的决策树的拓展形状。CART创建简单二叉树结构对新事例进行分类, 这样可以有效地处理缺失数据, 尤其对于分类与预测时更好。并且 CART方法中有贝叶斯分类的特征, 使用者可以提供主观的分类先验概率作为选择分类的权重, 则 CART在获得最终选择树前使用交叉检验来评估候选树的误分类率, 这对分析复杂样本数据非常有用。CART处理离散变量与连续变量同样容易, 这是由于它使用了或形状的几乎不依靠无关变量的分支。而且, 被CART 考虑到的分支在任何单调转换下是不变的,如对一个或更多的特征取对数、平方根等都是不变的。

实验结果与讨论:

Tree =

Label: 1

Value: 66

Num: 20

Right: [1x1 struct]

Left: [1x1 struct]

(a)W1 = 1

W2 =

3

W3 =

1

W4 =

3

(b)W1 =

1

W2 =

3

W3 =

1

W4 =

3

(c) 做不出来,程序出不了结果。

附录:实验程序

(1)子函数

function Tree=CART_MakeBinaryTree(TrainingSamples,

ClassificationProperties, Region)

% 基于 熵不纯度 递归地实现 非剪枝完全二叉树

%输入参数:目标数据(训练样本)TrainingSamples n*d、 (特征向量依次放置)

% 对应的类别属性 ClassificationProperties n*1、(取值范围 1--C)

% 特征向量维度顺序下上限 Region d*2 (特征值取离散的自然数区间,左小右大)

%输出参数:一个基本树形节点 Tree

% 基本树形节点结构

%一:标签(记录当前节点判定所用的维度,表叶子时为空);

%二:阈值(记录当前所用维度判定之阈值,叶子节点时表类别);

%三:左枝(小于等于阈值的待分目标 归于此,表叶子时为空)

%四:右枝(大于阈值的 归于此,表叶子时为空)

[n,Dim]=size(TrainingSamples);

[t,m]=size(Region);

if Dim ~= t || m ~= 2

disp('参数错误,请检查');

return;

end

%检查类别属性是否单纯,如果只有一个属性,那么则是叶子,否则需要继续分

if ( length(unique(ClassificationProperties)) == 1)

Tree.Right = [];

Tree.Left = [];

bel = [];

Tree.Value = ClassificationProperties(1);

Tree.Num =n;

return;

end

%如果两个样本 为两类 直接设置为左右叶子 差异最大维度做为查询项目

%单独处理此类情况,做为一种优化方法应对 后面提到的缺陷

if length(ClassificationProperties) == 2

[m,p]=max(abs(TrainingSamples(1,:) -TrainingSamples(2,:)));

bel = p;

Tree.Value = ((TrainingSamples(1,p)

+TrainingSamples(2,p))/2); %floor

Tree.Num =n; BranchRight.Right = [];

BranchRight.Left = [];

bel = [];

BranchRight.Num =1;

BranchLeft.Num =1;

BranchLeft.Right = [];

BranchLeft.Left = [];

bel = [];

if TrainingSamples(1,p) > Tree.Value

BranchRight.Value = ClassificationProperties(1);

BranchLeft.Value = ClassificationProperties(2);

else

BranchRight.Value = ClassificationProperties(2);

BranchLeft.Value = ClassificationProperties(1);

end

Tree.Right = BranchRight;

Tree.Left = BranchLeft;

return;

end

%确定 节点标签(当前节点判定所用的维度),不纯度下降落差最大的维度当选

%依次计算各个维度当选之后所造成的不纯度之和

%每个维度中可选值中 最大值代表本维度

Dvp=zeros(Dim,2); %记录每个维度中最大的不纯度 及相应的阈值

for k=1:Dim

EI=-20*ones(Region(k,2)-Region(k,1)+1,1);

Iei=0;

for m =Region(k,1):Region(k,2)

Iei =Iei +1;

%计算临时分类结果 去右边的记为 1

CpI=TrainingSamples(:,k) > m;

SumCpI=sum(CpI);

if SumCpI == n || SumCpI == 0 %分到一边去了,不妥,直接考察下一个

continue;

end

CpI=[not(CpI),CpI];

EIt=zeros(2,1);

%统计预计 新分到左右两枝的类别及相应的比率,然后得出熵不纯度

for j=1:2 Cpt=ClassificationProperties(CpI(:,j));

if ( length(unique(Cpt)) == 1) %应对 hist() 在处理同一元素时所存在的异常问题

Pw =0;

else

Pw=hist(Cpt,unique(Cpt));

Pw=Pw/length(Cpt);

Pw=Pw.*log2(Pw);

end

EIt(j)=sum(Pw);

end

Pr=length(Cpt)/n;

EI(Iei)=EIt(1) *(1-Pr) + EIt(2) *Pr;

end

[maxEI, p] =max(EI);

NmaxEI=sum(EI ==maxEI);

if NmaxEI > 1 %如果最大值有多个,取中间那一个, 稍微改进了默认地只取第一个最大值的缺陷

t=find(EI ==maxEI);

p=round(NmaxEI /2);

p=t(p);

end

Dvp(k,1)=maxEI;

Dvp(k,2)=Region(k,1) +p -1;

end

%更新节点标签和阈值

[maxDv, p]=max(Dvp(:,1));

NmaxDv=sum(Dvp(:,1) ==maxDv);

if NmaxDv > 1 %如果最大值有多个,采用取值范围较小的那一个维度属性,

稍微改进了默认地只取第一个最大值的缺陷

t=find(Dvp(:,1) ==maxDv);

[D,p]=min(Region(t,2) -Region(t,1));

p=t(p);

end

bel = p;

Tree.Value = Dvp(p,2);

%将训练样本分成两类,开始递归