决策树桩分类器的MATLAB代码解析
原代码摘自《统计机器学习导论》第30章 集成学习
分享学习这部分代码的一点笔记
x=randn(50,2);
# 返回一个50*2的正态分布矩阵(i.e. 两组符合正态分布的数组)
y=2*(x(:,1)>x(:,2))-1;
# 返回两个数组大小比较的结果(i.e. 第一组大结果为1,第二组大结果为-1)
X0=linspace(-3,3,50);
# -3~3之间距离相等的50个点(返回一个50*1的矩阵)
[X(:,:,1) X(:,:,2)]=meshgrid(X0);
# [X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵,每一行是 x 的一个副本;Y 也是一个矩阵,每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。这里副本的意思就是copy。
# [X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)×length(x) 的方形网格坐标。也就是50*50在这个例子里。
#其实这两句话是为了建立一个3*3的坐标系。
d=ceil(2*rand);
# 可能返回1或2(选取第一组数或者第二组数)
[xs,xi]=sort(x(:,d));
# [B,I] = sort(A) 还会为上述任意语法返回一个索引向量的集合。I 的大小与 A 的大小相同,它描述了 A 的元素沿已排序的维度在 B 中的排列情况。例如,如果 A 是一个向量,则 B = A(I)。
# xs: x sorted
# xi: x index
el=cumsum(y(xi));
eu=cumsum(y(xi(end:-1:1)));
# cumsum返回累计和
e=eu(end-1:-1:1)-el(1:end-1);
# eu(end) = el(end) =0
[em, ei]=max(abs(e));
# 返回最大值,以及最大值对应的index
c=mean(xs(ei:ei+1));
s=sign(e(ei));
Y=sign(s*X(:,:,d)-c));
# 决策器 包含-1和1
figure(1); clf; hold on; axis([-3 3 -3 3]);
colormap([1 0.7 1; 0.7 1 1]); # 两个颜色
conturf(X0,X0,Y);
# 等高线: 决策边界平行于其中一个坐标轴
plot(x(y==1,1),x(y==1,2),'bo');
# 横坐标为x(:,1), 纵坐标为x(:,2), 返回横坐标比纵坐标大的点为蓝色小圆点
plot(x(y==-1,1),x(y==-1,2),'rx');
# 返回纵坐标比横坐标大的点为红色小叉叉
代码的结果图如下图所示——
这里最好的分类为y=x这条直线,可见决策树桩这个弱分类器的分类效果不佳。