📄 dan_new2.m
字号:
function dan_new2(train_file,cha_num,lei_num) %train_file 是打开的输入文件名 lie_num是类数
train=train_file(:,1:(2+cha_num));
%train=xlsread(train_file);
yang_num=size(train,1);
%########################### 一、准备工作 ##############################
%初始化聚类,第一维与第二维记录样本特征,第三维记录类别号,初始化时共60个类别
for ii=1:yang_num
julei(1,:,ii)=train(ii,:);
for jj=2:yang_num
julei(jj,:,ii)=0;
end
end
kk=size(julei,2);
%%%%%%%%%%%%%%%%%% 初始化聚类结束 %%%%%%%%%%%%%%%%%%%%%%%%
% dd用于存放任意两个类中各个样本间的距离
dd=9999;
%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距离矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
% d矩阵中存放所有各个样本间的距离,如第一行第二列,是第一类到第二类的距离
% 对角线及对角线以下的无用,全部置为9999,那么选择类与类的距离的时候便不会选到他们
for ii=1:yang_num
for jj=1:yang_num
d(ii,jj)=9999;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距离矩阵结束 %%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% 有效聚类数 %%%%%%%%%%%%%%%%%%%%%%%%
%有效聚类是指内容不为空的类,比如第一类与第二类合并后,将第二类的样本放入第一类
%而将第二类清零,此时第二类为无效聚类。
n=0;
for ii=1:yang_num
if julei(1,1,ii)~=0
n=n+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 准备工作结束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%############################ 二、开始聚类 ###############################
while n~=lei_num
%算距离
for ii=1:yang_num
for jj=1:yang_num
if julei(1,1,ii)~=0&julei(1,1,jj)~=0&ii<jj
for mm=1:yang_num
for nn=1:yang_num
if julei(mm,1,ii)~=0&julei(nn,1,jj)~=0
dd(mm,nn)=sum((julei(mm,3:(2+cha_num),ii)-julei(nn,3:(2+cha_num),jj)).^2).^0.5;
end
end
end
d(ii,jj)=min(min(dd));
end
dd=zeros(1);
dd=9999;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%合并
for ii=1:yang_num
for jj=1:yang_num
if d(ii,jj)==min(min(d))
ii
jj
num1=0;num2=0;
for mm=1:yang_num
if julei(mm,1,ii)~=0
num1=num1+1;
end
if julei(mm,1,jj)~=0
num2=num2+1;
end
end
number=1;
for nn=(num1+1):(num1+num2)
julei(nn,:,ii)=julei(number,:,jj);
number=number+1;
end
julei(:,:,jj)=0;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%初始化
for ii=1:yang_num
for jj=1:yang_num
d(ii,jj)=9999;
end
end
%计算有效聚类
n=0;
for ii=1:yang_num
if julei(1,1,ii)~=0
n=n+1;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%############################# ###############################
%############################# 聚类全部结束 ###############################
%############################ 三、后期处理 ############################
%挑出有效类
a=1;
for ii=1:yang_num
if julei(1,1,ii)~=0
num1=0;
for mm=1:yang_num
if julei(mm,1,ii)~=0
num1=num1+1;
end
end
Final_ju(1:num1,:,a)=[julei(1:num1,:,ii)];
a=a+1;
end
end
disp('聚类结果')
Final_ju
aa=size(Final_ju,1);
%当只有三个类的时候
%区聚类所属并计算模板
if lei_num==3
num1=0;num2=0;num3=0;
for ii=1:aa
if Final_ju(ii,1,1)~=0
num1=num1+1;
end
if Final_ju(ii,1,2)~=0
num2=num2+1;
end
if Final_ju(ii,1,3)~=0
num3=num3+1;
end
end
end
if lei_num==3&cha_num==4
figure
plot(Final_ju(1:num1,5,1),Final_ju(1:num1,4,1),'r*',Final_ju(1:num2,5,2),Final_ju(1:num2,4,2),'m*',Final_ju(1:num3,5,3),Final_ju(1:num3,4,3),'g*')
figure
colordef black;
plot3(Final_ju(1:num1,3,1),Final_ju(1:num1,4,1),Final_ju(1:num1,5,1),'r*',Final_ju(1:num2,3,2),Final_ju(1:num2,4,2),Final_ju(1:num2,4,2),'m*',Final_ju(1:num3,3,3),Final_ju(1:num3,4,3),Final_ju(1:num3,5,3),'g*')
grid
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -