QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 13622|回复: 9
打印 上一主题 下一主题

模糊c均值聚类 FCM算法的MATLAB代码

[复制链接]

522

主题

10

听众

4072

积分

自我介绍
学习中!

优秀斑竹奖 元老勋章 新人进步奖 最具活力勋章

群组Matlab讨论组

群组C 语言讨论组

群组每天多学一点点

群组数学趣味、游戏、IQ等

群组南京邮电大学数模协会

跳转到指定楼层
1#
发表于 2010-5-30 23:59 |只看该作者 |倒序浏览
本帖最后由 sea_star666 于 2010-5-31 00:02 编辑
  1. 模糊c均值聚类 FCM算法的MATLAB代码

  2. 我做毕业论文时需要模糊C-均值聚类,找了好长时间才找到这个,分享给大家:



  3. FCM算法的两种迭代形式的MATLAB代码写于下,也许有的同学会用得着:
  4. m文件1/7:
  5. function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
  6. % 模糊 C 均值聚类 FCM: 从随机初始化划分矩阵开始迭代
  7. % [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)
  8. % 输入:
  9. %     Data: N×S 型矩阵,聚类的原始数据,即一组有限的观测样本集,
  10. %           Data 的每一行为一个观测样本的特征矢量,S 为特征矢量
  11. %           的维数,N 为样本点的个数
  12. %     C:    聚类数,1<C<N
  13. %     plotflag: 聚类结果 2D/3D 绘图标记,0 表示不绘图,为缺省值        
  14. %     M:    加权指数,缺省值为 2
  15. %     epsm: FCM 算法的迭代停止阈值,缺省值为 1.0e-6
  16. % 输出:
  17. %     U:    C×N 型矩阵,FCM 的划分矩阵
  18. %     P:    C×S 型矩阵,FCM 的聚类中心,每一行对应一个聚类原型
  19. %     Dist: C×N 型矩阵,FCM 各聚类中心到各样本点的距离,聚类中
  20. %           心 i 到样本点 j 的距离为 Dist(i,j)
  21. %     Cluster_Res: 聚类结果,共 C 行,每一行对应一类
  22. %     Obj_Fcn: 目标函数值
  23. %     iter: FCM 算法迭代次数
  24. % See also: fuzzydist maxrowf fcmplot
  25. if nargin<5
  26.     epsm=1.0e-6;
  27. end
  28. if nargin<4
  29.     M=2;
  30. end
  31. if nargin<3
  32.     plotflag=0;
  33. end
  34. [N,S]=size(Data);m=2/(M-1);iter=0;
  35. Dist(C,N)=0; U(C,N)=0; P(C,S)=0;
  36. % 随机初始化划分矩阵
  37. U0 = rand(C,N);
  38. U0=U0./(ones(C,1)*sum(U0));
  39. % FCM 的迭代算法
  40. while true
  41.     % 迭代计数器
  42.     iter=iter+1;
  43.     % 计算或更新聚类中心 P
  44.     Um=U0.^M;
  45.     P=Um*Data./(ones(S,1)*sum(Um'))';   
  46.     % 更新划分矩阵 U
  47.     for i=1:C
  48.         for j=1:N
  49.             Dist(i,j)=fuzzydist(P(i,:),Data(j,:));
  50.         end
  51.     end         
  52.     U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));         
  53.     % 目标函数值: 类内加权平方误差和
  54.     if nargout>4 | plotflag
  55.         Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
  56.     end
  57.     % FCM 算法迭代停止条件
  58.     if norm(U-U0,Inf)<epsm
  59.         break
  60.     end
  61.     U0=U;   
  62. end
  63. % 聚类结果
  64. if nargout > 3
  65.     res = maxrowf(U);
  66.     for c = 1:C
  67.         v = find(res==c);
  68.         Cluster_Res(c,1:length(v))=v;
  69.     end
  70. end
  71. % 绘图
  72. if plotflag
  73.     fcmplot(Data,U,P,Obj_Fcn);
  74. end
  75. m文件2/7:
  76. function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm)
  77. % 模糊 C 均值聚类 FCM: 从指定初始聚类中心开始迭代
  78. % [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm2(Data,P0,plotflag,M,epsm)
  79. % 输入: Data,plotflag,M,epsm: 见 fuzzycm.m
  80. %       P0: 初始聚类中心
  81. % 输出: U,P,Dist,Cluster_Res,Obj_Fcn,iter: 见 fuzzycm.m   
  82. % See also: fuzzycm
  83. if nargin<5
  84.     epsm=1.0e-6;
  85. end
  86. if nargin<4
  87.     M=2;
  88. end
  89. if nargin<3
  90.     plotflag=0;
  91. end
  92. [N,S] = size(Data); m = 2/(M-1); iter = 0;
  93. C=size(P0,1);Dist(C,N)=0;U(C,N)=0;P(C,S)=0;
  94. % FCM 的迭代算法
  95. while true
  96.     % 迭代计数器
  97.     iter=iter+1;
  98.     % 计算或更新划分矩阵 U
  99.     for i=1:C
  100.         for j=1:N
  101.             Dist(i,j)=fuzzydist(P0(i,:),Data(j,:));
  102.         end
  103.     end         
  104.     U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));      
  105.     % 更新聚类中心 P
  106.     Um=U.^M;
  107.     P=Um*Data./(ones(S,1)*sum(Um'))';   
  108.     % 目标函数值: 类内加权平方误差和
  109.     if nargout>4 | plotflag
  110.         Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
  111.     end
  112.     % FCM 算法迭代停止条件
  113.     if norm(P-P0,Inf)<epsm
  114.         break
  115.     end
  116.     P0=P;
  117. end
  118. % 聚类结果
  119. if nargout > 3
  120.     res = maxrowf(U);
  121.     for c = 1:C
  122.         v = find(res==c);
  123.         Cluster_Res(c,1:length(v))=v;
  124.     end
  125. end
  126. % 绘图
  127. if plotflag
  128.     fcmplot(Data,U,P,Obj_Fcn);
  129. end
  130. m文件3/7:
  131. function fcmplot(Data,U,P,Obj_Fcn)
  132. % FCM 结果绘图函数
  133. % See also: fuzzycm maxrowf ellipse
  134. [C,S] = size(P); res = maxrowf(U);
  135. str = 'po*x+d^v><.h';
  136. % 目标函数绘图
  137. figure(1),plot(Obj_Fcn)
  138. title('目标函数值变化曲线','fontsize',8)
  139. % 2D 绘图
  140. if S==2
  141.     figure(2),plot(P(:,1),P(:,2),'rs'),hold on
  142.     for i=1:C
  143.         v=Data(find(res==i),:);
  144.         plot(v(:,1),v(:,2),str(rem(i,12)+1))      
  145.         ellipse(max(v(:,1))-min(v(:,1)), ...
  146.                 max(v(:,2))-min(v(:,2)), ...
  147.                 [max(v(:,1))+min(v(:,1)), ...
  148.                 max(v(:,2))+min(v(:,2))]/2,'r:')   
  149.     end
  150.     grid on,title('2D 聚类结果图','fontsize',8),hold off
  151. end
  152. % 3D 绘图
  153. if S>2
  154.     figure(2),plot3(P(:,1),P(:,2),P(:,3),'rs'),hold on
  155.     for i=1:C
  156.         v=Data(find(res==i),:);
  157.         plot3(v(:,1),v(:,2),v(:,3),str(rem(i,12)+1))      
  158.         ellipse(max(v(:,1))-min(v(:,1)), ...
  159.                 max(v(:,2))-min(v(:,2)), ...
  160.                 [max(v(:,1))+min(v(:,1)), ...
  161.                 max(v(:,2))+min(v(:,2))]/2, ...
  162.                 'r:',(max(v(:,3))+min(v(:,3)))/2)   
  163.     end
  164.     grid on,title('3D 聚类结果图','fontsize',8),hold off
  165. end
  166. m文件4/7:
  167. function D=fuzzydist(A,B)
  168. % 模糊聚类分析: 样本间的距离
  169. % D = fuzzydist(A,B)
  170. D=norm(A-B);
  171. m文件5/7:
  172. function mr=maxrowf(U,c)
  173. % 求矩阵 U 每列第 c 大元素所在行,c 的缺省值为 1
  174. % 调用格式: mr = maxrowf(U,c)
  175. % See also: addr
  176. if nargin<2
  177.     c=1;
  178. end
  179. N=size(U,2);mr(1,N)=0;
  180. for j=1:N
  181.     aj=addr(U(:,j),'descend');
  182.     mr(j)=aj(c);
  183. end
  184. m文件6/7:
  185. function ellipse(a,b,center,style,c_3d)
  186. % 绘制一个椭圆
  187. % 调用: ellipse(a,b,center,style,c_3d)
  188. % 输入:
  189. %     a: 椭圆的轴长(平行于 x 轴)
  190. %     b: 椭圆的轴长(平行于 y 轴)
  191. %     center: 椭圆的中心 [x0,y0],缺省值为 [0,0]
  192. %     style: 绘制的线型和颜色,缺省值为实线蓝色
  193. %     c_3d:   椭圆的中心在 3D 空间中的 z 轴坐标,可缺省
  194. if nargin<4
  195.     style='b';
  196. end
  197. if nargin<3 | isempty(center)
  198.     center=[0,0];
  199. end
  200. t=1:360;
  201. x=a/2*cosd(t)+center(1);
  202. y=b/2*sind(t)+center(2);
  203. if nargin>4
  204.     plot3(x,y,ones(1,360)*c_3d,style)
  205. else
  206.     plot(x,y,style)
  207. end
  208. m文件7/7:
  209. function f = addr(a,strsort)
  210. % 返回向量升序或降序排列后各分量在原始向量中的索引
  211. % 函数调用:f = addr(a,strsort)
  212. % strsort: 'ascend' or 'descend'
  213. %          default is 'ascend'
  214. % -------- example --------
  215. % addr([ 4 5 1 2 ]) returns ans:
  216. %       [ 3   4   1   2 ]
  217. if nargin==1
  218.     strsort='ascend';
  219. end
  220. sa=sort(a); ca=a;
  221. la=length(a);f(la)=0;
  222. for i=1:la
  223.     f(i)=find(ca==sa(i),1);
  224.     ca(f(i))=NaN;
  225. end
  226. if strcmp(strsort,'descend')
  227.     f=fliplr(f);
  228. end
复制代码
转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
第一次用linux登录madio,纪念一下
好学者 实名认证       

1

主题

6

听众

1092

积分

自我介绍
艰苦朴素,求真务实!!!

邮箱绑定达人 新人进步奖

群组Matlab讨论组

群组Linux推广

2#
发表于 2010-6-10 18:34 |只看该作者
回复

使用道具 举报

linmatsas 实名认证       

53

主题

13

听众

3591

积分

逍遥游

自我介绍
额。。。。世界上最讨厌的事情就是自我介绍。。。

邮箱绑定达人 新人进步奖 发帖功臣 最具活力勋章

群组Matlab讨论组

群组数学建模

群组小草的客厅

群组2012数学一考研交流

群组C 语言讨论组

3#
发表于 2010-6-13 22:56 |只看该作者
回复

使用道具 举报

hrf5436 实名认证       

7

主题

2

听众

431

积分

群组Matlab讨论组

群组Linux推广

群组Coldplayers

4#
发表于 2010-6-26 18:52 |只看该作者
回复

使用道具 举报

gao0206        

0

主题

0

听众

3

积分

群组Matlab讨论组

5#
发表于 2010-7-4 16:49 |只看该作者
回复

使用道具 举报

22

主题

6

听众

438

积分

新人进步奖

群组Matlab讨论组

群组数学趣味、游戏、IQ等

群组数学建模培训课堂1

群组西南大学建模组

群组华中科技大学

6#
发表于 2011-1-14 09:32 |只看该作者
回复

使用道具 举报

蜜雪儿        

0

主题

0

听众

1

积分

群组Matlab讨论组

7#
发表于 2011-3-18 17:59 |只看该作者
回复

使用道具 举报

827611734        

0

主题

0

听众

5

积分

群组Matlab讨论组

8#
发表于 2011-4-8 10:24 |只看该作者
我现在正在做这方面的毕设,但是为什么第一个程序运行不出来啊?请教一下啦!谢谢!
回复

使用道具 举报

mvmmvmmvm 实名认证       

2

主题

3

听众

342

积分

群组Matlab讨论组

群组东北三省联盟

群组计量经济学之性

9#
发表于 2011-5-1 19:06 |只看该作者
回复

使用道具 举报

东少将 实名认证       

5

主题

3

听众

522

积分

社区QQ达人

群组Matlab讨论组

群组EXCEL

10#
发表于 2012-3-9 19:46 |只看该作者
回复

使用道具 举报

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-7-27 20:15 , Processed in 0.570075 second(s), 75 queries .

回顶部