当前位置:   article > 正文

MATLAB数学建模——k-means++及可视化_matlab 绘制kmeans迭代图

matlab 绘制kmeans迭代图
  1. % data set;随机初始化一个数据集
  2. clc;clear;
  3. % Sigma = [1, 0; 0, 1];
  4. % mu1 = [1, -1];
  5. % x1 = mvnrnd(mu1, Sigma, 1000);
  6. % mu2 = [5, -4];
  7. % x2 = mvnrnd(mu2, Sigma, 1000);
  8. % mu3 = [1, 4];
  9. % x3 = mvnrnd(mu3, Sigma, 1000);
  10. % mu4 = [6, 4];
  11. % x4 = mvnrnd(mu4, Sigma, 1000);
  12. % mu5 = [7, 0.0];
  13. % x5 = mvnrnd(mu5, Sigma, 1000);
  14. x1 = randn(1000,6);
  15. x2 = randn(1000,6)+1;
  16. x3 = randn(1000,6)+2;
  17. x4 = randn(1000,6)+3;
  18. x5 = randn(1000,6)+4;
  19. X = [x1;x2;x3;x4;x5];
  20. func_zbf(X,8);
  21. [idx,mu,d] = func_k_means_pro(X,5,1); % 使用自定义的K-means++函数
  1. function func_zbf(X,max_k)
  2. %%% ZBF:肘部法,作出不同K值聚类偏差图
  3. % X:数据矩阵
  4. % max_k:最大聚类数
  5. dk = zeros(max_k,2); % 初始化聚类数及对应的偏差矩阵
  6. for i = 1 : max_k % 最小聚类数设置为1
  7. [L,~,D] = func_k_means_pro(X,i,0);
  8. % [L,~,~,D] =kmeans(zscore(X),i);
  9. for j = 1 : i
  10. d = D(:,j);
  11. tD1 = L < j;
  12. tD2 = L > j;
  13. tD = tD1 + tD2;
  14. tD = all(tD,2);
  15. d(tD,:) = [];
  16. dk(i,2) = dk(i,2) + sum(d.^2);
  17. end
  18. dk(i,1) = i;
  19. end
  20. figure
  21. plot(dk(2:end,1),dk(2:end,2),'-','LineWidth',1.2,'Color','b')
  22. hold on
  23. grid off
  24. plot(dk(2:end,1),dk(2:end,2),'or','markerfacecolor', 'c',"LineWidth",1.1);
  25. % title('不同K值聚类偏差图')
  26. set(gca, 'linewidth', 1.1, 'fontsize', 14, 'fontname', '宋体')
  27. xlabel('分类数(K值)')
  28. ylabel('簇内误差平方和')
  1. function [indexs, mu, D] = func_k_means_pro(X,k,trigger)
  2. %%% K_MEANS_PRO: k-means++聚类
  3. % X: 数据集,每一行为一条数据
  4. % k: 聚类数
  5. % mu: 最终的聚类中心
  6. % D: 数据点与各聚类中心的距离
  7. % indexs: 数据所对应的类别
  8. % trigger: 选择是否可视化
  9. %% 数据标准化(可选)
  10. X = zscore(X);
  11. % X = (mapminmax(X',0,1))';
  12. %% 获取数据总数
  13. [n,length] = size(X);
  14. %% 随机选择一个数据点作为第一个聚类中心
  15. init_mu = X(randperm(size(X, 1), 1), :);
  16. % 选择剩余的聚类中心
  17. for i = 2 : k
  18. % 计算各数据点与已有聚类中心的平方欧式距离
  19. Dis = pdist2(X, init_mu, 'squaredeuclidean');
  20. Dis = min(Dis, [], 2); % 找出各数据点与最近聚类中心的平方欧式距离
  21. Dis = Dis / sum(Dis); % 计算各数据点被选为下一个聚类中心的概率
  22. %{
  23. 如果累积概率大于随机数,则选取该点为新的聚类中心,确保初始聚类中心间的
  24. 距离足够大
  25. %}
  26. % init_mu(i, :) = X(find(rand < cumsum(Dis), 1), :);
  27. init_mu(i, :) = X(find(Dis == max(Dis), 1), :);
  28. end
  29. %% 计算迭代,更新聚类中心
  30. indexs = zeros(n, 1);
  31. mu = init_mu;
  32. new_mu = mu;
  33. eps = 1e-6; % 设置精度
  34. delta = 1;
  35. while (delta > eps) % 若聚类中心不再变化则终止迭代
  36. mu = new_mu;
  37. for i =1:n
  38. y = repmat(X(i, :), k, 1);
  39. dist = y - mu;
  40. d = sum(dist.*dist,2); % 计算欧式距离
  41. j = find(d==min(d)); % 寻找最小距离对应的聚类中心
  42. indexs(i) = j;
  43. end
  44. for j = 1 : k
  45. order = indexs == j;
  46. new_mu(j, :) = mean(X(order, :), 1); % 以均值作为新的聚类中心
  47. end
  48. % 计算新旧聚类中心的偏移距离
  49. delta = sqrt(sum(sum((mu-new_mu).*(mu-new_mu))));
  50. end
  51. %% 根据最终聚类中心确定样本聚类
  52. indexs = zeros(n, 1);
  53. for i = 1 : n
  54. R = repmat(X(i,:),k,1) - mu;
  55. Res = sum(R.*R,2);
  56. j = find(Res == min(Res));
  57. indexs(i) = j;
  58. end
  59. %% 计算数据点与各个聚类中心的距离
  60. D = zeros(n,k);
  61. for i = 1 : n
  62. for j = 1 : k
  63. d = X(i,:)-mu(j,:);
  64. D (i,j) = sqrt(sum(d.^2,2));
  65. end
  66. end
  67. %% 将数据投影到二维平面,画出聚类结果图
  68. if trigger == 1
  69. new_mu = mu;
  70. new_X = X;
  71. if length > 2 % 若为高维数据,则通过主成分分析投影到二维平面
  72. [~, score, ~, ~, ~, ~]=pca(X);
  73. new_X=score(:,1:2); % 取转换后的矩阵score的前k列为PCA降维后特征
  74. new_mu = new_mu * (new_X\X)';
  75. end
  76. colours = ['r','g','b','m','k','y','c','w'];
  77. figure
  78. hold on
  79. grid off
  80. set(gca, 'linewidth', 1.1, 'fontsize', 14, 'fontname', '宋体')
  81. for i = 1 : k
  82. for j = 1 : n
  83. if indexs(j) == i
  84. plot(new_X(j,1),new_X(j,2),'.','Color',colours(i),'LineWidth',1)
  85. end
  86. end
  87. plot(new_mu(i,1),new_mu(i,2),'o','Color','#A500EB','markerfacecolor', colours(i),'LineWidth',2)
  88. end
  89. if length > 2
  90. xlabel("投影指标1")
  91. ylabel("投影指标2")
  92. else
  93. xlabel("指标1")
  94. ylabel("指标2")
  95. end
  96. end
  97. end

结果如下图所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/535517
推荐阅读
相关标签
  

闽ICP备14008679号