FCM算发在MATLAB中的相关解释

原文
http://www.matlabsky.com/thread-9389-1-1.html


【近期想要实现模糊核聚类算法(KFCM),所以就将FCM的一些东西一并整理了一下】

首先,我们看以下fcm函数语法使用

【功能描述】 
Fuzzy c-means clustering

模糊C均值聚类算法,可将输入的数据集data聚为指定的cluster_n类

【函数描述】 
语法格式 
[center, U, obj_fcn] = FCM(data, cluster_n, options)

用法: 
1. [center,U,obj_fcn] = FCM(Data,N_cluster,options); 
2. [center,U,obj_fcn] = FCM(Data,N_cluster);

输入变量 
data ---- n*m矩阵,表示n个样本,每个样本具有m维特征值 
cluster_n ---- 标量,表示聚合中心数目,即类别数 
options ---- 4*1列向量,其中 
options(1): 隶属度矩阵U的指数,>1(缺省值: 2.0) 
options(2): 最大迭代次数(缺省值: 100) 
options(3): 隶属度最小变化量,迭代终止条件(缺省值: 1e-5) 
options(4): 每次迭代是否输出信息标志(缺省值: 0) 

输出变量 
center ---- 聚类中心 
U ---- 隶属度矩阵 
obj_fcn ---- 目标函数值 

【函数实例】
  1. data = rand(100,2); 
  2. options = [2;100;1e-5;1]; 
  3. [center,U,obj_fcn] = FCM(data,2,options); 
  4. figure; 
  5. plot(data(:,1), data(:,2),'o'); 
  6. title('DemoTest of FCM Cluster'); 
  7. xlabel('1st Dimension'); 
  8. ylabel('2nd Dimension'); 
  9. grid on; 
  10. hold on; 
  11. maxU = max(U); 
  12. index1 = find(U(1,:) == maxU); 
  13. index2 = find(U(2,:) == maxU); 
  14. line(data(index1,1),data(index1,2),'marker','*','color','g'); 
  15. line(data(index2,1),data(index2,2),'marker','*','color','r'); 
  16. plot([center([1 2],1)],[center([1 2],2)],'*','color','k') 
  17. hold off;
复制代码
fcmtest.jpg 
补充:
data = rand(100,2); 
options = [2;100;1e-5;1]; 
<span style="color:#ff0000;">[center,U,obj_fcn] = FCM(data,3,options); </span>
figure; 
plot(data(:,1), data(:,2),'o'); 
title('DemoTest of FCM Cluster'); 
xlabel('1st Dimension'); 
ylabel('2nd Dimension'); 
grid on; 
hold on; 
maxU = max(U); 
index1 = find(U(1,:) == maxU); 
index2 = find(U(2,:) == maxU); 
<span style="color:#ff0000;">index3 = find(U(3,:) == maxU);</span>
line(data(index1,1),data(index1,2),'marker','*','color','g'); 
line(data(index2,1),data(index2,2),'marker','*','color','r'); 
<span style="color:#ff0000;">line(data(index3,1),data(index3,2),'marker','*','color','y');</span>
<span style="color:#ff0000;">plot([center(:,1)],[center(:,2)],'*','color','k') </span>
hold off;



接着,我们来详细研究一下fcm的实现代码
  1. function [center, U, obj_fcn] = FCM(data, cluster_n, options)
  2. % 采用FCM(模糊C均值)算法将数据集data聚为cluster_n类
  3. MATLAB自带的FCM算法整合整理+注释详解整理
  4. % by faruto @ faruto's Studio http://blog.sina.com.cn/faruto
  5. % Email:patrick.lee@foxmail.com QQ:516667408
  6. % http://www.matlabsky.com http://www.mfun.la
  7. % last modified 2010.08.21
  8. % 用法:
  9. % 1. [center,U,obj_fcn] = FCM(Data,N_cluster,options);
  10. % 2. [center,U,obj_fcn] = FCM(Data,N_cluster);
  11. %
  12. % 输入:
  13. % data ---- n*m矩阵,表示n个样本,每个样本具有m维特征值
  14. % cluster_n ---- 标量,表示聚合中心数目,即类别数
  15. % options ---- 4*1列向量,其中
  16. % options(1): 隶属度矩阵U的指数,>1(缺省值: 2.0)
  17. % options(2): 最大迭代次数(缺省值: 100)
  18. % options(3): 隶属度最小变化量,迭代终止条件(缺省值: 1e-5)
  19. % options(4): 每次迭代是否输出信息标志(缺省值: 0)
  20. % 输出:
  21. % center ---- 聚类中心
  22. % U ---- 隶属度矩阵
  23. % obj_fcn ---- 目标函数值
  24. % Example:
  25. % data = rand(100,2);
  26. % options = [2;100;1e-5;1];
  27. % [center,U,obj_fcn] = FCM(data,2,options);
  28. % figure;
  29. % plot(data(:,1), data(:,2),'o');
  30. % title('DemoTest of FCM Cluster');
  31. % xlabel('1st Dimension');
  32. % ylabel('2nd Dimension');
  33. % grid on;
  34. % hold on;
  35. % maxU = max(U);
  36. % index1 = find(U(1,:) == maxU);
  37. % index2 = find(U(2,:) == maxU);
  38. % line(data(index1,1),data(index1,2),'marker','*','color','g');
  39. % line(data(index2,1),data(index2,2),'marker','*','color','r');
  40. % plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
  41. % hold off;
  42. %% 初始化initialization

  43. % 输入参数数量检测
  44. if nargin ~= 2 && nargin ~= 3 %判断输入参数个数只能是2个或3个
  45. error('Too many or too few input arguments!');
  46. end

  47. data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数
  48. data_m = size(data, 2); % 求出data的第二维(columns)数,即特征属性个数
  49. % 设置默认操作参数
  50. default_options = ...
  51. [2; % 隶属度矩阵U的指数
  52. 100; % 最大迭代次数
  53. 1e-5; % 隶属度最小变化量,迭代终止条件
  54. 0]; % 每次迭代是否输出信息标志
  55. if nargin == 2
  56. % 如果输入参数个数是二那么就调用默认的option
  57. options = default_options;
  58. else
  59. % 如果用户给的opition数少于4个那么其他用默认值
  60. if length(options) < 4
  61. tmp = default_options;
  62. tmp(1:length(options)) = options;
  63. options = tmp;
  64. end
  65. % 检测options中是否有nan值
  66. nan_index = find(isnan(options)==1);
  67. % 将denfault_options中对应位置的参数赋值给options中不是数的位置.
  68. options(nan_index) = default_options(nan_index);
  69. % 如果模糊矩阵的指数小于等于1,给出报错
  70. if options(1) <= 1,
  71. error('The exponent should be greater than 1!');
  72. end
  73. end
  74. % 将options中的分量分别赋值给四个变量
  75. expo = options(1); % 隶属度矩阵U的指数
  76. max_iter = options(2); % 最大迭代次数
  77. min_impro = options(3); % 隶属度最小变化量,迭代终止条件
  78. display = options(4); % 每次迭代是否输出信息标志

  79. obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcn
  80. U = initfcm(cluster_n, data_n); % 初始化模糊分配矩阵,使U满足列上相加为1
  81. %% Main loop 主要循环
  82. for i = 1:max_iter
  83. % 在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
  84. [U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
  85. if display,
  86. fprintf('FCM:Iteration count = %d, obj.fcn = %f\n', i, obj_fcn(i));
  87. end
  88. % 终止条件判别
  89. if i > 1 && abs(obj_fcn(i) - obj_fcn(i-1)) <= min_impro
  90. break;
  91. end
  92. end
  93. iter_n = i; % 实际迭代次数
  94. obj_fcn(iter_n+1:max_iter) = [];

  95. %% initfcm子函数
  96. function U = initfcm(cluster_n, data_n)
  97. % 初始化fcm的隶属度函数矩阵
  98. % 输入:
  99. % cluster_n ---- 聚类中心个数
  100. % data_n ---- 样本点数
  101. % 输出:
  102. % U ---- 初始化的隶属度矩阵
  103. U = rand(cluster_n, data_n);
  104. col_sum = sum(U);
  105. U = U./col_sum(ones(cluster_n, 1), :);
  106. %% stepfcm子函数
  107. function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
  108. % 模糊C均值聚类时迭代的一步
  109. % 输入:
  110. % data ---- n*m矩阵,表示n个样本,每个样本具有m维特征值
  111. % U ---- 隶属度矩阵
  112. % cluster_n ---- 标量,表示聚合中心数目,即类别数
  113. % expo ---- 隶属度矩阵U的指数
  114. % 输出:
  115. % U_new ---- 迭代计算出的新的隶属度矩阵
  116. % center ---- 迭代计算出的新的聚类中心
  117. % obj_fcn ---- 目标函数值
  118. mf = U.^expo; % 隶属度矩阵进行指数运算结果
  119. center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心
  120. dist = distfcm(center, data); % 计算距离矩阵
  121. obj_fcn = sum(sum((dist.^2).*mf)); % 计算目标函数值
  122. tmp = dist.^(-2/(expo-1));
  123. U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 计算新的隶属度矩阵
  124. %% distfcm子函数
  125. function out = distfcm(center, data)
  126. % 计算样本点距离聚类中心的距离
  127. % 输入:
  128. % center ---- 聚类中心
  129. % data ---- 样本点
  130. % 输出:
  131. % out ---- 距离
  132. out = zeros(size(center, 1), size(data, 1));
  133. for k = 1:size(center, 1) % 对每一个聚类中心
  134. % 每一次循环求得所有样本点到一个聚类中心的距离
  135. out(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
  136. end
复制代码

=============

==外一篇KFCM与FCM的测试比较==
从比较中可以看出KFCM的迭代步骤更少而且可以得出同样模式的聚类,能更有效的进行聚类,即将核函数的思想引入FCM可以提高聚类效率(也可以提高聚类的效果尤其是对噪声的抵御能力,但这个在下面的仿真测试中还没有体现)

测试1:
  1. =========聚类数目:2=============
  2. =========样本数目:1000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.104910 seconds.
  5. iterFcm =
  6.     81
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.     72
  11. Elapsed time is 0.085688 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码
t1.jpg 

测试2:
  1. =========聚类数目:2=============
  2. =========样本数目:2000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.394891 seconds.
  5. iterFcm =
  6.    304
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.    146
  11. Elapsed time is 0.307502 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码
t2.jpg 

测试3:
  1. =========聚类数目:3=============
  2. =========样本数目:2000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.614612 seconds.
  5. iterFcm =
  6.    347
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.     20
  11. Elapsed time is 0.081001 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码
t3.jpg 

测试4:
  1. =========聚类数目:3=============
  2. =========样本数目:1000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.135941 seconds.
  5. iterFcm =
  6.     61
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.     51
  11. Elapsed time is 0.096983 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码
t4.jpg 

测试5:
  1. =========聚类数目:4=============
  2. =========样本数目:1000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.124145 seconds.
  5. iterFcm =
  6.     37
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.     29
  11. Elapsed time is 0.080621 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码
t5.jpg 

测试6:
  1. =========聚类数目:4=============
  2. =========样本数目:2000=============
  3. =====DemoTest of FCM Cluster Start=======
  4. Elapsed time is 0.168298 seconds.
  5. iterFcm =
  6.     39
  7. =====DemoTest of FCM Cluster Done=======
  8. =====DemoTest of KFCM Cluster Start=======
  9. iterKFcm =
  10.     31
  11. Elapsed time is 0.135263 seconds.
  12. =====DemoTest of KFCM Cluster Done=======
复制代码

t6.jpg (75.37 KB, 下载次数: 87)

t6.jpg

  • 25
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值