%% 剪辑近邻法
%% 初始化操作
clc
close all
clear all
n=100;
N=3*n;
%% 训练样本1 二维联合正态分布的期望和方差,并随机产生 N 个样本
mu1=[2 3];
SIGMA1=[20 1.5; 1.5 30];
tra_sam1 = mvnrnd(mu1,SIGMA1,N);
%% 训练样本2 二维联合正态分布的期望和方差,并随机产生 N 个样本
mu2=[10,11];
SIGMA2=[20 1.5;1.5 30];
tra_sam2 = mvnrnd(mu2,SIGMA2,N);
%% 保留原始样本
tra_sam_org1=tra_sam1;
tra_sam_org2=tra_sam2;
%% 对样本进行分类,分为3类
num0=0; %% 用于存放上一次剪辑后样本个数
edit_time=0; %% 记录剪辑次数
m=0; %% 记录没有可被剪辑样本的连续次数
N1=N;N2=N; %%分别记录剪辑后样本类1,类2的样本个数
while m<5
m11=1;m21=1;m31=1;
m12=1;m22=1;m32=1;
%% 将样本分成三类
for i=1:N1
t=rand;
if t<=0.33
cell_sam11(m11,:)=tra_sam1(i,:);
m11=m11+1;
elseif t<=0.66
cell_sam21(m21,:)=tra_sam1(i,:);
m21=m21+1;
else
cell_sam31(m31,:)=tra_sam1(i,:);
m31=m31+1;
end
end
for i=1:N2
s=rand;
if s<=0.33
cell_sam12(m12,:)=tra_sam2(i,:);
m12=m12+1;
elseif s<=0.66
cell_sam22(m22,:)=tra_sam2(i,:);
m22=m22+1;
else
cell_sam32(m32,:)=tra_sam2(i,:);
m32=m32+1;
end
end
%% 对子集进行剪辑,去掉错分的样本
%% 利用子集2,对子集1中的cell_sam11进行裁剪
cell_sam11=cutting(cell_sam11,cell_sam21,cell_sam22);
%% 利用子集2,对子集1中的cell_sam12进行裁剪
cell_sam12=cutting(cell_sam12,cell_sam22,cell_sam21);
%% 利用子集3,对子集2中的cell_sam21进行裁剪
cell_sam21=cutting(cell_sam21,cell_sam31,cell_sam32);
%% 利用子集3,对子集2中的cell_sam22进行裁剪
cell_sam22=cutting(cell_sam22,cell_sam32,cell_sam31);
%% 利用子集1,对子集3中的cell_sam31进行裁剪
cell_sam31=cutting(cell_sam31,cell_sam11,cell_sam12);
%% 利用子集1,对子集3中的cell_sam32进行裁剪
cell_sam32=cutting(cell_sam32,cell_sam12,cell_sam11);
%% 剪辑后对样本进行整理,合并,组成新的训练样本
tra_sam1=[cell_sam11;cell_sam21;cell_sam31];
tra_sam2=[cell_sam12;cell_sam22;cell_sam32];
cell_sam11=zeros(1,2);cell_sam21=zeros(1,2);cell_sam31=zeros(1,2);
cell_sam12=zeros(1,2);cell_sam22=zeros(1,2);cell_sam32=zeros(1,2);
[a1,b1]=size(tra_sam1);
[c1,d1]=size(tra_sam2);
num1=a1+c1; %% 计算剩余总样本个数
N1=a1;
N2=c1;
if (num1-num0==0)
m=m+1;
else
m=0;
end
num0=num1;
edit_time=edit_time+1;
end
%% -------------------%%
%% 对剪辑好的样本进行压缩
grabbag1=tra_sam1;
grabbag2=tra_sam2;
grabbag=[grabbag1;grabbag2];
%% 计算存储器grabbag中类1和类2 的个数
[gra_r1,column3]=size(grabbag1);
[gra_r2,column4]=size(grabbag2);
%% 随机选取一个样本放入store中,
%% 可以等价为随机选取类1和类2,两个样本放入store中
store1=grabbag1(1,:);
grabbag1=grabbag1(2:gra_r1,:);
gra_r1=gra_r1-1;
store2=grabbag2(1,:);
grabbag2=grabbag2(2:gra_r2,:);
gra_r2=gra_r2-1;
gra_r=gra_r1+gra_r2;
sto_num1=2;%% store 的下标
sto_num2=2;
gra_tem=0;
m=0;
while(m<2*gra_r)
t=rand;
if t<=0.5 %% 如果属于类1
q=randperm(gra_r1);
for i=1:sto_num1-1
distance1(i)=norm(grabbag1(q(1),:)-store1(i,:));
end
for i=1:sto_num2-1
distance2(i)=norm(grabbag1(q(1),:)-store2(i,:));
end
dist_min1=min(distance1);
dist_min2=min(distance2);
if dist_min1>dist_min2 %% 如果判断错误,放入store
store1(sto_num1,:)=grabbag1(q(1),:);
grabbag1=[grabbag1(1:q(1)-1,:);grabbag1(q(1)+1:gra_r1,:)];
gra_r1=gra_r1-1;
sto_num1=sto_num1+1;
end
else %% 如果属于类2
q=randperm(gra_r2);
for i=1:sto_num1-1
distance1(i)=norm(grabbag2(q(1),:)-store1(i,:));
end
for i=1:sto_num2-1
distance2(i)=norm(grabbag2(q(1),:)-store2(i,:));
end
dist_min1=min(distance1);
dist_min2=min(distance2);
if dist_min1<dist_min2 %% 如果判断错误,放入store
store2(sto_num2,:)=grabbag2(q(1),:);
grabbag2=[grabbag2(1:q(1)-1,:);grabbag2(q(1)+1:gra_r2,:)];
gra_r2=gra_r2-1;
sto_num2=sto_num2+1;
end
end
gra_r=gra_r1+gra_r2;
if gra_r==gra_tem
m=m+1;
else
m=0;
end
gra_tem=gra_r;
end
edit_time
sto_num1=sto_num1-1
sto_num2=sto_num2-1
%% 绘图
%% 绘制原始样本点
figure('NumberTitle', 'off', 'Name', '原样本点');
scatter(tra_sam_org1(:,1),tra_sam_org1(:,2),'r')
hold on
scatter(tra_sam_org2(:,1),tra_sam_org2(:,2),50,'kx')
axis([-20,30,-20,30])
title('原始样本')
xlabel('特征1')
ylabel('特征2')
legend('类1','类2',2)
%% 绘制剪辑后样本点
figure('NumberTitle', 'off', 'Name', '剪辑后样本点');
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),50,'kx')
axis([-20,30,-20,30])
title('算法终止时样本点')
xlabel('特征1')
ylabel('特征2')
legend('类1','类2',2)
%% 绘制压缩后样本点
figure('NumberTitle', 'off', 'Name', '压缩后样本点');
scatter(store1(:,1),store1(:,2),'r')
hold on
scatter(store2(:,1),store2(:,2),50,'kx')
axis([-20,30,-20,30])
title('压缩后样本点')
xlabel('特征1')
ylabel('特征2')
legend('类1','类2',2)
模式识别算法matlab程序_压缩_剪辑近邻法_parzen窗_c均值算法_bayes判别.zip
版权申诉
146 浏览量
2023-10-21
09:40:00
上传
评论
收藏 15KB ZIP 举报
2201_75761617
- 粉丝: 18
- 资源: 7339
最新资源
- 使用 C 语言实现的计算非负整数的阶乘
- 2011-2021最新版本北京大学数字普惠金融指数(PKU-DFIIC).xlsx
- 县域数字乡村指数2018-2020(1).xlsx
- Docker容器配置进阶
- tensorflow-gpu-2.7.4-cp37-cp37m-manylinux2010-x86-64.whl
- 多段线、 圆、弧转多段线(仅我可见)
- tensorflow-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- 李慧琴C语言基础部分.zip
- yeyue-p8Yi4-ve4a83792.apk
- tensorflow-gpu-2.7.3-cp38-cp38-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈