نحوه استفاده از برنامه ای که در زیر میاد به این صورته:
rng('default');
[T1,C1] = Repkmeans(V1, nClass, 'emd', 5);
rng('default');
[T2,C2] = Repkmeans(V1, nClass, 'cosine', 5);
5 تعداد تکرار هست و همین طور که مشاهده می کنید قبل از اجرا هر kmeans مقدار rng را برابر default و یا یک عدد یکسان مثلا 2456 قرار بدید تا شرایط برای همه یکسان باشه همچنین خود متلب هم یک تابع به نام pdist2 داره که انواع و اقسام فاصله ها در اون هست که می تونید در اینجا از نام اونها استفاده کنید
function [labels , mu]=Repkmeans(data, k, distType,replicates)
[labels,mu, sumd]= mykmeans(data, k, distType);
if (replicates > 1)
for i = 2:replicates
[labelstemp,mutemp, sumdtemp]= mykmeans(data, k, distType);
if (sumdtemp < sumd)
sumd = sumdtemp;
labels = labelstemp;
mu = mutemp;
end
end
end
end
function [labels,mu, sumd]=mykmeans(data, k, distType)
data = double(data);
labels =uint8(zeros(size(data ,1) ,1));
uniqvals = unique(data,'rows');
randomindex = randperm(size(uniqvals, 1));
mu = uniqvals(randomindex(1:k),:);
mutemp = zeros(size(mu));
while (true)
minDistance = pdist3(data , mu(1, :),distType);
labels(:) = 1;
for i = 2: k
tempDistance = pdist3(data , mu(i, :), distType);
ans1 = minDistance < tempDistance;
labels = uint8(ans1) .* labels + uint8(~ans1) .* i ;
minDistance = min (minDistance, tempDistance);
end
for i = 1: k
mutemp(i,:) = mean(data(labels == i, :), 1);
end
if (all(mu == mutemp))
sumd= sum(minDistance(:));
break;
end
mu = mutemp;
end
end
function result = pdist3(X , Y , distType)
if(distType == 'emd')
result = distEmd (X , Y);
else
result = pdist2(X , Y , distType);
end
end
function D = distEmd( X, Y )
Xcdf = cumsum(X,2);
Ycdf = cumsum(Y,2);
m = size(X,1); n = size(Y,1);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
ycdf = Ycdf(i,:);
ycdfRep = ycdf( mOnes, : );
D(:,i) = sum(abs(Xcdf - ycdfRep),2);
end
end