www.pudn.com > asr.rar > KMEANS.M, change:2004-11-06,size:1349b


function codeword = kmeans(initcode,trainset) 
 
%% K-means algorithm to find a set of codeword 
%% 
%% codeword = kmeans(initcode,trainset) 
%%  
%% codeword  --- final code words 
%% initcode  --- initial code words 
%% trainset  --- training set 
 
 
%% initialization 
 
K = size(initcode,1); 
M = size(initcode,2); 
L = size(trainset,2); 
tag = zeros(L,1); 
threshold = 0.001; 
codeword=initcode; 
 
%% K-means algorithm starts here %% 
terminate = 0; 
while(terminate ~= 1) 
  %% search nearest-neighbor 
  for i= 1:L  
    mindist = sum( (codeword(:,1)-trainset(:,i)).^2 ); 
    tag(i) = 1; 
    for j = 2:M 
         tempdist = sum( (codeword(:,j)-trainset(:,i)).^2 );      
         if(tempdist  mindist) 
             tag(i) = j; 
             mindist = tempdist; 
         end 
    end  
  end   
  %% update centroids 
  for i=1:M 
     ind=find(tag==i); 
     points=size(ind,1); 
     if(points~=0) 
        centroid = zeros(K,1); 
        for j=1:points 
           centroid = centroid + trainset(:,ind(j)); 
        end 
        centroid = centroid / points; 
        codeword(:,i) = centroid; 
     end 
 
  end 
   
  %% determine if termination condition is met 
  code_change = sum( (codeword - initcode).^2 ); 
  if(max(code_change)  threshold) 
       terminate = 1; 
  else 
       initcode = codeword; 
  end 
end 
 
return