n = 50;
x = randn(n,2);
y = 2*(x(:,1)>x(:,2))-1;
b=5000;
a=50;
Y=zeros(a,a);
X0=linspace(-3,3,a);
[X(:,:,1) X(:,:,2)]=meshgrid(X0);
for j=1:b
db = ceil(2*rand);
r=ceil(n*rand(n,1));
xb=x(r,:);
yb=y(r);
[xs,xi]=sort(xb(:,db));
el=cumsum(yb(xi));
eu=cumsum(yb(xi(end:-1:1)));
e=eu(end-1:-1:1)-el(1:end-1);
[em,ei]=max(abs(e));
c=mean(xs(ei:ei+1));
s=sign(e(ei));
Y=Y+sign(s*(X(:,:,db)-c))/b;
end
figure(1);
clf;
hold on;
axis([-3 3 -3 3]);
colormap([1 0.7 1;0.7 1 1]);
contourf(X0,X0,sign(Y));
plot(x(y==1,1),x(y==1,2),'bo');
plot(x(y==-1,1),x(y==-1,2),'rx');
上述代码是一个简单的分类器的实现,使用了随机决策树算法(Randomized Decision Tree)。下面是对代码的解释:
n = 50;:设定样本数量为 50。
x = randn(n,2);:生成一个大小为 n × 2 的随机样本矩阵 x。
y = 2*(x(:,1)>x(:,2))-1;:根据第一列和第二列的大小关系,生成样本的标签 y。如果第一列大于第二列,则标签为 1,否则为 -1。
b = 5000;:设定循环次数为 5000。
a = 50;:设定网格的分辨率为 50。
Y = zeros(a,a);:创建一个大小为 a × a 的全零矩阵 Y,用于存储分类器的输出结果。
X0 = linspace(-3,3,a);:在 -3 到 3 的范围内生成 a 个均匀分布的点,作为网格的横纵坐标。
[X(:,:,1), X(:,:,2)] = meshgrid(X0);:生成一个大小为 a × a 的网格,其中第一个网格行向量是 X0,第二个网格列向量是 X0。
进入循环 for j = 1:b,执行以下步骤:
a、db = ceil(2*rand);:随机选择一个维度,即 1 或 2。
b、r = ceil(n*rand(n,1));:随机选择 n 个样本的索引,用于构建随机子集。
c、xb = x(r,:);:从样本矩阵 x 中选择相应索引的子集样本。
d、yb = y(r);:从标签向量 y 中选择相应索引的子集标签。
e、[xs, xi] = sort(xb(:,db));:将子集样本按照所选维度进行排序,并获取排序后的样本和索引。
f、el = cumsum(yb(xi));:计算排序后标签的累积和,用于计算划分点。
g、eu = cumsum(yb(xi(end:-1:1)));:将排序后的标签反向累积和。
h、e = eu(end-1:-1:1) - el(1:end-1);:计算错误率的变化量。
i、[em, ei] = max(abs(e));:找到变化量中的最大值及其索引。
j、c = mean(xs(ei:ei+1));:计算划分点的均值,作为分类器的决策边界。
k、s = sign(e(ei));:根据变化量的符号确定分类器的方向(正类还是负类)。
l、Y = Y + sign(s*(X(:,:,db) - c))/b;:根据分类器的方向和决策边界,更新分类器的输出结果 Y。
循环结束后,得到了基于随机决策树算法的分类器的输出结果 Y。
figure(1);:创建一个新的图形窗口。
clf;:清空当前图形窗口。
hold on;:保持图形窗口中已有的内容。
axis([-3 3 -3 3]);:设置坐标轴的范围。
colormap([1 0.7 1;0.7 1 1]);:设置颜色映射。
contourf(X0, X0, sign(Y));:绘制分类器的输出结果 Y 的等高线图。
plot(x(y==1,1), x(y==1,2), 'bo');:将标签为 1 的样本点以蓝色圆点的形式绘制。
plot(x(y==-1,1), x(y==-1,2), 'rx');:将标签为 -1 的样本点以红色叉号的形式绘制。