资源简介
当不同类别的样本在分布上有交迭部分的,分类的错误率主要来自处于交迭区中的样本,如下图所示。当我们得到一个作为识别用的参考样本集时,由于不同类别交迭区域中不同类别的样本彼此穿插,导致用近邻法分类出错。因此如果能将不同类别交界处的样本以适当方式筛选,可以实现既减少样本数又提高正确识别率的双重目的。为此可以利用现有样本集对其自身进行剪辑。
代码片段和文件信息
% =====================重复剪辑近邻算法(MULTIEDIT)====================
% s: 划分的子集数目
% Xn: 当前样本集
% Xcur: 当前样本集经一次迭代后的样本集
% Xi: 当前考试集
% Xr: 当前参考集
% K: 退出控制条件,迭代K次,若没有样本被剪辑掉,则退出
% =====================================================================
clearclose all;
X = [randn(3002)+ones(3002);...
randn(3002)-ones(3002);];
X(1:3003)=1;X(301:6003)=2;
% ====================================================================
figure plot(X(1:3001)X(1:3002)‘r.‘)
hold onplot(X(301:6001)X(301:6002)‘b.‘)
title(‘初始样本分布图‘)
% ================================================================
s=3;Xcur=X;loop=0;Xold=X;K=5;
while loop Xn=Xcur;
Xold=Xcur;
Xcur=[];
[row1col]=size(Xn);
uu=unifrnd(0srow11);%产生row1行1列的随机数,随机数的范围在0-s之间
uu=ceil(uu);%取整,向上取整
for i=1:s %样本随机划分为s个子集
Xi=Xn((uu==i):);%test set %Xi为考试集
r=mod(i+1s);%取余数,在这里S2是S1的考试集,S3是S2的考试集,S1是S3的考试集。
if r==0
r=s;
end
Xr=Xn((uu==r):);%reference set%Xr为参考集
[rowcol]=size(Xi);
j=1;
while j<=row
[rClassjClass]=NNforMultiedit(XrXi(j:));%用训练集中的样本对考试集中的样本进行最近邻分类
if rClass~=jClass%如果类别不同,则从考试集中分类错误的样本去除
Xi(j:)=[];
row=row-1;
else
j=j+1;
end
end
Xcur=[Xcur;Xi];
end
[oldRowcol]=size(Xold);
[curRowcol]=size(Xcur);
if oldRow==curRow
loop=loop+1;
else
loop=0;
end
end
% ================================================================
%把当前样本集Xcur中的元素按原类别分类
[rowcol]=size(Xcur);
Xcur1=[];Xcur2=[];
tic
for i=1:row
if Xcur(i3)==1
Xcur1=[Xcur1;Xcur(i1:2)];
elseif Xcur(i3)==2
Xcur2=[Xcur2;Xcur(i1:2)];
end
end
time1=toc;
figure plot(Xcur1(:1)Xcur1(:2)‘r.‘)
hold onplot(Xcur2(:1)Xcur2(:2)‘b.‘)
title(‘剪辑后样本分布图‘)
% ===================分类=================================
x_test = [ randn(2002)+ones(2002);...
randn(2002)-ones(2002);];
x_test(1:2003)=1;
x_test(201:4003)=2;
[row_testcol_test]=size(x_test);
n=1;
count0=0;
while n<=row_test
[class00class01]=NNforMultiedit(Xx_test(n:));
if(class00~=class01)
count0=count0+1;
end
n=n+1;
end
error0=count0/400;
fprintf(‘没有剪辑前的测试点分类的错误率为%8.6f\n‘error0);
%-------------------剪辑后的--------------------------------
m=1;
count=0;
while m<=row_test
[class1class2]=NNforMultiedit(Xcurx_test(m:));
if class1~=class2
count=count+1 ;
end
m=m+1;
end
error=count/400;
fprintf(‘重复剪辑后的测试点分类的错误率为%8.6f\n‘error);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2999 2019-12-20 21:02 重复剪辑代码\MultiEdit.m
文件 596 2019-12-20 14:08 重复剪辑代码\NNforMultiedit.m
目录 0 2020-01-07 10:42 重复剪辑代码
----------- --------- ---------- ----- ----
3595 3
评论
共有 条评论