计算机系智科专业模式识别实践第二次作业:近邻法、剪辑近邻法、压缩近邻法
对比近邻法、剪辑近邻法、压缩近邻法的错误率,以及如何用matlab实现(完整代码)
作者是华电在读毒瘤计算机系智科牛马,学弟学妹,不知道自己的举手之劳能否帮到你,仅供参考,欢迎叨扰:1792975930(qq),私信必回!(有查看其他大佬的写法)
所用的软件是matlab,可以上网自学一点再来,b站无脑学习链接(一小时倍速速成链接,够用很多课了)
https://www.bilibili.com/video/BV13D4y1Q7RS?p=2
内容:
1、剪辑近邻法:
(1)参考资料区例程目录里的样本生成例程使用随机函数生成5000个随机样本,共两类,每类2500个,其中每类中2000个为训练集,500个为测试集。作为后续程序的数据基础。
(2)使用最近邻法,对两类各500共1000个测试样本进行识别,得出错误分类数及错误率。
(3)使用最近邻剪辑近邻法,对两类各2000共4000个训练样本进行剪辑。
(4)采用剪辑后的训练样本,使用最近邻法程序,对两类共1000个测试样本的近邻法判别,得出错误分类数及错误率,并与未剪辑前的最近邻法结果比较。
2、压缩近邻法:
(1)实现压缩近邻法程序,对剪辑后的训练样本进行压缩,得到压缩后的训练样本。
(2)采用压缩后的训练样本,使用最近邻法程序,对两类共1000个测试样本的近邻法判别,得出错误分类数及错误率,并与之前的最近邻法结果比较。
要求:
提交: 要包括算法流程、数据点的二维显示、文字说明、结果分析,附Matlab程序。
图形至少包括:原始样本数据二维分布、原始训练样本分布图、原始测试样本分布图、剪辑后的样本分布图、压缩后的样本分布图;
结果分析中至少要包括:样本数量变化、错分样本数变化、错误率变化。
正文
三种近邻法的运用比较
1 问题
1、剪辑近邻法:
(1)参考资料区例程目录里的样本生成例程使用随机函数生成5000个随机样本,共两类,每类2500个,其中每类中2000个为训练集,500个为测试集。作为后续程序的数据基础。(c03_01_1NN_Get_2000sample.m),
(2)使用最近邻法,对两类各500共1000个测试样本进行识别,得出错误分类数及错误率。
(3)使用最近邻剪辑近邻法,对两类各2000共4000个训练样本进行剪辑(参考例程NNforCondense.m)。
(4)采用剪辑后的训练样本,使用最近邻法程序,对两类共1000个测试样本的近邻法判别,得出错误分类数及错误率,并与未剪辑前的最近邻法结果比较。
2、压缩近邻法:
(1)实现压缩近邻法程序,对剪辑后的训练样本进行压缩,得到压缩后的训练样本。
(2)采用压缩后的训练样本,使用最近邻法程序,对两类共1000个测试样本的近邻法判别,得出错误分类数及错误率,并与之前的最近邻法结果比较。
2 方法描述及判别结果
方法描述步骤如下:
一般近邻法
(1)先生成样本5000个,其中分两类,第一类和第二类,分别用矩阵的第三列来表示类别,矩阵每一行的第一、第二列代表点的X、Y轴的坐标值。
(2)每类2500个,其中每类中2000个为训练集,500个为测试集。作为后续程序的数据基础。
(3)分别做出5000个原始样本数据二维分布图,再做出4000个训练样本的分布图、1000个测试样本的分布图,再采用一般的近邻法进行分类。(此时训练样本为4000个,测试样本为1000个,这里用的是欧式距离,但是我用的是二范数的平方,不必要加根号增大计算量)
(4)对一般的近邻法利用空数组来记录分类出的类别,与原来的测试集的比较,得出错误个数和错误率。
剪辑近邻法:
(1)我取每一类测试样本的前500个作为参照集XNR,后面1500个作为考试集NTE。
(2)利用循环将考试集X(NT)中的每个样本依次放入参照集X(NR),采用最近邻法则对这些已知类别的样本进行分类。
(3)若样本x被X(NR)正确判别,则在X(NT)中保留该样本;若样本x被错误分类,则在X(NT)中去除该样本。
(4)经过剪辑操作,原考试集X(NT)中余下的都是正确分类的样本,构成剪辑样本集X(NTE)
(5)剪辑样本集X(NTE)构成之后,成为新的训练样本集。对于待识别未知样本x′(1000个),采用最近邻规则,利用剪辑样本集X(NTE)进行分类,画图,并根据程序得到错误数和错误率。
压缩近邻法
(1)将样本集X(N)分为X(S)和X(G),算法开始时X(S)中只有一个样本(随机选择任一样本),X(G)中为剩余所有样本。这里因为有两类样本,所以取两个样本,每类取一个。
(2)考查X(G)中的每一个样本,若用X(S)中的样本能够将其正确分类,则保留在X(G)中;若不能正确分类,则将这个样本放于X(S)中,依次进行考查,直到没有样本需要移动。(即XG中的作为测试集,XS的作为训练集)、
(3)若X(G)中所有样本在执行第(2)步时没有发生转入X(S)的现象,或X(G)已成空集,则算法终止,否则转入第(2)步。
(4)最后再用X(S)作为分类的训练样本集,对待识别样本x’(1000个待测样本)采用近邻法分类。
判决结果步骤如下:
5000个样本的分布如下(原始样本数据二维分布)
4000个测试样本的分布(原始训练样本分布图)
1000个测试样本的分布(原始测试样本分布图)
剪辑过后剩下的样本分布(剪辑后的样本分布图)
剪辑后、压缩后的的训练样本图像(压缩后的样本分布图)
工作区的变量:
其中n=2679是剪辑结束后,还剩下的的训练样本个数,比4000少了1321个
num=196是一般近邻法用完后,1000个测试样本中的分类错误个数;
num1=121是剪辑近邻法用完后,1000个测试样本中的分类错误个数;
num2=141是压缩近邻法用完后,1000个测试样本中的分类错误个数;
t=126是利用剪辑、压缩近邻法过后,还剩余的训练样本个数。从4000到126个。
(1)比较剪辑近邻法与一般近邻法得出的结论:
总样本数5000个,4000个训练样本,1000个待测试样本。
剪辑前,错误个数为196,错误率为196/1000=19.6%。
剪辑后,样本个数为2679个,少了1321个,错误个数为121个,错误率为121/1000=12.1%。
由此可见,剪辑近邻法运用过后错误率明显下降,分类结果比一般近邻法剪辑更好,更稳定,错误率更小。
(2)比较压缩近邻法与一般近邻法得出的结论:
总样本数5000个,4000个训练样本,1000个待测试样本。压缩后,从2679个到压缩后的126个训练样本个数。(这里是利用剪辑后再压缩的样本个数来当训练样本个数)
压缩前,错误个数为196,错误率为196/1000=19.6%。
压缩后,错误个数为141,错误率为141/1000=14.1%
由此可见,压缩近邻法运用过后错误率也随着下降,分类结果比一般近邻法剪辑更好,同时测试样本的个数变得较少。
这里我在程序的每一句语句都总结的非常清楚,全部进行了注释。
可以直接复制到matlab中一条龙运行下来,程序比较无脑。。。。。。
时间需要一分钟左右。。。。。。
可能第一次发文字格式难免有问题,可以私信我csdn或者qq跟我要源代码,无偿!
当然,也有老师给的模式识别作业标准参考程序,放在资料区下载。
文件内容形式:
笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛、“创青春”青年创新创业大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人、冬奥云支教等奖项。
程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!
自写matlab程序附录
%% 为了程序的可复现性,后续程序使用存储下来的cbs_5000.mat
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 使用randn函数产生均值为0,方差σ^2 = 1,标准差σ=1的正态分布的随机矩阵,5000个数据,分两类。
clc;clear all;close all % 清理
X = [randn(2500,2)+ones(2500,2);... %续写下一行
randn(2500,2)-ones(2500,2);];
X(1:2500,3)=1;
X(2501:5000,3)=2;
%% 原始样本数据二维分布
figure, plot(X(1:2500,1),X(1:2500,2),'ro') %2500个总体第一类样本
hold on,plot(X(2501:5000,1),X(2501:5000,2),'b*') %2500个总体第二类样本
grid;
title('原始总体样本数据二维分布')
%% 初始的训练样本绘制图像
figure, plot(X(1:2000,1),X(1:2000,2),'ro') %取两千个训练集,1至2000
hold on,plot(X(2501:4500,1),X(2501:4500,2),'b*') %取两千个训练集,2501至4500
grid;
title('总体初始样本分布图')
%% 原始测试样本分布图
figure, plot(X(2001:2500,1),X(2001:2500,2),'ro') %取五百个测试集
hold on,plot(X(4501:5000,1),X(4501:5000,2),'b*') %取五百个测试集
grid;
title('原始测试样本分布图')
%% 存储工作区变量
save ('cbs_5000.mat','X');
%% 近邻法
biaoji=[]; %做一个空的标记数组用于后面比较类别
for i=2001:2500
minlen=norm(X(1,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=1:2000 %取第一类的样本先求距离
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=1;
end
end %求出目前样本点和第一类每个点的最小距离
for j=2501:4500 %取第一类的样本先求距离
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=2;
end
end %求出目前样本点和第二类每个点的最小距离,此时可以知道样本点的类别了
biaoji(i-2000)=flag;
end
%%同理,第二类测试点来求
for i=4501:5000
minlen=norm(X(2501,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=1:2000 %取第一类的样本先求距离
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=1;
end
end %求出目前样本点和第一类每个点的最小距离
for j=2501:4500 %取第一类的样本先求距离
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=2;
end
end %求出目前样本点和第二类每个点的最小距离,此时可以知道样本点的类别了
biaoji(i-4000)=flag;
end
%% 判断近邻法错误个数和错误率
num=0;
for i=1:500
if biaoji(i)~=X(2001:2500,3)
num=num+1;
end
end
for i=1:500
if biaoji(i)~=X(2001:2500,3)
num=num+1;
end
end
for i=501:1000
if biaoji(i)~=X(4501:5000,3)
num=num+1;
end
end
%% 继前面后,剪辑近邻法(利用flag进行分类)
num1=0;
for i=501:2000 %取1500个作为剪辑的考试集,500作为基本的考试集,共3000个参照集,1000参照集。
minlen=norm(X(1,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=1:500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=1;
end
end
for j=2501:3000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=2;
end
end
if X(i,3)~=flag
X(i,3)=3;%用于后续筛选错误的训练样本出去
end
end
for i=3001:4500 %取1500个作为剪辑的考试集,500作为基本的考试集,共3000个参照集,1000参照集。
minlen=norm(X(1,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=1:500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=1;
end
end
for j=2501:3000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len
minlen=len;
flag=2;
end
end
if X(i,3)~=flag
X(i,3)=3; %用于后续筛选错误的训练样本出去,flag=3是错误的,等筛出去
end
end
%% 剪辑后的训练集用于给测试集分类,并计算错误率和错误数量,这里无需给出剪辑后1000个测试样本的分布图,只需要得到错误了多少个,减少工作量
for i=2001:2500 %样本集 (这里开始用剪辑后的训练样本对测试样本进行最近邻法程序判别)
minlen=norm(X(501,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 %把之前剪辑的不正确的样本给淘汰出去
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 %把之前剪辑的不正确的样本给淘汰出去
minlen=len;
flag=2;
end
end
if X(i,3)~=flag %这些样本中不存在flag=3的
num1=num1+1;
end
end
for i=4501:5000 %样本集
minlen=norm(X(501,1:2)-X(i,1:2))^2; %二范数的平方,先选第一个训练点作为参考点
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 %把之前剪辑的不正确的样本给淘汰出去
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 %把之前剪辑的不正确的样本给淘汰出去
minlen=len;
flag=2;
end
end
if X(i,3)~=flag %这些样本中不存在flag=3的
num1=num1+1;
end
end
%% 绘制剪辑近邻法后的测试样本点(样本分布图), 样本分布是用来对测试集进行分类的参考,这里小于3000
n=0; %统计剪辑后,还剩下多少个考试集(测试样本)
figure;
grid;
%第一类样本
for i=501:2000 %取原考试集中余下的NTE样本
if (X(i,3)~=3)
plot(X(i,1),X(i,2),'ro');
hold on;
n=n+1;
end
end
%第二类样本
for i=3001:4500 %取原考试集中余下的NTE样本
if (X(i,3)~=3)
plot(X(i,1),X(i,2),'b*');
hold on;
n=n+1;
end
end
title('剪辑后的样本分布图')
%% 压缩近邻法
%利用if-else把第一个样本找出来,即选取上面剪辑过后的第一个测试样本作为Xs集,这里两个,每类各取一个
for i=501:2000
if X(i,3)~=3
X(i,4)=1; %定义一个新的列来确定Xs和Xg两个类别的样本
break; %取一个跳出for循环
end
end
for i=3001:4500
if X(i,3)~=3
X(i,4)=1; %定义一个新的列来确定Xs和Xg两个类别的样本
break; %取一个跳出for循环
end
end
%% 进行Xs和Xg两个集合直接的转换,最终方便留下Xs作为待测样本的训练样本
xflag=1; %启动循环的条件
while xflag==1 %判断要不要终止Xs与Xg转移样本的过程
xflag=0; %假设只有这一次循环就结束,后面再改
for i=501:2000 %上面剪辑剩下的当成待测样本
flag=1; %定义初始量假设是第一类
if X(i,3)~=3 && X(i,4)~=1 %选Xg里面的样本
minlen=norm(X(501,1:2)-X(i,1:2))^2; %Xs对Xg使用近邻法看看能不能正确分类
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1 %把之前剪辑的不正确的样本给淘汰出去,并取Xs的
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1
minlen=len;
flag=2;
end
end
if X(i,3)~=flag %分类错误的
X(i,4)=1; %放到Xs中
xflag=1; %说明还得再循环
end
end
end
for i=3001:4500 %上面剪辑剩下的当成待测样本
flag=2; %重置假设是第二类
if X(i,3)~=3 && X(i,4)~=1 %选Xg里面的样本
minlen=norm(X(501,1:2)-X(i,1:2))^2; %Xs对Xg使用近邻法看看能不能正确分类
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>=len && X(j,3)~=3 && X(j,4)==1 %把之前剪辑的不正确的样本给淘汰出去,并取Xs的
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>=len && X(j,3)~=3 && X(j,4)==1
minlen=len;
flag=2;
end
end
if X(i,3)~=flag %分类错误的
X(i,4)=1; %放到Xs中
xflag=1; %说明还得再循环,知道xflag=0时退出,这时Xs真正分出来了
end
end
end
end
%% 用压缩后的样本当成训练样本,对待测样本进行近邻法分析,得出错误个数和错误率
num2=0;
for i=2001:2500
minlen=norm(X(501,1:2)-X(i,1:2))^2;
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1 %选择Xs中的作为训练样本对待测样本进行分类
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1
minlen=len;
flag=2;
end
end
if X(i,3)~=flag;
num2=num2+1;
end
end
for i=4501:5000
minlen=norm(X(501,1:2)-X(i,1:2))^2;
for j=501:2000
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1
minlen=len;
flag=1;
end
end
for j=3001:4500
len=norm(X(i,1:2)-X(j,1:2))^2;
if minlen>len && X(j,3)~=3 && X(j,4)==1
minlen=len;
flag=2;
end
end
if X(i,3)~=flag;
num2=num2+1;
end
end
%% 绘制剪辑、压缩后的训练样本图像
t=0; %统计还有多少个样本点
figure;
grid;
for i=501:2000
if X(i,3)~=3 && X(i,4)==1
plot(X(i,1),X(i,2),'ro');
hold on;
t=t+1;
end
end
for i=3001:4500
if X(i,3)~=3 && X(i,4)==1
plot(X(i,1),X(i,2),'b*');
hold on;
t=t+1;
end
end
title('压缩后的训练样本图像')
更多推荐
所有评论(0)