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