دیتاماینینگ یار

خوشه‌بندی پروفایل‌های کاربران با استفاده از روش Fuzzy C-Means در متلب

همان‌طور که قبلا ذکر شد با استفاده از الگوریتم 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

 

ارتباط و مشاوره با شما ۰۹۳۶۷۹۳۸۰۱۸ در واتس اپ

دیدگاه‌ها (6)

*
*


پاسخ من را به ایمیلم ارسال کن

    معصومه مهمان 17 اسفند 1397 پاسخ

    آشنایی با fcm

      مهدي مقيمي مدیر کل 18 اسفند 1397 پاسخ

      با سلام
      من متوجه منظور شما نشدم

    roza مهمان 17 تیر 1398 پاسخ

    سلام
    نحوه ی پیاده سازی fcm رو روی داده ای که به صورت است که 300 سطر و یک ستون دارد و در هر خانه عدد 0 یا 1 موجود است و این داده ها در فایل اکسل قرار دارند. و البته نحوه ی نمایش داده ها و پلات کردنشان چون داده ها تک بعدی هستند.

      مهدي مقيمي مدیر کل 20 مرداد 1398 پاسخ

      سلام من متوجه منظورتون نمی شم

    احمدی مهمان 8 آبان 1399 پاسخ

    با عرض سلام و خسته نباشید...
    ببخشید خوشه بندی fcm کار کاهش ویژگی هم میتونه انجام بده یا فقط کارش خوشه بندی داده ها براساس شباهتشون به یکدیگر هستش؟ و اینکه برای کاهش ویژگی نیاز به الگوریتم دیگه ای داریم یا خیر؟
    با تشکر

      مهدي مقيمي مدیر کل 25 دی 1400 پاسخ

      سلام وقت بخیر
      کاهش ویژگی یا Dimensionality Reduction ارتباطی به خوشه بندی نداره
      ابتدا با الگوریتم های مربوطه کاهش ویژگی بدید سپس به فکر خوشه بندی باشید
      تجربه شخصی من نشون داده خیلی احتمال داره که کاهش ویژگی باعث بهتر شدن صحت خوشه بندی بشه

error: با عرض پوزش؛ لطفا از مطالعه مطالب لذت ببرید.