• 备战数学建模44-聚类模型(攻坚站8)


    “物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。聚类和上一讲分类的区别:分类是已知类别的,聚类未知。常用的聚类有基于距离的:包括K-means和系统聚类等,基于密度的DASCAN算法等。

    目录

    一、Keans和K-means++算法

    1.1、K-means算法

    1.2、K-means++算法

     二、系统(层次)聚类

    2.1、系统聚类基本原理

    2.2、系统聚类SPSS实现

     三、DBSCAN算法

    3.1、DBSCAN算法基本原理

     3.2、DBSCAN算法MATLAB实现


    一、Keans和K-means++算法

    1.1、K-means算法

    我们可以看一下K-means聚类的基本步骤:一、指定需要划分的簇[cù]的个数K值(类的个数);
    二、随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点); 三、计算其余的各个数据对象到这K个初始聚类中心的距离,把数据对象划归到距离它最近的那个中心所
    处在的簇类中;四、调整新类并且重新计算出新类的中心;五、循环步骤三和四,看中心是否收敛(不变),如果收敛或达到迭代次数则停止循环;六、结束。

    K-means算法由如下优缺点,对于缺点2和缺点3,一般常采用K-means++算法进行改进。

    优点:
    (1)算法简单、快速。
    (2)对处理大数据集,该算法是相对高效率的。
    缺点:
    (1)要求用户必须事先给出要生成的簇的数目K。
    (2)对初值敏感。
    (3)对于孤立点数据敏感。 

    1.2、K-means++算法

    k-means++算法选择初始聚类中心的基本原则是:初始的聚类中心之间的相互距离要尽可能的远
    算法描述如下:只对K-means算法“初始化K个聚类中心” 这一步进行了优化)
    步骤一:随机选取一个样本作为第一个聚类中心;
    步骤二:计算每个样本与当前已有聚类中心的最短距离(即与最近一个聚类中心的距离),这个值越大,表示被选取作为聚类中心的概率较大;最后,用轮盘法(依据概率大小来进行抽选)选出下一个聚类中心;
    步骤三:重复步骤二,直到选出K个聚类中心。选出初始点后,就继续使用标准的K-means算法了。

    下面演示使用SPSS完成聚类操作,SPSS默认使用的是K-means++算法实现的,这里面我选择的K是3,即聚类成3个,可以描述成发达城市,中部城市和不发达城市。

    使用SPSS进行K-means++聚类,虽然可以很好地选择聚类中心,但是对于聚类中心的个数K的问题,还是需要主观堆的经验判断,所以还是有缺点的。如果出现数据量纲不同,应该先进行数据规范化处理,再进行聚类,SPSS勾选将标准值另存为变量,即可实现数据的标准化处理。

     二、系统(层次)聚类

    2.1、系统聚类基本原理

    系统聚类的过程不需要提前设置聚类个数和初始聚类点,系统聚类的流程如下:

    系统(层次)聚类的算法流程:
    一、将每个对象看作一类,计算两两之间的最小距离;
    二、将距离最小的两个类合并成一个新类;
    三、重新计算新类与所有类之间的距离;
    四、重复二三两步,直到所有类最后合并成一类;
    五、画聚类图决定分类个数和类别。

     对于需要计算的距离,对于样本与样本之间的距离,常用的距离公式如下:

     对于指标和指标之间的距离,常用的距离计算公式如下:

    另外,类与类之间的距离常用的计算方式有如下几种:

    1)最短距离法

     2)最长距离法

    3)组间/组内平均连接法

     4)重心法

    2.2、系统聚类SPSS实现

    在Spss中选择系统聚类,导入变量,如果量纲不同,可以消除, 可以设置绘制谱系图等。

    谱系图如下所示,图中的红线是我画上去的,通过红线可以确定分类的个数,主要根据可解释性划分类别,该图中横轴表示各类之间的距离。

     另外除了在图中画竖线确定K的个数,另外有一种常见的方法用来确定聚类数K的值,就是肘部法,具体如下:

     我们通过SPSS进行系统聚类,会生成聚合系数,我们将聚合系数由大到小降序排列后绘图,找到类似肘部的点,即为聚类类别数K。

    我们可以看到绘制的图形中可以去K=3或者K=5,是最好的类别,至于具体取哪个,结合具体的解释性,哪个解释性强,取哪个。

    确定聚类个数K后,可以保存聚类结果并绘图,具体如下,当然只能绘制2维或者3维图,即只有当有2个或者三个变量进行聚类才能绘制出图形。

    最后绘制的二维和三维图形如下所示:

     

     三、DBSCAN算法

    3.1、DBSCAN算法基本原理

    DBSCAN算法是具有噪声的基于密度的聚类方法,根据挨的近按一定的数量进行聚类。

     DBSCAN算法的数据分类如下:主要分成三类,即核心点,边界点,噪声点。

    DBSCAN算法的优缺点如下:其实除非指标绘制的散点图有明显的特殊形状,可以考虑使用DBSCAN算法,一般还是用系统聚类比较好。

     3.2、DBSCAN算法MATLAB实现

    主函数如下,脚本主程序如下:

    1. clc;
    2. clear;
    3. close all;
    4. %% Load Data
    5. load smile;
    6. X = smile;
    7. %% Run DBSCAN Clustering Algorithm
    8. epsilon=0.5;
    9. MinPts=10;
    10. IDX=DBSCAN(X,epsilon,MinPts);
    11. %% Plot Results
    12. %如果只要两个指标的话就可以画图啦
    13. PlotClusterinResult(X, IDX);
    14. title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);

    DBSCAN算法实现的函数如下:
     

    1. function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
    2. C=0;
    3. n=size(X,1);
    4. IDX=zeros(n,1); % 初始化全部为0,即全部为噪音点
    5. D=pdist2(X,X);
    6. visited=false(n,1);
    7. isnoise=false(n,1);
    8. for i=1:n
    9. if ~visited(i)
    10. visited(i)=true;
    11. Neighbors=RegionQuery(i);
    12. if numel(Neighbors)<MinPts
    13. % X(i,:) is NOISE
    14. isnoise(i)=true;
    15. else
    16. C=C+1;
    17. ExpandCluster(i,Neighbors,C);
    18. end
    19. end
    20. end
    21. function ExpandCluster(i,Neighbors,C)
    22. IDX(i)=C;
    23. k = 1;
    24. while true
    25. j = Neighbors(k);
    26. if ~visited(j)
    27. visited(j)=true;
    28. Neighbors2=RegionQuery(j);
    29. if numel(Neighbors2)>=MinPts
    30. Neighbors=[Neighbors Neighbors2]; %#ok
    31. end
    32. end
    33. if IDX(j)==0
    34. IDX(j)=C;
    35. end
    36. k = k + 1;
    37. if k > numel(Neighbors)
    38. break;
    39. end
    40. end
    41. end
    42. function Neighbors=RegionQuery(i)
    43. Neighbors=find(D(i,:)<=epsilon);
    44. end
    45. end

    绘图的matlab代码如下:

    1. function PlotClusterinResult(X, IDX)
    2. k=max(IDX);
    3. Colors=hsv(k);
    4. Legends = {};
    5. for i=0:k
    6. Xi=X(IDX==i,:);
    7. if i~=0
    8. Style = 'x';
    9. MarkerSize = 8;
    10. Color = Colors(i,:);
    11. Legends{end+1} = ['Cluster #' num2str(i)];
    12. else
    13. Style = 'o';
    14. MarkerSize = 6;
    15. Color = [0 0 0];
    16. if ~isempty(Xi)
    17. Legends{end+1} = 'Noise';
    18. end
    19. end
    20. if ~isempty(Xi)
    21. plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);
    22. end
    23. hold on;
    24. end
    25. hold off;
    26. axis equal;
    27. grid on;
    28. legend(Legends);
    29. legend('Location', 'NorthEastOutside');
    30. end

    我们可以看到使用的smile数据集,最后聚类成3个部分,刚好是一个 微笑的表情。

  • 相关阅读:
    【大数据】一、大数据环境配置
    Nginx——安装和反向代理
    springCloudAlibaba之分布式网关组件---gateway
    jdk1.8.191 JVM内存参数 InitialRAMPercentage和MinRAMPercentage
    cesium面积测量
    阿里巴巴微服务架构到底多牛逼?SpringBoot+SpringCloud+Docker
    在ArcGIS中批量添加字段如何构建模型器
    HRNet 【demo 复现过程】
    虚拟偶像主播的大致现状,数字人技术现状
    Spring 如何使用注解实现事务管理呢?
  • 原文地址:https://blog.csdn.net/nuist_NJUPT/article/details/126799662