gusucode.com > 《模式识别与智能计算》matlab源代码 > 《模式识别与智能计算》matlab源代码/《模式识别与智能计算》部分函数的源程序/书程序/第2章/ISODATA.m

    function [y,z]=ISODATA(x,K,sita_N,sita_s,sita_c,iter_max)
[r,c1]=size(x);
if r<sita_N
    error('样本数太少');return
end
c=1;z=mean(x);
for iterm=1:iter_max
  for j=1:r
    [aa,d_x(j)]=min(samp_center(x(j,:),z));
  end
  d_mean=0;
  for i=1:c
     a=x(find(d_x==i),:);
     class(i).x=a;
     class_n(i)=size(a,1);
     z(i,:)=mean(class(i).x);
        for k=1:class_n(i)
          d1(k)=samp_center(class(i).x(k,:),z(i,:));
        end
     d(i)=sum(d1(1:length(a)))/length(a);
     d_mean=d_mean+d(i)*length(a)/r;
  end
  
  aa=find(class_n<sita_N);   
  aa_d=squareform(pdist(z)); 
  if ~isempty(aa)
      for i=1:length(aa)
        m=[aa_d(aa(i),1:aa(i)-1) aa_d(aa(i),aa(i)+1:end)];
        [mm,m_idex(i)]=min(m);
        class(m_idex).x=[class(m_idex).x;class(aa(i)).x];
        class_n(m_idex)=class_n(m_idex)+class_n(aa(i));
        c=c-1;
        class_n(aa(i))=[];
        class(i).x=[];
      end
  end
 
  if iterm==iter_max
      sita_c=0;
      [z,c]=hebi(z,sita_c,c,class_n);
      break
  elseif  c<=K/2        
       z_temp=z;num=0;
       for i=1:c
          [flag,z_new(i).z,c]=fengli(class(i).x,z_temp(i,:),c,K,sita_s,d(i),d_mean,class_n(i),sita_N);
          if flag~=0
            z(i,:)=zeros(1,c1);
            num=num+1;
            z=[z;z_new(i).z];
          end
       end
       z=del_zeros(z);
       if num~=0
          iterm=iterm+1;
       else
         [z,c]=hebi(z,sita_c,c,class_n);
         iterm=iterm+1;
       end    
  elseif c>=2*K||rem(iterm,2)==0  
       [z,c]=hebi(z,sita_c,c,class_n);
       iterm=iterm+1;
  end
end
for i=1:r
    [aa,y(i)]=min(samp_center(x(i,:),z));
end


function   [z,c]=hebi(z,sita_c,c,class1)  
   d=squareform(pdist(z));
   a=[];[r,c1]=size(z);
   for i=1:size(d,2)-1
      for j=i+1:size(d,2)
         if d(i,j)<sita_c
            a=[a;d(i,j) i j];
         else
            continue
         end
      end
   end
   if isempty(a)
         return;
   else    
      [amin,aidex]=min(a(:,1));     
      z_new=class1(a(aidex,2))*z(a(aidex,2),:);
      n=class1(a(aidex,2))+class1(a(aidex,3));
      z_new=(z_new+class1(a(aidex,3))*z(a(aidex,3),:))/n;
      z(a(aidex,2),:)=zeros(1,c1);
      z(a(aidex,3),:)=zeros(1,c1);
      a=[z;z_new]; 
      c=c-1;
      a_idex=all(a,2);
      z=[];
      for i=1:r+1
          if a_idex(i)==0
              continue
          else
          z=[z;a(a_idex,:)];
          end
      end
   end        
   
function [flag,z,c]=fengli(x,z,c,K,sita_s,d,d_mean,class,sita_N) 
   sigma=std(x);
   sigma_max=max(sigma);
   flag=0;
     if sigma_max>sita_s
         if (d>d_mean && class>2*(sita_N+1))||c<=K/2
           gama1=0.5*sigma_max;
           z=[z(1)+gama1 z(2:end);z(1)-gama1 z(2:end)];
           c=c+1;
           flag=flag+1;
         end
     else
         return
     end