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

聚类——WKFCM的matlab程序的更多相关文章

  1. 聚类——GAKFCM的matlab程序

    聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...

  2. 聚类——KFCM的matlab程序

    聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...

  3. 聚类——FCM的matlab程序

    聚类——FCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——FCM文章中已介绍了FCM算法的理论知识,现在用matlab ...

  4. ISODATA聚类算法的matlab程序

    ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...

  5. canopy聚类算法的MATLAB程序

    canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...

  6. mean shift聚类算法的MATLAB程序

    mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...

  7. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  8. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  9. MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 脑图像基础知识请看:脑图像:FCM算法介绍请看:聚类——FCM:数据 ...

随机推荐

  1. Redis持久化及其配置

    引言 终于可以有时间继续看书,整理自己的见解, 写下2019年第一篇自己的随笔.从去年9月份跳槽到新公司后,几乎天天的加班让整个人都盲目了,原本计划好的事情总是会被打乱.都说坚持一件事情很难,特别是写 ...

  2. Hyperledger Fabric链码之三

    在<Hyperledger Fabric链码之一>和<Hyperledger Fabric链码之二>中我们介绍了链码的定义,并通过dev网络测试了测试了自己编写的链码程序. 本 ...

  3. 高可用集群之keepalived+lvs实战-技术流ken

    keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...

  4. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  5. 数据分析面试题之Pandas中的groupby

      昨天晚上,笔者有幸参加了一场面试,有一个环节就是现场编程!题目如下:   示例数据如下,求每名学生(ID)对应的成绩(score)最高的那门科目(class)与ID,用Python实现: 这个题目 ...

  6. [转]Nginx 静态资源缓存设置

    本文转自:https://www.w3cschool.cn/nginxsysc/nginxsysc-cache.html 在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存 ...

  7. 关于EF中出现FOREIGNKEY约束可能会导致循环或多重级联路径的问题

    ef中,我们创建外键的时候需要注意,否则会出现标题所示问题. 例:有项目表,项目收藏表,用户表 项目表有如下字段:ProjectId,InputPersonId等 项目收藏表有如下字段:Project ...

  8. T-SQL:qualify和window 使用(十七)

    1.qualify 是一个潜在的额外筛选器 主要用于对开窗函数的数据筛选 SELECT orderid, orderdate, val, RANK() OVER(ORDER BY val DESC) ...

  9. Redirect all output to file

    That part is written to stderr, use 2> to redirect it. For example: foo > stdout.txt 2> std ...

  10. Android LiveData使用

    LiveData是一个可观察的数据持有者类. 与常规observable不同,LiveData是生命周期感知的,当生命周期处于STARTED或RESUMED状态,则LiveData会将其视为活动状态, ...