資源簡介
自己編寫了一個實現ISODATA聚類算法的程序。(目標程序是將樣本分成兩類,各個參數見程序注釋)

代碼片段和文件信息
clc;
clear;
x=[0?0;1?1;2?2;4?3;5?3;4?4;5?4;6?5];%樣本點
figure(1);
plot(x(:1)x(:2)‘.‘);
hold?on;
w=zeros(1length(x));%class?type
%----------------------------------初始化參數-----------------------------------
%------C為類別,Tn為每類允許最少樣本數,Ts為類內各分量標準差上限,Td為兩類中心間最小距離下限
%------L為每次迭代可以合并的最多的類數目,I為允許的最大迭代次數,Nc為初始中心數
%------z_center為每類中心的存放(初始為一類),Ip為當前迭代次數
C=2;Tn=2;Ts=1;Td=4;
L=1;I=4;Nc=1;
z_center=[00];Ip=1;
plot(z_center(:1)z_center(:2)‘ro‘);
while(Ip<=I)
????%-----------------------------(2)clustering-----------------------------------
????%----------------------------------------------------------------------
????Center_d=pdist2(z_centerx);
????[rc]=size(Center_d);
????for?(i=1:c)
????????[valuew(i)]=min(Center_d(:i));
????end
????x1=[x?w‘];%data?and?class?type?
????%-----------------------------(3)if(class?member? ????%----------------------------------------------------------------------
????C_num=zeros(1r);%class?num
????for(i=1:r)
????????for(j=1:c)
????????????if(w(j)==i)
???????????????C_num(i)=C_num(i)+1;
????????????end
????????end
????end
????sign=0;
????for(i=r:1)
????????if(C_num(i) ????????????sign=1;
????????????Nc=Nc-1;
????????????z_center(i:)=[];
????????end
????end
????if?(sign==1)
????????sign=0;
????????continue;%goto?(2)
????end
????%--------------------------(4)-----------------------------------------
????%----------------------------------------------------------------------
????avr_cd=zeros(1r);
????avr_d=0;
????temp=0;
????%compute?the?new?class?center?
????for?i=1:r
????????x2=sum(x1(x1(:3)==i:));
????????x2(3)=[];
????????z_center(i:)=x2/C_num(i);
????end
????%compute?the?average?distance?of?each?class
????for?i=1:r
????????for?(j=1:length(x1))
????????????if(x1(j3)==i)
????????????????temp=temp+pdist2(z_center(i:)x(j:));
????????????end
????????end
????????avr_cd(i)=temp/C_num(i);
????????temp=0;
????end
????%compute?the?whole?average?distance
????for?i=1:r
????????temp=temp+avr_cd(i)*C_num(i);
????end
????avr_d=temp/length(x);
????temp=0;
????%--------------------------(5)-----------------------------------------
????%----------------------------------------------------------------------
????if(Nc<=C/2)
????????for?(i=1:r)
????????sigma(i:)=std(x(x1(:3)==i:));
????????end
????????for?(i=1:r)
????????????max_sigma(i1)=max(sigma(i:));
????????end
????????for?(i=1:r)
????????????if?((max_sigma(i)>Ts)&&((avr_cd(i)>=avr_d&&(C_num(i)>2*(Tn+1)))))
????????????????Nc=Nc+1;
????????????????A=z_center(1:i-1:);
????????????????B=z_center(i+1:end:);
????????????????Z1=z_center(i:)+[0.5*max_sigma(i)0.5*max_sigma(i)];
????????????????Z2=z_center(i:)-[0.5*max_sigma(i)0.5*max_sigma(i)];
????????????????z_center=[A;Z1;Z2;B];
????????????end
????????end
%------
????else
????????if?(Nc>=2*C||mod(Nc2)~=0)
????????????for(i=1:r-1)
????????????????for(j=i+1:r)
??????????????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5222??2013-04-25?18:14??isodata.m
?????文件??????84480??2013-04-25?18:04??ISODATA流程圖.vsd
-----------?---------??----------?-----??----
????????????????89702????????????????????2
- 上一篇:music算法頻譜估計
- 下一篇:matlab 自動識別物體
評論
共有 條評論