聚类——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
- 免杀后门之MSF&Veil-Evasion的完美结合
- 【52ABP实战教程】0.3-- 从GitHub推送代码回VSTS实现双向同步
- css绝对定位如何在不同分辨率下的电脑正常显示定位位置?
- nvm安装node和npm,个人踩坑记录
- clang_intprt_t类型探究
- 学习zepto.js(Hello World)
- JS中函数声明与函数表达式的异同
- [技巧]看我如何通过Weeman+Ettercap拿下路由器管理权限
- 一分钟理清Vue-cli 代码构建步骤。
- 点击图片放大至原始图片大小
- 替代jquery1.9版本以前的toggle事件函数(开关)
- 总结CSS3新特性(Animation篇)
- Scrapy爬虫入门
- 移动端页面按手机屏幕分辨率自动缩放的js
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforce 266c Below the Diagonal 矩阵变换 (思维题)
- Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
- 探索ParNew和CMS垃圾回收器
- Codeforce-Ozon Tech Challenge 2020-B. Kuroni and Simple Strings(贪心)
- 第K短路+严格第K短路
- PostgreSQL异常重启postmaster.pid处理
- Codeforce-Ozon Tech Challenge 2020-A. Kuroni and the Gifts
- 洛谷P3360偷天换日(树形DP)
- Java开发编程规范: 2.常量定义
- Codeforces Round #509 (Div. 2) A. Heist 贪心
- CodeForces - 1176A Divide it! (模拟+分类处理)
- Codeforces Round #460 (Div. 2)-A Supermaket(贪心)
- Codeforces Round #561 (Div. 2) A. Silent Classroom(贪心)
- codeforces 1287A -Angry Students(模拟)
- 洛谷 2016 战略游戏(树形DP)