剪辑近邻法及压缩近邻法-matlab实现

% =====================压缩剪辑近邻算法(Condensing)====================
% s:  划分的子集数目
% Xn: 当前样本集
% Xcur: 当前样本集经一次迭代后的样本集
% Xi: 当前考试集
% Xr: 当前参考集
% K:  退出控制条件,迭代K次,若没有样本被剪辑掉,则退出
% =====================================================================
clear,close all;
X = [randn(300,2)+ones(300,2);...
     randn(300,2)-ones(300,2);];
X(1:300,3)=1;X(301:600,3)=2;
% ====================================================================
figure, plot(X(1:300,1),X(1:300,2),'r.')
hold on,plot(X(301:600,1),X(301:600,2),'b.')
title('初始样本分布图')
% ================================================================
s=3;Xcur=X;loop=0;Xold=X;K=5;
while loop<K
    Xn=Xcur;
    Xold=Xcur;
    Xcur=[];
    [row1,col]=size(Xn);
    uu=unifrnd(0,s,row1,1);%产生row1行1列的随机数,随机数的范围在0-s之间
    uu=ceil(uu);%取整,方向是使数据变大
    for i=1:s   %样本随机划分为s个子集
        Xi=Xn((uu==i),:);%test set %Xi为考试集   
        r=mod(i+1,s);%取余数
        if r==0
            r=s;
        end
        Xr=Xn((uu==r),:);%reference set%Xr为训练集    
        [row,col]=size(Xi);   
        j=1;
        while j<=row
            [rClass,jClass]=NNforCondense(Xr,Xi(j,:));%用训练集中的样本对考试集中的样本进行最近邻分类
            if rClass~=jClass%如果类别不同,则从考试集中分类错误的样本去除
                Xi(j,:)=[];                
                row=row-1;
            else
                j=j+1;
            end            
        end
        Xcur=[Xcur;Xi];
    end
    [oldRow,col]=size(Xold);
    [curRow,col]=size(Xcur);
    if oldRow==curRow       
        loop=loop+1;
    else
        loop=0;
    end
end 
% ================================================================
%把当前样本集Xcur中的元素按原类别分类
[row,col]=size(Xcur);
Xcur1=[];Xcur2=[];
tic
for i=1:row    
    if Xcur(i,3)==1
        Xcur1=[Xcur1;Xcur(i,1:2)];       
    elseif Xcur(i,3)==2
        Xcur2=[Xcur2;Xcur(i,1:2)];     
    end
end
time1=toc;
figure, plot(Xcur1(:,1),Xcur1(:,2),'r.')
hold on,plot(Xcur2(:,1),Xcur2(:,2),'b.')
title('剪辑后样本分布图')
% ===================Condensing=================================
Xstore=Xcur(1,:);
Xgab=Xcur(2:row,:);
while 1
    Xoldstore=Xstore;
    [row,col]=size(Xgab);
    j=1;
    while j<=row
        [sClass,gClass]=NNforCondense(Xstore,Xgab(j,:));
        if sClass~=gClass
            Xstore=[Xstore;Xgab(j,:)];
            Xgab(j,:)=[];
            row=row-1;
        else
            j=j+1;
        end
    end
    [oldRow,col]=size(Xoldstore);
    [curRow,col]=size(Xstore); 
    [gRow,rCol]=size(Xgab);
    if oldRow==curRow | gRow*rCol==0
        break;
    end
end
Xcurstore1=[];Xcurstore2=[];
[curRow,col]=size(Xstore); 
for i=1:curRow
    if Xstore(i,3)==1
        Xcurstore1=[Xcurstore1;Xstore(i,1:2)];
    else
        Xcurstore2=[Xcurstore2;Xstore(i,1:2)];
    end
end
figure, plot(Xcurstore1(:,1),Xcurstore1(:,2),'r.')
hold on,plot(Xcurstore2(:,1),Xcurstore2(:,2),'b.')
axis([-4 5,-4 5]);
title('压缩后样本分布图')
% ---一般近邻算法---
% num:    每类的样本数目
% rClass: 返回值,x在Xr中最近邻的样本类别
% xClass: 返回值,x的样本类别
% ========================================================
function [rClass,xClass]=NNforCondense(Xr,x)

tic
% X = [randn(200,2)+ones(200,2);...
%      randn(200,2)-2*ones(200,2);...
%      randn(200,2)+4*ones(200,2);];
%  x=randn(1,2);%待判样本
[row,col]=size(Xr);
Xdist=zeros(row,1);
for i=1:row
    Xdist(i)=norm(x(1,1:2)-Xr(i,1:2))^2;
end
[Xdist,ind]=sort(Xdist,'ascend');
B=dist(1);
Xnn=Xr(ind(1),:);
rClass=Xnn(1,3);
xClass=x(1,3);
times=toc;
  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值