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