聚类——FCM的matlab程序

时间:2018-12-09
本文章向大家介绍聚类——FCM的matlab程序,主要包括聚类——FCM的matlab程序相关应用实例、知识点总结和注意事项,具有一定的参考价值,需要的朋友可以参考一下。

聚类——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