• 聚类——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
    ', 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);
    

    succeed.m

    function accuracy=succeed(real_label,K,id)
    %输入K:聚的类,id:训练后的聚类结果,N*1的矩阵
    N=size(id,1);   %样本个数
    p=perms(1:K);   %全排列矩阵
    p_col=size(p,1);   %全排列的行数
    new_label=zeros(N,p_col);   %聚类结果的所有可能取值,N*p_col
    num=zeros(1,p_col);  %与真实聚类结果一样的个数
    %将训练结果全排列为N*p_col的矩阵,每一列为一种可能性
    for i=1:N
        for j=1:p_col
            for k=1:K
                if id(i)==k
                    new_label(i,j)=p(j,k);  %iris数据库,1 2 3
                end
            end
        end
    end
    %与真实结果比对,计算精确度
    for j=1:p_col
        for i=1:N
            if new_label(i,j)==real_label(i)
                    num(j)=num(j)+1;
            end
        end
    end
    accuracy=max(num)/N;

    2.在UCI数据库的iris上的运行结果

    >> data_load=dlmread('E:My matlabdatabaseiris.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
    

    3. iris.data

    5.1,3.5,1.4,0.2,1
    4.9,3.0,1.4,0.2,1
    4.7,3.2,1.3,0.2,1
    4.6,3.1,1.5,0.2,1
    5.0,3.6,1.4,0.2,1
    5.4,3.9,1.7,0.4,1
    4.6,3.4,1.4,0.3,1
    5.0,3.4,1.5,0.2,1
    4.4,2.9,1.4,0.2,1
    4.9,3.1,1.5,0.1,1
    5.4,3.7,1.5,0.2,1
    4.8,3.4,1.6,0.2,1
    4.8,3.0,1.4,0.1,1
    4.3,3.0,1.1,0.1,1
    5.8,4.0,1.2,0.2,1
    5.7,4.4,1.5,0.4,1
    5.4,3.9,1.3,0.4,1
    5.1,3.5,1.4,0.3,1
    5.7,3.8,1.7,0.3,1
    5.1,3.8,1.5,0.3,1
    5.4,3.4,1.7,0.2,1
    5.1,3.7,1.5,0.4,1
    4.6,3.6,1.0,0.2,1
    5.1,3.3,1.7,0.5,1
    4.8,3.4,1.9,0.2,1
    5.0,3.0,1.6,0.2,1
    5.0,3.4,1.6,0.4,1
    5.2,3.5,1.5,0.2,1
    5.2,3.4,1.4,0.2,1
    4.7,3.2,1.6,0.2,1
    4.8,3.1,1.6,0.2,1
    5.4,3.4,1.5,0.4,1
    5.2,4.1,1.5,0.1,1
    5.5,4.2,1.4,0.2,1
    4.9,3.1,1.5,0.1,1
    5.0,3.2,1.2,0.2,1
    5.5,3.5,1.3,0.2,1
    4.9,3.1,1.5,0.1,1
    4.4,3.0,1.3,0.2,1
    5.1,3.4,1.5,0.2,1
    5.0,3.5,1.3,0.3,1
    4.5,2.3,1.3,0.3,1
    4.4,3.2,1.3,0.2,1
    5.0,3.5,1.6,0.6,1
    5.1,3.8,1.9,0.4,1
    4.8,3.0,1.4,0.3,1
    5.1,3.8,1.6,0.2,1
    4.6,3.2,1.4,0.2,1
    5.3,3.7,1.5,0.2,1
    5.0,3.3,1.4,0.2,1
    7.0,3.2,4.7,1.4,2
    6.4,3.2,4.5,1.5,2
    6.9,3.1,4.9,1.5,2
    5.5,2.3,4.0,1.3,2
    6.5,2.8,4.6,1.5,2
    5.7,2.8,4.5,1.3,2
    6.3,3.3,4.7,1.6,2
    4.9,2.4,3.3,1.0,2
    6.6,2.9,4.6,1.3,2
    5.2,2.7,3.9,1.4,2
    5.0,2.0,3.5,1.0,2
    5.9,3.0,4.2,1.5,2
    6.0,2.2,4.0,1.0,2
    6.1,2.9,4.7,1.4,2
    5.6,2.9,3.6,1.3,2
    6.7,3.1,4.4,1.4,2
    5.6,3.0,4.5,1.5,2
    5.8,2.7,4.1,1.0,2
    6.2,2.2,4.5,1.5,2
    5.6,2.5,3.9,1.1,2
    5.9,3.2,4.8,1.8,2
    6.1,2.8,4.0,1.3,2
    6.3,2.5,4.9,1.5,2
    6.1,2.8,4.7,1.2,2
    6.4,2.9,4.3,1.3,2
    6.6,3.0,4.4,1.4,2
    6.8,2.8,4.8,1.4,2
    6.7,3.0,5.0,1.7,2
    6.0,2.9,4.5,1.5,2
    5.7,2.6,3.5,1.0,2
    5.5,2.4,3.8,1.1,2
    5.5,2.4,3.7,1.0,2
    5.8,2.7,3.9,1.2,2
    6.0,2.7,5.1,1.6,2
    5.4,3.0,4.5,1.5,2
    6.0,3.4,4.5,1.6,2
    6.7,3.1,4.7,1.5,2
    6.3,2.3,4.4,1.3,2
    5.6,3.0,4.1,1.3,2
    5.5,2.5,4.0,1.3,2
    5.5,2.6,4.4,1.2,2
    6.1,3.0,4.6,1.4,2
    5.8,2.6,4.0,1.2,2
    5.0,2.3,3.3,1.0,2
    5.6,2.7,4.2,1.3,2
    5.7,3.0,4.2,1.2,2
    5.7,2.9,4.2,1.3,2
    6.2,2.9,4.3,1.3,2
    5.1,2.5,3.0,1.1,2
    5.7,2.8,4.1,1.3,2
    6.3,3.3,6.0,2.5,3
    5.8,2.7,5.1,1.9,3
    7.1,3.0,5.9,2.1,3
    6.3,2.9,5.6,1.8,3
    6.5,3.0,5.8,2.2,3
    7.6,3.0,6.6,2.1,3
    4.9,2.5,4.5,1.7,3
    7.3,2.9,6.3,1.8,3
    6.7,2.5,5.8,1.8,3
    7.2,3.6,6.1,2.5,3
    6.5,3.2,5.1,2.0,3
    6.4,2.7,5.3,1.9,3
    6.8,3.0,5.5,2.1,3
    5.7,2.5,5.0,2.0,3
    5.8,2.8,5.1,2.4,3
    6.4,3.2,5.3,2.3,3
    6.5,3.0,5.5,1.8,3
    7.7,3.8,6.7,2.2,3
    7.7,2.6,6.9,2.3,3
    6.0,2.2,5.0,1.5,3
    6.9,3.2,5.7,2.3,3
    5.6,2.8,4.9,2.0,3
    7.7,2.8,6.7,2.0,3
    6.3,2.7,4.9,1.8,3
    6.7,3.3,5.7,2.1,3
    7.2,3.2,6.0,1.8,3
    6.2,2.8,4.8,1.8,3
    6.1,3.0,4.9,1.8,3
    6.4,2.8,5.6,2.1,3
    7.2,3.0,5.8,1.6,3
    7.4,2.8,6.1,1.9,3
    7.9,3.8,6.4,2.0,3
    6.4,2.8,5.6,2.2,3
    6.3,2.8,5.1,1.5,3
    6.1,2.6,5.6,1.4,3
    7.7,3.0,6.1,2.3,3
    6.3,3.4,5.6,2.4,3
    6.4,3.1,5.5,1.8,3
    6.0,3.0,4.8,1.8,3
    6.9,3.1,5.4,2.1,3
    6.7,3.1,5.6,2.4,3
    6.9,3.1,5.1,2.3,3
    5.8,2.7,5.1,1.9,3
    6.8,3.2,5.9,2.3,3
    6.7,3.3,5.7,2.5,3
    6.7,3.0,5.2,2.3,3
    6.3,2.5,5.0,1.9,3
    6.5,3.0,5.2,2.0,3
    6.2,3.4,5.4,2.3,3
    5.9,3.0,5.1,1.8,3
  • 相关阅读:
    linux自动清理30天之前的文件
    Oracle树查询及相关函数
    jackson循环引用导致序列化stackOverFlow的解决
    java核心技术36讲笔记
    Quartz学习
    Quartz学习
    java核心技术36讲
    git常用命令
    CTCall简介(后续会继续补充)
    自定义导航栏,隐藏导航栏底部的灰色线条
  • 原文地址:https://www.cnblogs.com/kailugaji/p/10090397.html
Copyright © 2020-2023  润新知