经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
ISODATA聚类算法的matlab程序
来源:cnblogs  作者:凯鲁嘎吉  时间:2019/10/11 9:17:52  对本文有异议

ISODATA聚类算法的matlab程序

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

参考:Kmeans及ISODATA算法的matlab实现

算法简介:聚类算法:ISODATA算法

数据见:MATLAB实例:PCA降维中的iris数据集,保存为:iris.data,最后一列是类标签。

demo_isodata.m

  1. clear
  2. clc
  3. data_load=dlmread('iris.data');
  4. [~,dim]=size(data_load);
  5. x=data_load(:,1:dim-1);
  6. K=3;
  7. theta_N=1;
  8. theta_S=1;
  9. theta_c=4;
  10. L=1;
  11. I=5;
  12. ISODATA(x,K,theta_N,theta_S,theta_c,L,I)

ISODATA.m

  1. function ISODATA(x,K,theta_N,theta_S,theta_c,L,I)
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%input parameters%%%%%%
  4. % x : data
  5. % K : 预期的聚类中心数
  6. % theta_N : 每一聚类中心中最少的样本数,少于此数就不作为一个独立的聚类
  7. % theta_S :一个聚类中样本距离分布的标准差
  8. % theta_c : 两聚类中心之间的最小距离,如小于此数,两个聚类进行合并
  9. % L : 在一次迭代运算中可以和并的聚类中心的最多对数
  10. % I :迭代运算的次数序号
  11. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  12. %% step1
  13. n = size(x,1);
  14. N_c = K;
  15. mean = cell(K,1);
  16. for i=1:K
  17. mean{i} = x(i,:);
  18. end
  19. ite = 1;
  20. while ite<I
  21. flag = 1;
  22. while flag
  23. %% step2
  24. class = cell(size(mean));
  25. for i=1:n
  26. num = Belong2(x(i,:),mean);
  27. class{num} = [class{num};x(i,:)];
  28. end
  29. %% step3
  30. for i=1:N_c
  31. size_i = size(class{i},1);
  32. if size_i<theta_N
  33. class_i = class{i};
  34. mean = DeleteRow(mean,i);
  35. class = DeleteRow(class,i);
  36. N_c = N_c-1;
  37. for j=1:size_i
  38. class_ij = class_i(j,:);%the j'th row of class{i}
  39. num = Belong2(class_ij,mean);
  40. class{num} = [class{num};class_ij];
  41. end
  42. end
  43. end
  44.  
  45. %% step4
  46. for i=1:N_c
  47. if ~isempty(mean{i})
  48. mean{i} = sum(class{i})./size(class{i},1);
  49. end
  50. end
  51. %% step5
  52. Dis = zeros(N_c,1);
  53. for i=1:N_c
  54. if ~isempty(class{i})
  55. N_i =size(class{i},1);
  56. tmp = bsxfun(@minus,class{i},mean{i});
  57. Dis(i) = sum(arrayfun(@(x)norm(tmp(x,:)),1:N_i))/N_i;
  58. end
  59. end
  60. %% step6
  61. D = 0;
  62. for i=1:N_c
  63. if ~isempty(class{i})
  64. N_i =size(class{i},1);
  65. D = D + N_i*Dis(i);
  66. end
  67. end
  68. D = D/n;
  69. %% step7
  70. flag = 0;
  71. if ite == I
  72. theta_c = 0;
  73. flag = 0;
  74. elseif ~(N_c > K/2)
  75. flag = 1;
  76. elseif mod(ite,2)==0 || ~(N_c<2*K)
  77. flag = 0;
  78. end
  79. %% 分裂处理
  80. %% step8
  81. if flag
  82. flag = 0;
  83. delta = cell(N_c,1);
  84. for i=1:N_c
  85. if ~isempty(class{i})
  86. N_i =size(class{i},1);
  87. tmp = bsxfun(@minus,class{i},mean{i});
  88. delta{i} = arrayfun(@(x)norm(tmp(:,x)),1:size(tmp,2))/N_i;
  89. end
  90. end
  91.  
  92. %% step9
  93. delta_max = cell(N_c,1);
  94. for i=1:N_c
  95. if ~isempty(class{i})
  96. max_i = max(delta{i});
  97. sub = find(delta{i}==max_i,1);
  98. delta_max{i} = [max_i,sub];
  99. end
  100. end
  101. %% step10
  102. for i=1:N_c
  103. if delta_max{i}(1) > theta_S
  104. N_i =size(class{i},1);
  105. con1 = (Dis(i)>D && N_i>2*(theta_N + 1));
  106. con2 = ~(N_c>K/2);
  107. if con1 || con2
  108. %%%%这里分裂%%%%%
  109. flag = 1;%一旦发生分裂,那么分裂一次后就返回第二步;若没发生分裂,则直接进入合并处理步
  110. lamda = 0.5;
  111. max_sub = delta_max{i}(2);
  112. mean{i}(max_sub) = mean{i}(max_sub) + lamda * delta_max{i}(1);
  113. addOneMean = mean{i};
  114. addOneMean(max_sub) = addOneMean(max_sub) - lamda * delta_max{i}(1);
  115. mean = [mean;addOneMean];
  116. N_c = N_c+1;
  117. break;
  118. end
  119. end
  120. end
  121.  
  122. end
  123.  
  124. end
  125. %% 合并处理
  126. if L
  127. %% step11
  128. Distance = zeros(N_c,N_c);
  129. for i=1:N_c-1
  130. for j=i:N_c
  131. Distance(i,j) = norm(mean{i}-mean{j});
  132. end
  133. end
  134. %% step12
  135. index = find(-Distance>theta_c);
  136. keepIndex = [Distance(index),index];
  137. [~, index] = sort(keepIndex(:,1));
  138. if size(index,1) > L
  139. index = index(1:L,:);
  140. end
  141. %% step13
  142. if size(index,1) ~= 0
  143. for id=1:size(index,1)
  144. [m_i m_j]= seq2idx(index(id),N_c);
  145. %%%%%这里合并%%%%%
  146. N_mi = size(class{m_i},1);
  147. N_mj = size(class{m_j},1);
  148. mean{m_i} = (N_mi*mean{m_i} + N_mj*mean{m_j})/(N_mi+N_mj);
  149. mean = DeleteRow(mean,m_j);
  150. class{m_i} = [class{m_i};class{m_j}];
  151. class = DeleteRow(class,m_j);
  152. end
  153. end
  154. end
  155. %% step14
  156. ite=ite+1;
  157. end
  158. for i=1:N_c
  159. fprintf('第%d类聚类中心为\n',i);
  160. disp(mean{i});
  161. fprintf('第%d类中元素为\n',i);
  162. disp(class{i});
  163. end
  164. end
  165.  
  166.  
  167. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  168. function number = Belong2(x_i,means)
  169. INF = 10000;
  170. min = INF;
  171. kk = size(means,1);
  172. number = 1;
  173. for i=1:kk
  174. if ~isempty(means{i})
  175. if norm(x_i - means{i}) < min
  176. min = norm(x_i - means{i});
  177. number = i;
  178. end
  179. end
  180. end
  181. end
  182.  
  183. function A_del = DeleteRow(A,r)
  184. n = size(A,1);
  185. if r == 1
  186. A_del = A(2:n,:);
  187. elseif r == n
  188. A_del = A(1:n-1,:);
  189. else
  190. A_del = [A(1:r-1,:);A(r+1:n,:)];
  191. end
  192. end
  193.  
  194.  
  195. function [row col] = seq2idx(id,n)
  196. if mod(id,n)==0
  197. row = n;
  198. col = id/n;
  199. else
  200. row = mod(id,n);
  201. col = ceil(id/n);
  202. end
  203. end

结果

  1. >> demo_isodata
  1. 1类聚类中心为
  2. 6.6016 2.9857 5.3841 1.9159
  3.  
  4. 1类中元素为
  5. 7.0000 3.2000 4.7000 1.4000
  6. 6.4000 3.2000 4.5000 1.5000
  7. 6.9000 3.1000 4.9000 1.5000
  8. 6.5000 2.8000 4.6000 1.5000
  9. 6.3000 3.3000 4.7000 1.6000
  10. 6.6000 2.9000 4.6000 1.3000
  11. 6.7000 3.1000 4.4000 1.4000
  12. 5.9000 3.2000 4.8000 1.8000
  13. 6.3000 2.5000 4.9000 1.5000
  14. 6.6000 3.0000 4.4000 1.4000
  15. 6.8000 2.8000 4.8000 1.4000
  16. 6.7000 3.0000 5.0000 1.7000
  17. 6.0000 2.7000 5.1000 1.6000
  18. 6.7000 3.1000 4.7000 1.5000
  19. 6.3000 3.3000 6.0000 2.5000
  20. 5.8000 2.7000 5.1000 1.9000
  21. 7.1000 3.0000 5.9000 2.1000
  22. 6.3000 2.9000 5.6000 1.8000
  23. 6.5000 3.0000 5.8000 2.2000
  24. 7.6000 3.0000 6.6000 2.1000
  25. 7.3000 2.9000 6.3000 1.8000
  26. 6.7000 2.5000 5.8000 1.8000
  27. 7.2000 3.6000 6.1000 2.5000
  28. 6.5000 3.2000 5.1000 2.0000
  29. 6.4000 2.7000 5.3000 1.9000
  30. 6.8000 3.0000 5.5000 2.1000
  31. 5.7000 2.5000 5.0000 2.0000
  32. 5.8000 2.8000 5.1000 2.4000
  33. 6.4000 3.2000 5.3000 2.3000
  34. 6.5000 3.0000 5.5000 1.8000
  35. 7.7000 3.8000 6.7000 2.2000
  36. 7.7000 2.6000 6.9000 2.3000
  37. 6.0000 2.2000 5.0000 1.5000
  38. 6.9000 3.2000 5.7000 2.3000
  39. 5.6000 2.8000 4.9000 2.0000
  40. 7.7000 2.8000 6.7000 2.0000
  41. 6.3000 2.7000 4.9000 1.8000
  42. 6.7000 3.3000 5.7000 2.1000
  43. 7.2000 3.2000 6.0000 1.8000
  44. 6.2000 2.8000 4.8000 1.8000
  45. 6.1000 3.0000 4.9000 1.8000
  46. 6.4000 2.8000 5.6000 2.1000
  47. 7.2000 3.0000 5.8000 1.6000
  48. 7.4000 2.8000 6.1000 1.9000
  49. 7.9000 3.8000 6.4000 2.0000
  50. 6.4000 2.8000 5.6000 2.2000
  51. 6.3000 2.8000 5.1000 1.5000
  52. 6.1000 2.6000 5.6000 1.4000
  53. 7.7000 3.0000 6.1000 2.3000
  54. 6.3000 3.4000 5.6000 2.4000
  55. 6.4000 3.1000 5.5000 1.8000
  56. 6.0000 3.0000 4.8000 1.8000
  57. 6.9000 3.1000 5.4000 2.1000
  58. 6.7000 3.1000 5.6000 2.4000
  59. 6.9000 3.1000 5.1000 2.3000
  60. 5.8000 2.7000 5.1000 1.9000
  61. 6.8000 3.2000 5.9000 2.3000
  62. 6.7000 3.3000 5.7000 2.5000
  63. 6.7000 3.0000 5.2000 2.3000
  64. 6.3000 2.5000 5.0000 1.9000
  65. 6.5000 3.0000 5.2000 2.0000
  66. 6.2000 3.4000 5.4000 2.3000
  67. 5.9000 3.0000 5.1000 1.8000
  68.  
  69. 2类聚类中心为
  70. 5.6838 2.6784 4.0919 1.2676
  71.  
  72. 2类中元素为
  73. 5.5000 2.3000 4.0000 1.3000
  74. 5.7000 2.8000 4.5000 1.3000
  75. 4.9000 2.4000 3.3000 1.0000
  76. 5.2000 2.7000 3.9000 1.4000
  77. 5.0000 2.0000 3.5000 1.0000
  78. 5.9000 3.0000 4.2000 1.5000
  79. 6.0000 2.2000 4.0000 1.0000
  80. 6.1000 2.9000 4.7000 1.4000
  81. 5.6000 2.9000 3.6000 1.3000
  82. 5.6000 3.0000 4.5000 1.5000
  83. 5.8000 2.7000 4.1000 1.0000
  84. 6.2000 2.2000 4.5000 1.5000
  85. 5.6000 2.5000 3.9000 1.1000
  86. 6.1000 2.8000 4.0000 1.3000
  87. 6.1000 2.8000 4.7000 1.2000
  88. 6.4000 2.9000 4.3000 1.3000
  89. 6.0000 2.9000 4.5000 1.5000
  90. 5.7000 2.6000 3.5000 1.0000
  91. 5.5000 2.4000 3.8000 1.1000
  92. 5.5000 2.4000 3.7000 1.0000
  93. 5.8000 2.7000 3.9000 1.2000
  94. 5.4000 3.0000 4.5000 1.5000
  95. 6.0000 3.4000 4.5000 1.6000
  96. 6.3000 2.3000 4.4000 1.3000
  97. 5.6000 3.0000 4.1000 1.3000
  98. 5.5000 2.5000 4.0000 1.3000
  99. 5.5000 2.6000 4.4000 1.2000
  100. 6.1000 3.0000 4.6000 1.4000
  101. 5.8000 2.6000 4.0000 1.2000
  102. 5.0000 2.3000 3.3000 1.0000
  103. 5.6000 2.7000 4.2000 1.3000
  104. 5.7000 3.0000 4.2000 1.2000
  105. 5.7000 2.9000 4.2000 1.3000
  106. 6.2000 2.9000 4.3000 1.3000
  107. 5.1000 2.5000 3.0000 1.1000
  108. 5.7000 2.8000 4.1000 1.3000
  109. 4.9000 2.5000 4.5000 1.7000
  110.  
  111. 3类聚类中心为
  112. 5.0060 3.4180 1.4640 0.2440
  113.  
  114. 3类中元素为
  115. 5.1000 3.5000 1.4000 0.2000
  116. 4.9000 3.0000 1.4000 0.2000
  117. 4.7000 3.2000 1.3000 0.2000
  118. 4.6000 3.1000 1.5000 0.2000
  119. 5.0000 3.6000 1.4000 0.2000
  120. 5.4000 3.9000 1.7000 0.4000
  121. 4.6000 3.4000 1.4000 0.3000
  122. 5.0000 3.4000 1.5000 0.2000
  123. 4.4000 2.9000 1.4000 0.2000
  124. 4.9000 3.1000 1.5000 0.1000
  125. 5.4000 3.7000 1.5000 0.2000
  126. 4.8000 3.4000 1.6000 0.2000
  127. 4.8000 3.0000 1.4000 0.1000
  128. 4.3000 3.0000 1.1000 0.1000
  129. 5.8000 4.0000 1.2000 0.2000
  130. 5.7000 4.4000 1.5000 0.4000
  131. 5.4000 3.9000 1.3000 0.4000
  132. 5.1000 3.5000 1.4000 0.3000
  133. 5.7000 3.8000 1.7000 0.3000
  134. 5.1000 3.8000 1.5000 0.3000
  135. 5.4000 3.4000 1.7000 0.2000
  136. 5.1000 3.7000 1.5000 0.4000
  137. 4.6000 3.6000 1.0000 0.2000
  138. 5.1000 3.3000 1.7000 0.5000
  139. 4.8000 3.4000 1.9000 0.2000
  140. 5.0000 3.0000 1.6000 0.2000
  141. 5.0000 3.4000 1.6000 0.4000
  142. 5.2000 3.5000 1.5000 0.2000
  143. 5.2000 3.4000 1.4000 0.2000
  144. 4.7000 3.2000 1.6000 0.2000
  145. 4.8000 3.1000 1.6000 0.2000
  146. 5.4000 3.4000 1.5000 0.4000
  147. 5.2000 4.1000 1.5000 0.1000
  148. 5.5000 4.2000 1.4000 0.2000
  149. 4.9000 3.1000 1.5000 0.1000
  150. 5.0000 3.2000 1.2000 0.2000
  151. 5.5000 3.5000 1.3000 0.2000
  152. 4.9000 3.1000 1.5000 0.1000
  153. 4.4000 3.0000 1.3000 0.2000
  154. 5.1000 3.4000 1.5000 0.2000
  155. 5.0000 3.5000 1.3000 0.3000
  156. 4.5000 2.3000 1.3000 0.3000
  157. 4.4000 3.2000 1.3000 0.2000
  158. 5.0000 3.5000 1.6000 0.6000
  159. 5.1000 3.8000 1.9000 0.4000
  160. 4.8000 3.0000 1.4000 0.3000
  161. 5.1000 3.8000 1.6000 0.2000
  162. 4.6000 3.2000 1.4000 0.2000
  163. 5.3000 3.7000 1.5000 0.2000
  164. 5.0000 3.3000 1.4000 0.2000

2019-10-10 16:10:14

原文链接:http://www.cnblogs.com/kailugaji/p/11648715.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号