数学建模学习笔记之聚类问题

  最近在同学安利下入手华科老学长清风的数学建模课程,在这里记录下笔记。做笔记的目的主要是将较长的视频精简成短时间能看完的文档,方便日后复习用,也希望能给予后来者一点帮助。


给定数据,分类未知,让这堆数据自己聚成几类。

一、K-means聚类法

1.流程

可视化:https://www.naftaliharris.com/blog/visualizing‐k‐means‐clustering/
  1.给定一堆样本点,先初始化K个中心,然后计算各样本点到这K个中心的距离,离哪个近就归于哪个中心点,成为一个类。得到K个类。
  2.计算这K个类新的K个中心,然后计算各样本点到这K个新中心的距离,离哪个近就归于哪个新中心点,成为一个新类。
  3.重复第二步。
  4.直到K个中心不再变化,或者达到规定的迭代次数。

2.优劣

优点: 处理大数据集,该算法效率相对较高。
缺点:
  (1)用户需要先指定K,但到底指定K为多少是不知道的。
  (2)对初值敏感。不同的初始化中心很容易导致不同的聚类结果。
初值敏感  (3)对于孤立点数据敏感。
孤立点敏感  如左图,绿色是中心点。原本蓝点应该归为B类的。
  但是如右图,由于孤立点红点的干扰,导致B类的中心点发生了偏移,最后蓝点被归为A类了。

3.改进

(1)Elbow-Method确定K的选取

  记聚类误差SE(又称聚类系数)为每个样本点到其聚类中心点的距离之和。
  考虑极端情况,k=n时SE是最小的,每个样本点自己就是一类,SE=0;同理k=1时SE是最大的。说明增大k可以减小SE,但SE不是越小越好。
  取不同的K,分别做聚类,算出聚类误差。作出SE-k的图像,
肘部法则

  发现K=3之前,每次增大K都能使误差极大减小。K=3之后,增大K能减小的误差很少了。故说明K=3是最合适的。

(2)K-means++算法解决初值敏感和孤立点敏感问题

  K-means++的思想就是:初始化聚类中心之间的相互距离要尽可能远。
  1.随机选取一个样本点作为第一个聚类中心。
  2.计算其他各样本点到当前已有的最近的聚类中心之间的距离。距离越远,被抽取为下一个聚类中心的概率越大。
  3.重复第二步,直到选出K个聚类中心,然后就可以使用标准的K-means算法了。
  SPSS中用K-means聚类时,默认使用的就是K-means++算法。

(3)数据标准化

  如果数据各特征的量纲不一致,需要对数据进行标准化。
  SPSS在对数据进行描述性统计那里,就可以勾选对数据进行标准化。
  有的时候SPSS里会看到“Z得分”,“Z得分”就是减去均值除以标准差的标准化。

二、系统聚类法(层次聚类法)

1.流程

  (1)将每个样本点视为一个类,计算两两之间的距离。
(在计算机中,可以用邻接矩阵存储距离信息。)
  (2)将距离最小的两个类合并为一个新类。
  (3)重新计算新类与所有类之间的距离。 (邻接矩阵删去两行两列,新增一行一列。)
  (4)重复二、三步,直到所有类合并为一个类。

2.细节

  上面的流程提到要计算距离,具体怎么计算距离呢?
  先看点与点之间的距离。
例题

  如上图,同一组数据可以有两种聚类问题。左边的问题对样本进行聚类,需要计算样本距离;右边的问题对指标进行聚类,需要计算指标距离。

(1)样本距离(点与点)

  样本的常用距离有以下几种,
样本距离
  除了网格型问题会用到绝对值距离以外,大多数问题一般都用欧式距离就可以了。

(2)指标距离(点与点)

指标距离
  指标距离一般不怎么会用到, 真用到了套公式就行。

(3)类间距离(类与类)

  设d为两个点之间的距离,D为两个类之间的距离,则D有以下几种计算方式
类间距离
  选用不同的点间距离和类间距离会得到不同的聚类结果。如果聚类结果不太理想,可以尝试更换距离定义方式试试。

3.结果处理

  聚类结束后,可以得到如下谱系图
谱系图  树状结构表明各点的合并过程,横向长度表示合并时各类的类间距离。
  如果想分成两类,在黄线处切一刀即可(说明此时对类间距离的容忍度较大);如果想分成三类,在蓝线处切一刀即可(说明此时对类间距离的容忍度较小)。
  在SPSS下得到的图是这样的,
谱系图2
  可以看到,左边比较密集的点直接画成一下子合并的样子了。

  那么,到底怎么确定分成几类呢?还是用Elbow-Method,作出SE-K的图并找到拐点。
  而且,SPSS在做系统聚类时会顺便把聚类过程中各步的聚合系数给出来,
聚合结果
  假设原本有31个点(类),聚合一次变成30类,聚合两次变成29类,…直到聚合成一个类,这个过程中每一步的聚合系数SE都已知,于是我们可以拷贝进excel,画出SE-K的图像。

  特别地,当特征数为2或者3时,可以作出可视化聚类结果图。具体画图操作见视频。
画图结果

三、DBSCAN算法

1.流程

可视化: https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
  0.给定初始参数 ε \varepsilon ε和Minpts。
  1.随便选一个还没被访问过的样本点,选中它作为点O。
  2.以点O为圆心、 ε \varepsilon ε为半径作圆。
  3.如果圆内有超过Minpts个点,就将这些点与O点归为一类,并选中这些点作为新的O点,重复第二步。如果圆内的点不超过Minpts,则回到第一步。
  4.直到所有点都被访问过为止。
简单来说,就是随便找一个中心,然后往外扩散传播。
可以去matlab官网下载代码 https://ww2.mathworks.cn/matlabcentral/fileexchange/52905‐dbscan‐clustering‐algorithm 然后用于自己的程序中。

2.优劣

优点:
  (1)能处理任意形状的簇。(比如之前那个微笑图案,用K-Means很容易失败,但DBSCAN就容易成功)
  (2)可在聚类的同时发现异常点。(那些被访问而没被选中的点就当作异常点)
  (3)不需要指定K。

缺点:
  (1)对 ε \varepsilon ε和Minpts敏感。(同一个问题,略微变动 ε \varepsilon ε和Minpts,聚类结果可能大相径庭。)
  DBSCAN的 ε \varepsilon ε和minpt要匹配,如果 ε \varepsilon ε很小而minpt很大,那么所有点都为噪声点;如果 ε \varepsilon ε很大会导致所有点归为一类;如果minpt很小那么无法区分噪声点。
  (2)全局共用同一个 ε \varepsilon ε和Minpts,如果两个类密度本来就不均匀,则聚类质量差。
  (3)数据量大时,计算密度单元的复杂度大。(?)

老师建议:只有两个指标、且作出图后发现很适合用DBSCAN,再用DBSCAN。其他情况下用系统聚类法会好一点。


片尾广告
  清风数学建模课程,B站上可以免费看前几节,讲的挺好的,还在不断更新。最近更新了许多内容,我还没来得及看,想进一步了解的可以自己去看看。
链接: 清风数学建模课程.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值