当前位置:   article > 正文

遗传算法——Kmeans聚类_聚类遗传算法

聚类遗传算法

1. K-means算法的核心思想

  • 将样本之间的距离作为分类标准,实现设定好聚类值k,再通过聚类中心的合理选择,使的同类别中的样本距离尽可能小。属于无监督学习。
  • 无监督学习:在进行分析前,不知道真实的结果,通过聚类将结果进行划分。
  • K-means原理演示网址

Blog - Naftali Harris: Statistician, Hacker and Climbericon-default.png?t=N7T8https://www.naftaliharris.com/blog/

2. 优化设计的关键

  • 聚类数的确定:将种群分为几类
  • 初始聚类点的确定(会影响最终的结果)
  • 聚类结果的可视化(多为数据可视化)
  • 聚类效果评价(评价标准)

3. 聚类实例

3.1 生成一个数据集

  1. % 设置随机数生成器的种子以便结果可复现
  2. rng(0);
  3. % 定义三个聚类中心
  4. means = [1 2 3 4; 5 6 7 8; 9 10 11 12];
  5. % 定义三个聚类的协方差矩阵,这里假设特征间相关性不大,使用对角矩阵
  6. covariances = repmat(eye(4), [1, 1, 3]) * 0.5; % 较小的协方差值意味着数据点更紧密
  7. % 定义每个聚类的样本数
  8. clusterSizes = [50, 50, 50];
  9. % 初始化数据矩阵
  10. data = [];
  11. % 使用循环为每个聚类生成数据
  12. for i=1:size(means, 1)
  13. % 为每个聚类生成随机数据
  14. clusterData = mvnrnd(means(i, :), covariances(:, :, i), clusterSizes(i));
  15. % 将生成的数据加入到数据矩阵中
  16. data = [data; clusterData];
  17. end

3.2 聚类值K的设定

3.2.1 手动设定聚类数(也可以用轻代码)

  1. % 使用指定的簇个数执行 K 均值聚类(K 值)
  2. K = 3;
  3. [clusterIndices,centroids] = kmeans(data,K);
  4. clear K
  5. % 显示结果
  6. % 显示二维散点图(PCA)
  7. figure
  8. [~,score] = pca(data);
  9. clusterMeans = grpstats(score,clusterIndices,"mean");
  10. h = gscatter(score(:,1),score(:,2),clusterIndices,colormap("lines"));
  11. for i2 = 1:numel(h)
  12. h(i2).DisplayName = strcat("Cluster",h(i2).DisplayName);
  13. end
  14. clear h i2 score
  15. hold on
  16. h = scatter(clusterMeans(:,1),clusterMeans(:,2),50,"kx","LineWidth",2);
  17. hold off
  18. h.DisplayName = "ClusterMeans";
  19. clear h clusterMeans
  20. legend;
  21. title("First 2 PCA Components of Clustered Data");
  22. xlabel("First principal component");
  23. ylabel("Second principal component");

 下图分别为k=3,2,4的结果

3.2.2 最佳

3.2.2.1 计算标准
  • Calinski-Harabasz准则(方差比准则VRC:用于确定最佳K值,对应具有较大的簇间方差(簇与簇之间较为分散)和较小的簇内方差(每一簇较为聚拢),最佳聚类数对应于有较好的Calinski-Harabasz指数值的解。(越大越好)
    1. % 使用指定范围选择最佳簇个数(K 值)
    2. fh = @(X,K)(kmeans(X,K));
    3. eva = evalclusters(data,fh,"CalinskiHarabasz","KList",2:5);
    4. clear fh
    5. K = eva.OptimalK;
    6. clusterIndices = eva.OptimalY;
    7. % 显示簇计算标准值
    8. figure
    9. bar(eva.InspectedK,eva.CriterionValues);
    10. xticks(eva.InspectedK);
    11. xlabel("Number of clusters");
    12. ylabel("Criterion values - Calinski-Harabasz");
    13. legend("Optimal number of clusters is " + num2str(K))
    14. title("Evaluation of Optimal Number of Clusters")
    15. disp("Optimal number of clusters is " + num2str(K));
    16. clear K eva
    17. % 计算质心
    18. centroids = grpstats(data,clusterIndices,"mean");
    19. % 显示结果
    20. % 显示二维散点图(PCA)
  • Davies-Bouldin准则:与VRC相反,最佳聚类数对应具有最小的Davies-Bouldin指数值(DBI)。
    1. % 使用指定范围选择最佳簇个数(K 值)
    2. fh = @(X,K)(kmeans(X,K));
    3. eva = evalclusters(data,fh,"DaviesBouldin","KList",2:5);
    4. clear fh
    5. K = eva.OptimalK;
    6. clusterIndices = eva.OptimalY;
    7. % 显示簇计算标准值
    8. % 计算质心
  • 轮廓准则(SilhouetteEvaluation):每个点的轮廓值是衡量与同一集群相似度的度量。如果大多数点的轮廓值都很高,则解决方案是合适的。如果许多点轮廓值较低或者为负,那么K可能过大或者过小。(越大越好)
  • 间距准则(GapEvaluation):间距标准对应于(ExceptedLogW-LogW),其中W是簇内离散度,ExceptedLogW是由蒙特卡洛抽样的标准分布,LogW是由样本书记计算得出。最佳聚类数对应于在容差范围内具有最大局部的间距值(gap value)。(越大越好)

4. 优化阶段 

优化目标

  1. function o = ob_GA_kmeans(x,data,K,n)
  2. m=reshape(x,[K,n]); %将x重组为K行n列的矩阵
  3. d=pdist2(data,m); % 到质心的欧式距离
  4. [dmin,~]=min(d,[],2);
  5. o=sum(dmin);
  6. end

优化

  1. %% 初始化
  2. clc;clear;
  3. load("data.mat");
  4. n=size(data,2); %变量数,特征值
  5. K=3; %给一个默认K值
  6. N=n*K; %计算自变量数,每个质心对应几行几列,
  7. % 行对应分类数,列对应变量数
  8. %% 优化
  9. % 将固定参数传递给 objfun
  10. objfun = @(x)ob_GA_kmeans(x,data,K,n);
  11. % 设置非默认求解器选项
  12. options = optimoptions("ga","PlotFcn","gaplotbestf");
  13. % 求解
  14. [solution,objectiveValue] = ga(objfun,N,[],[],[],[],[],[],[],[],options);
  15. % 清除变量
  16. clearvars objfun options
  17. %% 绘制
  18. m=reshape(solution,[K,n]); %将x重组为K行n列的矩阵
  19. d=pdist2(data,m); % 到质心的欧式距离
  20. [dmin,post]=min(d,[],2);
  21. % 显示二维散点图(PCA)
  22. figure
  23. [~,score] = pca(data);
  24. clusterMeans = grpstats(score,post,"mean");
  25. h = gscatter(score(:,1),score(:,2),post,colormap("lines"));
  26. for i2 = 1:numel(h)
  27. h(i2).DisplayName = strcat("Cluster",h(i2).DisplayName);
  28. end
  29. clear h i2 score
  30. hold on
  31. h = scatter(clusterMeans(:,1),clusterMeans(:,2),50,"kx","LineWidth",2);
  32. hold off
  33. h.DisplayName = "ClusterMeans";
  34. clear h clusterMeans
  35. legend;
  36. title("First 2 PCA Components of Clustered Data");
  37. xlabel("First principal component");
  38. ylabel("Second principal component");

结果

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

闽ICP备14008679号