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

📄 prexp.m

📁 模式识别作业
💻 M
字号:
clear;
sample=[5,6;6,8;8,3;8,5;9,7;11,17;12,15;14,15;14,18;24,13;25,15;26,11;28,13;28,15];
m=size(sample,1);
n=size(sample,2);
D=zeros(m,m);
L=zeros(m,m);
%计算距离矩阵D
for i=1:m
for j=1:m
D(i,j)=sqrt((sample(i,:)-sample(j,:))*(sample(i,:)-sample(j,:))');
end
end
%计算近邻函数矩阵M
M=zeros(m,m);
for i=1:m
stmp=D(i,:);
compare=D(i,:);
for j=1:m
for k=j:m
if stmp(j)>stmp(k)
swap=stmp(j);
stmp(j)=stmp(k);
stmp(k)=swap;
end
end
jdex=find(compare==stmp(j));
if size(jdex,2)>1
jdex=jdex(1);
end
M(jdex,i)=j-1;
compare(jdex)=-1;
end
end
%计算矩阵L
for i=1:m
for j=1:m
if i==j
L(i,j)=2*m;
else
L(i,j)=M(i,j)+M(j,i)-2;
end
end
end
%扫描L矩阵,得到初始聚类
figure(1);
title('初始聚类结果');
hold on;
linkmark=zeros(m,m);
cls=[];%用于保存聚类结果的数组,0用来分隔不同类
for i=1:m
index=find(L(i,:)==min(L(i,:)));
if size(index,2)>1
index=index(1);
end
fi=any(cls==i);
fin=any(cls==index);
if(fi&(~fin))
cls=[cls,index];
end
if((~fi)&fin)
cls=[cls,i];
end
if((~fi)&(~fin))
cls=[cls,0,i,index];
end
plot([sample(i,1),sample(index,1)],[sample(i,2),sample(index,2)],'-d');
linkmark(i,index)=1;%表示i,j连接在一起
end
cls=[cls,0];%作为标志便于提取各类元素
%合并类
clsn=size(find(cls==0),2)-1;%类别数clsn
%类成员menber和成员数mn
ind=zeros(1,clsn);
flag=find(cls==0);
md=max(diff(flag))-1;
mn=diff(flag)-1;
menber=zeros(clsn,md);%成员序号数组
for i=1:clsn
menber(i,:)=[cls(flag(i)+1:flag(i+1)-1),zeros(1,md-mn(i))];
end
%计算类内最大距离ind
for i=1:clsn
ind(i)=0;
if mn(i)>1
for j=1:mn(i)-1
for k=j+1:mn(i)
if ind(i)<D(menber(i,j),menber(i,k))
ind(i)=D(menber(i,j),menber(i,k));
end
end
end
end
end
msgbox('回到matlab命令行模式下按任意键进行类合并');
pause;
%比较类内最大距离和类间最小距离并合并类
title('最终聚类结果');
interd=zeros(clsn,clsn);
for i=1:clsn-1
for j=i+1:clsn
%求类间最小距离interd
interd(i,j)=D(menber(i,1),menber(j,1));
for p=1:mn(i)
for q=1:mn(j)
if interd(i,j)>D(menber(i,p),menber(j,q))
interd(i,j)=D(menber(i,p),menber(j,q));
end
end
end
if (interd(i,j)<ind(i))||(interd(i,j)<ind(j))%如果类间最小距离小于类内最大距离则合并类
plot([sample(menber(i,mn(i)),1),sample(menber(j,mn(j)),1)],[sample(menber(i,mn(i)),2),sample(menber(j,mn(j)),2)],'-d');
linkmark(i,j)=1;
end
end
end

⌨️ 快捷键说明

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