zoukankan      html  css  js  c++  java
  • 聚类——KFCM的matlab程序

    聚类——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
    ', i, iter_KFCM_t(i), accuracy(i));
        fprintf('第 %2d 次,FCM的迭代次数为:%2d,KFCM的迭代次数为:%2d,准确度为:%.8f
    ', 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
    
  • 相关阅读:
    顺序表与链表
    Python SQL相关操作
    Python 数据分析练习1
    Python 操作MySQL数据库
    Python 乘法口诀表
    Python 导出数据from Mysql
    Python subplot 绘画
    Shell 自定义函数
    Shell 双括号概述
    Shell for、while循环
  • 原文地址:https://www.cnblogs.com/kailugaji/p/10090424.html
Copyright © 2011-2022 走看看