聚類——FCM的matlab程式 聚類——FCM
阿新 • • 發佈:2018-12-09
聚類——FCM的matlab程式
作者:凱魯嘎吉 - 部落格園 http://www.cnblogs.com/kailugaji/
在聚類——FCM文章中已介紹了FCM演算法的理論知識,現在用matlab進行實現。
1.matlab程式
FCM_main.m
function [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(X,real_label,K) %輸入K:聚的類,max_iter是最大迭代次數 %輸出ave_acc_FCM:迭代max_iter次之後的平均準確度 t0=cputime; s=0; s_1=0; max_iter=20; %重複max_iter次 accuracy=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_1,~,iter_FCM]=My_FCM(X,K); iter_FCM_t(i)=iter_FCM; accuracy(i)=succeed(real_label,K,label_1); s=s+accuracy(i); s_1=s_1+iter_FCM_t(i); fprintf('第 %2d 次,FCM的迭代次數為:%2d,準確度為:%.8f\n', i, iter_FCM_t(i), accuracy(i)); end ave_iter_FCM=s_1/max_iter; ave_acc_FCM=s/max_iter; max_acc_FCM=max(accuracy); min_acc_FCM=min(accuracy); run_time=cputime-t0; ave_run_time=run_time/max_iter;
My_FCM.m
function [label_1,para_miu_new,iter]=My_FCM(X,K) %輸入K:聚類數 %輸出:label_1:聚的類, para_miu_new:模糊聚類中心μ,responsivity:模糊隸屬度 format long eps=1e-4; %定義迭代終止條件的eps alpha=2; %模糊加權指數,[1,+無窮) T=100; %最大迭代次數 fitness=zeros(T,1); [X_num,X_dim]=size(X); count=zeros(X_num,1); %統計distant中每一行為0的個數 %---------------------------------------------------------------------------------------------------- %隨機初始化K個聚類中心 rand_array=randperm(X_num); %產生1~X_num之間整數的隨機排列 para_miu=X(rand_array(1:K),:); %隨機排列取前K個數,在X矩陣中取這K行作為初始聚類中心 responsivity=zeros(X_num,K); R_up=zeros(X_num,K); % ---------------------------------------------------------------------------------------------------- % FCM演算法 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 for i=1:X_num count(i)=sum(distant(i,:)==0); if count(i)>0 for k=1:K if distant(i,k)==0 responsivity(i,k)=1./count(i); else responsivity(i,k)=0; end end else R_up(i,:)=distant(i,:).^(-1/(alpha-1)); %隸屬度矩陣的分子部分 responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2); end end %目標函式值 fitness(t)=sum(sum(distant.*(responsivity.^(alpha)))); %更新聚類中心K*X_dim miu_up=(responsivity'.^(alpha))*X; %μ的分子部分 para_miu=miu_up./((sum(responsivity.^(alpha)))'*ones(1,X_dim)); if t>1 if abs(fitness(t)-fitness(t-1))<eps break; end end end para_miu_new=para_miu; iter=t; %實際迭代次數 [~,label_1]=max(responsivity,[],2);
2.在UCI資料庫的iris上的執行結果
>> data_load=dlmread('E:\My matlab\database\iris.data');data=data_load(:,1:4);real_label=data_load(:,5); >> [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(data,real_label,3) 第 1 次,FCM的迭代次數為:33,準確度為:0.89333333 第 2 次,FCM的迭代次數為:41,準確度為:0.89333333 第 3 次,FCM的迭代次數為:14,準確度為:0.89333333 第 4 次,FCM的迭代次數為:13,準確度為:0.89333333 第 5 次,FCM的迭代次數為:16,準確度為:0.89333333 第 6 次,FCM的迭代次數為:10,準確度為:0.89333333 第 7 次,FCM的迭代次數為:21,準確度為:0.89333333 第 8 次,FCM的迭代次數為:46,準確度為:0.89333333 第 9 次,FCM的迭代次數為:19,準確度為:0.89333333 第 10 次,FCM的迭代次數為:18,準確度為:0.89333333 第 11 次,FCM的迭代次數為:17,準確度為:0.89333333 第 12 次,FCM的迭代次數為:38,準確度為:0.89333333 第 13 次,FCM的迭代次數為:37,準確度為:0.89333333 第 14 次,FCM的迭代次數為:11,準確度為:0.89333333 第 15 次,FCM的迭代次數為:22,準確度為:0.89333333 第 16 次,FCM的迭代次數為:17,準確度為:0.89333333 第 17 次,FCM的迭代次數為:13,準確度為:0.89333333 第 18 次,FCM的迭代次數為: 8,準確度為:0.89333333 第 19 次,FCM的迭代次數為:13,準確度為:0.89333333 第 20 次,FCM的迭代次數為:20,準確度為:0.89333333 ave_acc_FCM = 0.893333333333333 max_acc_FCM = 0.893333333333333 min_acc_FCM = 0.893333333333333 ave_iter_FCM = 21.350000000000001 ave_run_time = 0.035937500000000