聚类——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\n', i, iter_KFCM_t(i), accuracy(i));
fprintf('第 %2d 次,FCM的迭代次数为:%2d,KFCM的迭代次数为:%2d,准确度为:%.8f\n', 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
聚类——KFCM的matlab程序的更多相关文章
- 聚类——GAKFCM的matlab程序
聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...
- 聚类——WKFCM的matlab程序
聚类——WKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——WKFCM文章中已介绍了WKFCM算法的理论知识,现在用 ...
- 聚类——FCM的matlab程序
聚类——FCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——FCM文章中已介绍了FCM算法的理论知识,现在用matlab ...
- ISODATA聚类算法的matlab程序
ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...
- canopy聚类算法的MATLAB程序
canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...
- mean shift聚类算法的MATLAB程序
mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
- KFCM算法的matlab程序
KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...
- 密度峰值聚类算法MATLAB程序
密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...
随机推荐
- DLCI 简介
数据链路连接标识(Data Link Connection Identifier) 帧中继协议是一种统计复用的协议,它在单一物理传输线路上能够提供多条虚电路.每条虚电路都是用DLCI(Data Lin ...
- Linux C 实现一个简单的线程池
线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如 ...
- C#比较两个对象是否为同一个对象。
两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...
- 一个3年Java程序员的坎与选择
前言 LZ 15年本科毕业,不知不觉3年过去了,去年底裸辞回到成都来发展,年后开始找工作,面试了几家公司,现在整理整理做个总结,也方便规划下一个3到5年以及和广大想要进阶的Java程序员同胞们共勉. ...
- Idea 15 激活
https://www.cnblogs.com/moko/p/5012006.html 1.把补丁下载到自己的电脑上 2.打开idea,help->edit custom VM options ...
- virtualbox中 Ubuntu挂载共享文件夹
1. 进入 /mnt 目录 2. 新建目录 share 3. sudo mount -t vboxsf share /mnt/share(其中的第一个share是共享文件夹的名字) 4. 成功
- [转]原生JS-查找相邻的元素-siblings方法的实现
在针对element的操作里,查找附近的元素是一个不可少的过程,比如在实现tab时,其中的一个div增加了“on”class,其他的去除“on”class.如果用jquery的朋友就肯定不会陌生sib ...
- 2018-12-14 JavaScript实现ZLOGO: 前进方向和速度
系列前文: JavaScript实现ZLOGO子集: 前进+转向 JavaScript实现ZLOGO子集: 单层循环功能 JavaScript实现ZLOGO子集: 测试用例 JavaScript实现Z ...
- oppor9手机怎么录制屏幕视频
我们已经进入互联网时代,每个人都寸步不离手机.电脑等电子产品,看到美丽好看的视频总想记录下来,毕竟看到喜欢的视频还真不太容易,所以问题来了,oppor9手机怎么录制屏幕视频呢?安卓手机上怎么录制屏幕视 ...
- JMeter java.net.URISyntaxException:Illegalcharacterinquery解决方案
java.net.URISyntaxException: Illegal character in query解决方案 by:授客 QQ:1033553122 测试环境 apache-jmeter ...