?? leijian_new2.m
字號:
function leijian_new2(train_file,cha_num,lei_num) %train_file 是打開的輸入文件名 lie_num是類數(shù)
train=train_file(:,1:(2+cha_num));
%train=xlsread(train_file);
yang_num=size(train,1);
%########################### 一、準(zhǔn)備工作 ##############################
%初始化聚類,第一維與第二維記錄樣本特征,第三維記錄類別號,初始化時共60個類別
for ii=1:yang_num
julei(1,:,ii)=train(ii,:);
for jj=2:yang_num
julei(jj,:,ii)=0;
end
end
%%%%%%%%%%%%%%%%%% 初始化聚類結(jié)束 %%%%%%%%%%%%%%%%%%%%%%%%
% dd用于存放任意兩個類中各個樣本間的距離
dd=9999;
%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距離矩陣 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
% d矩陣中存放所有各個樣本間的距離,如第一行第二列,是第一類到第二類的距離
% 對角線及對角線以下的無用,全部置為9999,那么選擇類與類的距離的時候便不會選到他們
for ii=1:yang_num
for jj=1:yang_num
d(ii,jj)=9999;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距離矩陣結(jié)束 %%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% 有效聚類數(shù) %%%%%%%%%%%%%%%%%%%%%%%%
%有效聚類是指內(nèi)容不為空的類,比如第一類與第二類合并后,將第二類的樣本放入第一類
%而將第二類清零,此時第二類為無效聚類。
n=0;
for ii=1:yang_num
if julei(1,1,ii)~=0
n=n+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 準(zhǔn)備工作結(jié)束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%############################ 二、開始聚類 ###############################
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
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
for mm=1:num1
for nn=1:num2
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)=sum(sum(dd))/(num1*num2);
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
d=ones(yang_num,yang_num);
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
%############################# ###############################
%############################# 聚類全部結(jié)束 ###############################
%############################ 三、后期處理 ############################
%############################ 三、后期處理 ############################
%挑出有效類
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('聚類結(jié)果')
Final_ju
aa=size(Final_ju,1);
%當(dāng)只有三個類的時候
%區(qū)聚類所屬并計(jì)算模板
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
lei_1_1=0;lei_1_2=0;lei_1_3=0;
lei_2_1=0;lei_2_2=0;lei_2_3=0;
lei_3_1=0;lei_3_2=0;lei_3_3=0;
for ii=1:aa
switch Final_ju(ii,2,1)
case 1
lei_1_1=lei_1_1+1;
case 2
lei_1_2=lei_1_2+1;
case 3
lei_1_3=lei_1_3+1;
end
if lei_1_1>lei_1_2&lei_1_1>lei_1_3
lei_1=Final_ju(1:num1,:,1);
end
if lei_1_2>lei_1_1&lei_1_2>lei_1_3
lei_2=Final_ju(1:num1,:,1);
end
if lei_1_3>lei_1_2&lei_1_3>lei_1_1
lei_3=Final_ju(1:num1,:,1);
end
switch Final_ju(ii,2,2)
case 1
lei_2_1=lei_2_1+1;
case 2
lei_2_2=lei_2_2+1;
case 3
lei_2_3=lei_2_3+1;
end
if lei_2_1>lei_2_2&lei_2_1>lei_2_3
lei_1=Final_ju(1:num2,:,2);
end
if lei_2_2>lei_2_1&lei_2_2>lei_2_3
lei_2=Final_ju(1:num2,:,2);
end
if lei_2_3>lei_2_2&lei_2_3>lei_2_1
lei_3=Final_ju(1:num2,:,2);
end
switch Final_ju(ii,2,3)
case 1
lei_3_1=lei_3_1+1;
case 2
lei_3_2=lei_3_2+1;
case 3
lei_3_3=lei_3_3+1;
end
if lei_3_1>lei_3_2&lei_3_1>lei_3_3
lei_1=Final_ju(1:num3,:,3);
end
if lei_3_2>lei_3_1&lei_3_2>lei_3_3
lei_2=Final_ju(1:num3,:,3);
end
if lei_3_3>lei_3_2&lei_3_3>lei_3_1
lei_3=Final_ju(1:num3,:,3);
end
end
lei_1
lei_2
lei_3
end
if lei_num==3&(cha_num>3|cha_num==3)
figure
colordef black;
plot3(lei_1(:,3),lei_1(:,4),lei_1(:,5),'r*',lei_2(:,3),lei_2(:,4),lei_2(:,5),'y*',lei_3(:,3),lei_3(:,4),lei_3(:,5),'g*')
title('聚類后各類前三特征三維視圖');
%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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -