%==================isodata算法的matla实现代码======================= %=========================主程序部分================================ function isodata(X,K,theta_N,theta_S0,theta_C0,L0,I)
%输入样本X 每一列为一个样本
%输入预期的聚类数目K
%输入每一聚类样本域的最小数目theta_N
%输入同一聚类域中样本距离分布的标准差theta_S
%输入两个聚类中心的最小距离theta_C
%输入一次迭代运算中可以合并的聚类中心的最多对数L
%输入迭代运算的次数I
global n N Nc z w theta_S
theta_C L theta_S=theta_S0;
theta_C=theta_C0;
L=L0;
[n,N]=size(X);
Nc=K;
z=X(:,1:Nc);
w=zeros(1,N); %w存储每一个元素的类别
iteration=1; %循环次数控制
flag=1;
while flag==1
for i=1:N
w(i)=classification(z,X(:,i));
end %判断是否需取消某些类
i=1;
while i<=Nc
di=find(w==i);
if length(di)z_temp=z;
z(:,i)=[];
for j=1:length(di)
w(di(j))=classification(z,z_temp(:,di(j)));
end
Nc=Nc-1;
i=i-1;
end
i=i+1;
end
%更新分类中心的值
for i=1:Nc
di=find(w==i);
z(:,i)=sum(X(:,di),2)/length(di);