همانطور که قبلا ذکر شد با استفاده از الگوریتم Fuzzy C-Means در محیط نرمافزار MATLAB اجرا شده است .در پیادهسازی Fuzzy C-Means با MATLAB انعطافهای لازمه در قالب پارامترهای ورودی درنظر گرفته شده که کد آن با توضیحات مربوطه در این بخش ذکر می گردند.
تابع fcm که کد آن در زیر بیان شده تابع اصلی برنامه است. با فراخوانی این تابع، عملیات خوشهبندی به روش Fuzzy C-Means Clustering انجام میشود. این تابع دارای پارامترهای مختلف ورودی است. پارامتر Xdat حاوی دادههای ورودی به تابع با سایز M در N است. پارامتر K بیانگر تعداد کلاسترها در مجموعه دادهها است. mfuz پارامترفازی است. پارامتر epsilon حاوی حد پایین ماتریس پارتیشن است که از آن برای شرط توقف تابع استفاده میشود. پارامتر itmax برابر با ماکزیمم تعداد تکرارهای الگوریتم، قبل از توقف آن است. خروجیهای تابع نیز به این شرح است. Umat برابر با ماتریس پارتیشن فازی است. Cmat حاوی ماتریس مراکز است. it حاوی تعداد تکرارهایی است که تاکنون انجام شده است. valJ حاوی مقدار حساب شده شرطهای مربوط به خوشهها است.
function [Umat,Cmat,it,valJ] = fcm(Xdat,K,mfuz,epsilon,itmax);
[M,N] = size(Xdat);
% initialization of Cmat using random values
Cmat = fcm_dataInitC(Xdat,K);
% compute matrix of distance
Dmat = fcm_calcD(Xdat,Cmat);
% compute initial Umat
Umat = fcm_calcU(mfuz,Dmat);
Ut = Umat;
it=1; stab = 0;
while (it<itmax & stab ~=1)
% compute Cmat, the matrix of centroids, from Xdat and Ut
Cmat = fcm_calcC(Xdat,K,mfuz,Ut);
% Compute Dmat, the matrix of distances (euclidian)
Dmat = fcm_calcD(Xdat,Cmat);
% update Umat, the fuzzy partition matrix
Umat = fcm_calcU(mfuz,Dmat);
% Calculate difference between Ut and Umat and put it in Ut
Ut = Ut-Umat;
fnorm = norm(Ut,’fro’);
if (fnorm<epsilon) stab = 1; else Ut = Umat; end
it = it+1;
end
valJ = fcm_evalJ(Umat,mfuz,Dmat);
return %% end of function fcm.m
این تابع برای مقداردهی اولیه مراکز خوشههای بطور تصادفی، استفاده میشود.
function Cmat = fcm_dataInitC(Xdat,K);
[M,N] = size(Xdat);
Cidx = floor((N-1)*rand(K,1)+1);
for ik=1:K
Cmat(:,ik) = Xdat(:,Cidx(ik));
end
return %% end of function fcm_dataInitC()
این تابع، ماتریس مراکز خوشهها را محاسبه میکند.
function Cmat = fcm_calcC(Xdat,K,mfuz,Umat);
[M,N] = size(Xdat);
for k=1:K
tmp = (Umat(k,:).^mfuz);
nume = Xdat*tmp’;
deno = sum(tmp);
Cmat(:,k) = nume/deno;
end
return %% end of function fcm_calcC()
این تابع، فاصله بین یک داده و مرکز خوشه را حساب میکند.
function Dmat = fcm_calcD(Xdat,Cmat);
[M,N] = size(Xdat);
[M2,K] = size(Cmat);
if (M ~= M2)
error(‘fcm_calcD() : incompatible dimensions’);
end
for ik=1:K
for ii=1:N
dvect = Xdat(:,ii)-Cmat(:,ik);
Dmat(ik,ii) = dvect’*dvect;
end
end
return %% end of function fcm_calcD()
این تابع برای محاسبه ماتریس پارتیشن با استفاده از ماتریس فاصلهها استفاده میشود.
function Umat = fcm_calcU(mfuz,Dmat);
[K,N] = size(Dmat);
for r=1:N
cardIr = 0;
for s=1:K
if (Dmat(s,r) == 0.0) cardIr = cardIr+1; end
end
if (cardIr == 0)
for s=1:K
nume = Dmat(s,r);
deno = (nume./Dmat(:,r)).^(1/(mfuz-1));
Umat(s,r) = 1.0/sum(deno);
end
else
for s=1:K
if (Dmat(s,r) == 0.0)
Umat(s,r) = 1.0/cardIr;
else
Umat(s,r)= 0.0;
end
end
end
end
return %% end of function fcm_calcU.m
این تابع، مقدار یک شرط را حساب میکند.
function valJ = fcm_evalJ(Umat,mfuz,Dmat);
[K, N] = size(Umat);
[K2,N2] = size(Dmat);
if ((K ~= K2) | (N ~= N2))
error(‘fcm_evalJ() : incompatible dimensions’);
end
valJ = 0;
for k=1:K
valJ = valJ+((Umat(k,:).^mfuz)*Dmat(k,:)’);
end
return %end of function fcm_evalJ()
همچنین برای محاسبه مقدار کران بالای پارامتر فازی در خوشه بندی فازی C-means نیز میتوان از تابع زیر (calcMub) استفاده نمود.
function [mub,it] = calcMub(Xdat,seuil,itmax,epsilon);
[M,N] = size(Xdat);
vD = calcDataDist(Xdat); %% can be computationally expensive
% User can modify the following three parameters
%seuil = 0.03; itmax = 500; epsilon = 0.001;
cv_mub = seuil*M;
[mub,it] = searchMub(vD,cv_mub,epsilon,itmax);
return; %% end of function calcMub.m
که در آن دو تابع درونی calcDataDist و searchMub استفاده شده است. تابع اول که قطعه کد آن در زیر آمده است، برای محاسبه ماتریس فاصله بین نمونههای مجموعه داده بهکار میرود.
function vDist = calcDataDist(Xdat);
[M,N] = size(Xdat);
id = 1;
for r=1:N
for c=r+1:N
vect = Xdat(:,r)-Xdat(:,c);
vDist(id) = vect’*vect;
id = id+1;
end
end
return %% end of function calcDataDist.m
تابع searchMub نیز که قطعه کد آن در زیر آورده شده است، برای یافتن مقدار کران بالای پارامتر فازی بهکار برده میشود.
function [mub,it] = searchMub(vDist,cv_mub,epsilon,itmax);
Yo = vDist/max(vDist);
cv = std(Yo)/mean(Yo);
mubMax = 1000; % can be adjusted by user
it = 1;
if (abs(cv-cv_mub)<epsilon)
mub = 2;
else
if (cv>cv_mub)
m1 = 2;
m2 = mubMax;
else
m1 = 1+epsilon;
m2 = 2;
end
while ((it<itmax) & (abs(cv-cv_mub)>epsilon))
m = (m1+m2)/2;
d = 1/(m-1);
Y = Yo.^d;
cv = std(Y)/mean(Y);
if (abs(cv-cv_mub)<epsilon)
mub = m;
elseif (cv>cv_mub)
m1 = m;
else
m2 = m;
end
it = it+1;
end
end
return; %% end of function searchMub.m;
همچنین، برای محاسبه مقادیر میانگین، انحراف معیار و ضرائب تغییرات مجموعه فواصل نیز میتوان از تابع calcStatYm بهره جست. در زیر، قطعه کد مربوط به این تابع آورده شده است.
function [moy,dev,cv,cvp] = calcStatYm(Y,m,p);
Ym = Y.^(1/(m-1));
moy = mean(Ym);
dev = std(Ym);
cv = dev/moy;
cvp = cv/p;
return %% end of function calcStatYm.m
دیدگاهها (0)