1. 程式人生 > >聚類——KFCM的matlab程式 聚類——KFCM

聚類——KFCM的matlab程式 聚類——KFCM

聚類——KFCM的matlab程式

作者:凱魯嘎吉 - 部落格園 http://www.cnblogs.com/kailugaji/

聚類——KFCM文章中已介紹了KFCM-F演算法的理論知識,現在用matlab進行實現,下面這個例子是用FCM初始化聚類中心,也可以隨機初始化聚類中心。

1.matlab程式

KFCM_main.m

%function [ave_acc_KFCM,max_acc_KFCM,min_acc_KFCM,ave_iter_KFCM,ave_run_time]=KFCM_main(X,real_label,K)
function [ave_acc_KFCM,max_acc_KFCM,min_acc_KFCM,ave_iter_FCM,ave_iter_KFCM,ave_run_time]=KFCM_main(X,real_label,K)
%輸入K:聚的類,real_label:真實的標籤,X:資料集
%輸出ave_acc_KFCM:迭代max_iter次之後的平均準確度,iter:實際KFCM迭代次數
t0=cputime;
max_iter=20;
s_1=0;
s_2=0;
s_3=0;
accuracy=zeros(max_iter,1);
iter_KFCM_t=zeros(max_iter,1);
iter_FCM_t=zeros(max_iter,1);
%對data做最大-最小歸一化處理
% [data_num,~]=size(data);
% X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
for i=1:max_iter
    %[label,iter_KFCM]=My_KFCM(X,K);
    [label,iter_KFCM,~,iter_FCM]=My_KFCM(X,K);
    iter_KFCM_t(i)=iter_KFCM;
    iter_FCM_t(i)=iter_FCM;
    accuracy(i)=succeed(real_label,K,label);
    s_1=s_1+accuracy(i);
    s_2=s_2+iter_KFCM_t(i);
    s_3=s_3+iter_FCM_t(i);
    %fprintf('第 %2d 次,KFCM的迭代次數為:%2d,準確度為:%.8f\n', i, iter_KFCM_t(i), accuracy(i));
    fprintf('第 %2d 次,FCM的迭代次數為:%2d,KFCM的迭代次數為:%2d,準確度為:%.8f\n', i,  iter_FCM_t(i),  iter_KFCM_t(i), accuracy(i));
end
ave_iter_FCM=s_3/max_iter;
ave_iter_KFCM=s_2/max_iter;
ave_acc_KFCM=s_1/max_iter;
max_acc_KFCM=max(accuracy);
min_acc_KFCM=min(accuracy);
run_time=cputime-t0;
ave_run_time=run_time/max_iter;

My_KFCM.m

%function  [label, iter_KFCM, para_miu]=My_KFCM(X,K)
function  [label, iter_KFCM, para_miu,iter_FCM]=My_KFCM(X,K)
%輸入K:聚類數,X:資料集
%輸出:label:聚的類, para_miu:模糊聚類中心μ,iter_KFCM:KFCM迭代次數
format long
eps=1e-4;  %定義迭代終止條件的eps
alpha=2;  %模糊加權指數,[1,+無窮)
T=100;  %最大迭代次數
%sigma_2=2^(-4);  %高斯核函式的引數sigma^2
sigma_2=150;  %高斯核函式的引數sigma^2
[X_num,X_dim]=size(X);
fitness=zeros(X_num,1);  %目標函式
responsivity=zeros(X_num,K);  %隸屬函式
R_up=zeros(X_num,K);  %隸屬函式的分子部分
count=zeros(X_num,1);  %統計distant中每一行為0的個數
%隨機初始化K個聚類中心
% [X_num,~]=size(X);
% rand_array=randperm(X_num);  %產生1~X_num之間整數的隨機排列
% para_miu=X(rand_array(1:K),:);  %隨機排列取前K個數,在X矩陣中取這K行作為初始聚類中心
%用FCM初始聚類中心
[~,para_miu,iter_FCM]=My_FCM(X,K);
% KFCM演算法
for t=1:T
    %歐氏距離,計算(X-para_miu)^2=X^2+para_miu^2-2*para_miu*X',矩陣大小為X_num*K
    distant=(sum(X.*X,2))*ones(1,K)+ones(X_num,1)*(sum(para_miu.*para_miu,2))'-2*X*para_miu';
    %高斯核函式,X_num*K的矩陣
    kernel_fun=exp((-distant)./(sigma_2));   
    %更新隸屬度矩陣X_num*K
    for i=1:X_num
        count(i)=sum(kernel_fun(i,:)==1);
        if count(i)>0
            for k=1:K
                if kernel_fun(i,k)==1
                    responsivity(i,k)=1./count(i);
                else
                    responsivity(i,k)=0;
                end
            end
        else
            R_up(i,:)=(1-kernel_fun(i,:)).^(-1/(alpha-1));  %隸屬度矩陣的分子部分
            responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2);
        end
    end
    %目標函式值
    fitness(t)=2*sum(sum((ones(X_num,K)-kernel_fun).*(responsivity.^(alpha))));
     %更新聚類中心K*X_dim
    miu_up=(kernel_fun.*(responsivity.^(alpha)))'*X;  %μ的分子部分
    para_miu=miu_up./(sum(kernel_fun.*(responsivity.^(alpha)))'*ones(1,X_dim));
    if t>1  
        if abs(fitness(t)-fitness(t-1))<eps
            break;
        end
    end
end
iter_KFCM=t;  %實際迭代次數
[~,label]=max(responsivity,[],2);

2.在UCI資料庫的iris上的執行結果

>> [ave_acc_KFCM,max_acc_KFCM,min_acc_KFCM,ave_iter_FCM,ave_iter_KFCM,ave_run_time]=KFCM_main(data,real_label,3)
第  1 次,FCM的迭代次數為:12,KFCM的迭代次數為: 2,準確度為:0.89333333
第  2 次,FCM的迭代次數為:12,KFCM的迭代次數為: 2,準確度為:0.89333333
第  3 次,FCM的迭代次數為:18,KFCM的迭代次數為: 2,準確度為:0.89333333
第  4 次,FCM的迭代次數為:12,KFCM的迭代次數為: 2,準確度為:0.89333333
第  5 次,FCM的迭代次數為:14,KFCM的迭代次數為: 2,準確度為:0.89333333
第  6 次,FCM的迭代次數為:27,KFCM的迭代次數為: 2,準確度為:0.89333333
第  7 次,FCM的迭代次數為:15,KFCM的迭代次數為: 2,準確度為:0.89333333
第  8 次,FCM的迭代次數為:20,KFCM的迭代次數為: 2,準確度為:0.89333333
第  9 次,FCM的迭代次數為:13,KFCM的迭代次數為: 2,準確度為:0.89333333
第 10 次,FCM的迭代次數為:16,KFCM的迭代次數為: 2,準確度為:0.89333333
第 11 次,FCM的迭代次數為:15,KFCM的迭代次數為: 2,準確度為:0.89333333
第 12 次,FCM的迭代次數為:10,KFCM的迭代次數為: 2,準確度為:0.89333333
第 13 次,FCM的迭代次數為:24,KFCM的迭代次數為: 2,準確度為:0.89333333
第 14 次,FCM的迭代次數為:19,KFCM的迭代次數為: 2,準確度為:0.89333333
第 15 次,FCM的迭代次數為:10,KFCM的迭代次數為: 2,準確度為:0.89333333
第 16 次,FCM的迭代次數為:16,KFCM的迭代次數為: 2,準確度為:0.89333333
第 17 次,FCM的迭代次數為:15,KFCM的迭代次數為: 2,準確度為:0.89333333
第 18 次,FCM的迭代次數為:27,KFCM的迭代次數為: 2,準確度為:0.89333333
第 19 次,FCM的迭代次數為:15,KFCM的迭代次數為: 2,準確度為:0.89333333
第 20 次,FCM的迭代次數為:12,KFCM的迭代次數為: 2,準確度為:0.89333333

ave_acc_KFCM =
   0.893333333333333

max_acc_KFCM =
   0.893333333333333

min_acc_KFCM =
   0.893333333333333

ave_iter_FCM =
  16.100000000000001

ave_iter_KFCM =
     2

ave_run_time =
   0.028125000000000