⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s4_5_q9_old.m

📁 Duda《模式分类》第二版第1、3、5章部分课后习题和上机题的解答和程序代码
💻 M
字号:
function nearest_classify
% 画出数据点的位置
clear all;close all;clc;
w1=[10,0;0,-10;5,-2];
w2=[5,10;0,5;5,5];
w3=[2,8;-5,2;10,-4];

region=[-12 12 -12 12 100];
subplot(221);
patterns=[w1;w2]';
D=voronoi_regions(patterns, region);
% n=3;
% for i=1:n
%     distmat=[];
%     for j=1:n
%         perpendicular_bisector(w1(i,:),w2(j,:));
% %         dist=distant(w1(i,:),w2(j,:));
% %         distmat(end+1)=dist;
%     end
% %     k=find(distmat==min(distmat));
% %     perpendicular_bisector(w1(i,:),w2(k,:));
% end
% axis square;
subplot(222);
patterns=[w1;w3]';
D=voronoi_regions(patterns, region);
subplot(223);
patterns=[w2;w3]';
D=voronoi_regions(patterns, region);
subplot(224);
patterns=[w1;w2;w3]';
D=voronoi_regions(patterns, region);


function D = voronoi_regions(patterns, region)
% Make a Voronoi diagram from sample points
% Inputs:
%	patterns	- Input data patterns
%	targets	- Input data targets
%	region	- Decision region vector: [-x x -y y number_of_points]

N		= region(5);
x		= linspace (region(1),region(2),N);
y		= linspace (region(3),region(4),N);
D		= zeros(N);
[r,c] = size(patterns);

y_dist	= (ones(N,1) * patterns(2,:) - y'*ones(1,c)).^2;
for i = 1:N
   x_dist = ones(N,1)  * (patterns(1,:)-x(i)).^2;
   dist   = abs(x_dist + y_dist);
   [sorted_dist, indices] = min(dist');
   D(i,:) = indices(1,:);
end

i=1:N^2;
rx=mod(i,N);rx(find(rx==0))=N;cy=ceil(i/N);
xn=x(rx)';yn=y(cy)';
cx=ceil(i/N);ry=mod(i,N);ry(find(ry==0))=N;
ind=sub2ind([N,N],cx,ry);
dr=D(ind);
dc=D(:);

in=1:N^2-1;
lp_c=find(dc(in)~=dc(in+1));
lp_c=lp_c(find(mod(lp_c,N)~=0));
xp_c=xn(lp_c);yp_c=yn(lp_c);
plot(xp_c,yp_c,'.b');hold on;

lp_r=find(dr(in)~=dr(in+1));
lp_r=lp_r(find(mod(lp_r,N)~=0));
xp_r=yn(lp_r);yp_r=xn(lp_r);
plot(xp_r,yp_r,'.b');

color=['r';'g';'b';'m';'k';'y'];
% C=color(dc,:);
% for i=1:N^2
%     plot(xn(i),yn(i),'s','MarkerFaceColor',C(i,:));
% end
pn=size(patterns,2);
for i=1:pn
    plot(patterns(1,i),patterns(2,i),'o','MarkerFaceColor',color(ceil(i/3),:));
end
plot(region(1):region(2),zeros(1,region(2)-region(1)+1),'k');
plot(zeros(1,region(4)-region(3)+1),region(3):region(4),'k');
axis(region(1:4));axis square;


function dist=distant(point1,point2)
x1=point1(1);y1=point1(2);
x2=point2(1);y2=point2(2);
dist=sqrt((x2-x1)^2+(y2-y1)^2);


function perpendicular_bisector(point1,point2)
x1=point1(1);y1=point1(2);
x2=point2(1);y2=point2(2);
x3=mean([x1,x2]);y3=mean([y1,y2]);
if y2~=y1
    ko=-(x2-x1)/(y2-y1);
    b=y3-ko*x3;
end
[range,xory]=max([x2-x1,y2-y1]);
step=range/50;
if xory==1
    if y2==y1
        y4=x3-range/2:step:x3+range/2;
        x4=x3*ones(1,length(y4));
    else
        x4=x3-range/2:step:x3+range/2;
        y4=ko*x4+b;
    end
elseif xory==2
    x4=x3-range/2:step:x3+range/2;
    y4=ko*x4+b;
end
plot(x4,y4,'k','LineWidth',2);hold on;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -