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:[email protected] 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章