聚類——WKFCM的matlab程式 聚類——WKFCM
阿新 • • 發佈:2018-12-09
聚類——WKFCM的matlab程式
作者:凱魯嘎吉 - 部落格園 http://www.cnblogs.com/kailugaji/
在聚類——WKFCM文章中已介紹了WKFCM演算法的理論知識,現在用matlab進行實現,下面這個例子是用FCM初始化聚類中心,也可以隨機初始化聚類中心。
1.matlab程式
WKFCM_main.m
%function [ave_acc_WKFCM,max_acc_WKFCM,min_acc_WKFCM,ave_iter_WKFCM,ave_run_time]=WKFCM_main(X,real_label,K) function [ave_acc_WKFCM,max_acc_WKFCM,min_acc_WKFCM,ave_iter_FCM,ave_iter_WKFCM,ave_run_time]=WKFCM_main(X,real_label,K) %輸入K:聚的類,max_iter是最大迭代次數,T:遺傳演算法最大迭代次數,n:種群個數 X:未歸一化 %輸出ave_acc_KFCM:迭代max_iter次之後的平均準確度,iter:實際KFCM迭代次數 t0=cputime; max_iter=20; s=0; s_1=0; s_2=0; accuracy=zeros(max_iter,1); iter_WKFCM_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_WKFCM]=My_WKFCM(X,K); [label,~,iter_WKFCM,iter_FCM]=My_WKFCM(X,K); iter_WKFCM_t(i)=iter_WKFCM; iter_FCM_t(i)=iter_FCM; accuracy(i)=succeed(real_label,K,label); s=s+accuracy(i); s_1=s_1+ iter_WKFCM_t(i); s_2=s_2+ iter_FCM_t(i); %fprintf('第 %2d 次,WKFCM的迭代次數為:%2d,準確度為:%.8f\n', i, iter_WKFCM_t(i), accuracy(i)); fprintf('第 %2d 次,FCM的迭代次數為:%2d,WKFCM的迭代次數為:%2d,準確度為:%.8f\n', i, iter_FCM_t(i), iter_WKFCM_t(i), accuracy(i)); end ave_iter_FCM=s_2/max_iter; ave_iter_WKFCM=s_1/max_iter; ave_acc_WKFCM=s/max_iter; max_acc_WKFCM=max(accuracy); min_acc_WKFCM=min(accuracy); run_time=cputime-t0; ave_run_time=run_time/max_iter;
My_WKFCM.m
%function [label_1,para_miu,iter]=My_WKFCM(X,K) function [label_1,para_miu,iter,iter_FCM]=My_WKFCM(X,K) %輸入K:聚類數 %輸出:label_1:聚的類, para_miu_new:模糊聚類中心μ,responsivity:模糊隸屬度 format long eps=1e-4; %定義迭代終止條件的eps %sigma_2=2^(-4); %高斯核函式的引數sigma^2 sigma_2=150; %高斯核函式的引數sigma^2 beta=2; alpha=2; %模糊加權指數,[1,+無窮) T=100; %最大迭代次數 fitness=zeros(T,1); [X_num,X_dim]=size(X); distant=zeros(X_num,K,X_dim); kernel_fun=zeros(X_num,K,X_dim); R_temp=zeros(X_num,K,X_dim); miu_up=zeros(X_num,K,X_dim); miu_down=zeros(X_num,K,X_dim); W_temp=zeros(X_num,K,X_dim); J_temp=zeros(X_num,K,X_dim); count=zeros(X_num,1); %統計distant中每一行為0的個數 responsivity=zeros(X_num,K); R_up=zeros(X_num,K); W_up=zeros(K,X_dim); %---------------------------------------------------------------------------------------------------- %隨機初始化屬性權重K*X_dim para_weight=ones(K,X_dim)./X_dim; %隨機初始化K個聚類中心 % 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); % ---------------------------------------------------------------------------------------------------- % WKFCM演算法 for t=1:T %計算隸屬函式K*X_num for j=1:X_dim for i=1:X_num for k=1:K distant(i,k,j)=(X(i,j)-para_miu(k,j))^2; kernel_fun(i,k,j)=exp((-distant(i,k,j))/sigma_2); R_temp(i,k,j)=(para_weight(k,j)^beta)*(1-kernel_fun(i,k,j)); end end end R_down=sum(R_temp,3); for i=1:X_num count(i)=sum(R_down(i,:)==0); if count(i)>0 for k=1:K if R_down(i,k)==0 responsivity(i,k)=1./count(i); else responsivity(i,k)=0; end end else R_up(i,:)=R_down(i,:).^(-1/(alpha-1)); %隸屬度矩陣的分子部分N*K responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2); end end %更新聚類中心K*X_dim for j=1:X_dim for i=1:X_num for k=1:K miu_up(i,k,j)=responsivity(i,k)*kernel_fun(i,k,j)*X(i,j); miu_down(i,k,j)=responsivity(i,k)*kernel_fun(i,k,j); end end end miu_up_sum=sum(miu_up,1); miu_down_sum=sum(miu_down,1); for k=1:K for j=1:X_dim if para_weight(k,j)==0 para_miu(k,j)=0; else para_miu(k,j)=miu_up_sum(1,k,j)/miu_down_sum(1,k,j); end end end %更新屬性權重K*X_dim for j=1:X_dim for i=1:X_num for k=1:K distant(i,k,j)=(X(i,j)-para_miu(k,j))^2; kernel_fun(i,k,j)=exp((-distant(i,k,j))./sigma_2); W_temp(i,k,j)=(responsivity(i,k)^alpha)*(1-kernel_fun(i,k,j)); end end end W_down=sum(W_temp,1); for k=1:K for j=1:X_dim if W_down(1,k,j)==0 para_weight(k,j)=1./X_dim; else W_up(k,:)=W_down(1,k,:).^(-1/(beta-1)); %屬性權重矩陣的分子部分K*X_dim para_weight(k,:)= W_up(k,:)./sum( W_up(k,:),2); end end end %計算目標函式值 for j=1:X_dim for i=1:X_num for k=1:K distant(i,k,j)=(X(i,j)-para_miu(k,j))^2; kernel_fun(i,k,j)=exp((-distant(i,k,j))./sigma_2); J_temp(i,k,j)=(responsivity(i,k)^alpha)*(para_weight(k,j)^beta)*(1-kernel_fun(i,k,j)); end end end fitness(t)=2*sum(sum(sum( J_temp))); if t>1 if abs(fitness(t)-fitness(t-1))<eps break; end end end iter=t; %實際迭代次數 [~,label_1]=max(responsivity,[],2);
2.在UCI資料庫的iris上的執行結果
>> [ave_acc_WKFCM,max_acc_WKFCM,min_acc_WKFCM,ave_iter_FCM,ave_iter_WKFCM,ave_run_time]=WKFCM_main(data,real_label,3) 第 1 次,FCM的迭代次數為:14,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 2 次,FCM的迭代次數為:17,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 3 次,FCM的迭代次數為:28,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 4 次,FCM的迭代次數為:14,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 5 次,FCM的迭代次數為:20,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 6 次,FCM的迭代次數為:11,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 7 次,FCM的迭代次數為:19,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 8 次,FCM的迭代次數為:15,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 9 次,FCM的迭代次數為:14,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 10 次,FCM的迭代次數為:11,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 11 次,FCM的迭代次數為:21,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 12 次,FCM的迭代次數為:20,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 13 次,FCM的迭代次數為:10,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 14 次,FCM的迭代次數為:28,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 15 次,FCM的迭代次數為:18,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 16 次,FCM的迭代次數為:16,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 17 次,FCM的迭代次數為:12,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 18 次,FCM的迭代次數為:20,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 19 次,FCM的迭代次數為:12,WKFCM的迭代次數為: 4,準確度為:0.92666667 第 20 次,FCM的迭代次數為:13,WKFCM的迭代次數為: 4,準確度為:0.92666667 ave_acc_WKFCM = 0.926666666666666 max_acc_WKFCM = 0.926666666666667 min_acc_WKFCM = 0.926666666666667 ave_iter_FCM = 16.649999999999999 ave_iter_WKFCM = 4 ave_run_time = 0.232812500000000