【聚类算法】【matlab原创】K-means算法的复现与改良——NCBk(NeighCorrect_bikmeans)算法

(*^_^*)在读大学牲一枚

废话不多说,代码见下:

链接:https://pan.baidu.com/s/1dJHVBDa_LmC3zAFyR6eNTQ?pwd=0929 
提取码:0929 
 

欢迎各位指正

文章目录

前言

一、文章之起

二、文章之承

2.1.改良Ⅰ算法

2.2 改良算法Ⅱ:NeighCorrect-Bi-kmeans(NCBk)算法

三、文章之转

3.1 使用数据说明

3.2 实验流程设计

3.3 评价指标

3.4 实验结果

3.4.1 实验组1:数据集“five. mat”聚类

       (1) K-means算法

       (2) Bi-k-means算法

       (3) 改良Ⅰ算法

3.4.2 实验组2:数据集“Aggregation. mat”聚类

       (a)改良前聚类结果

       (b)改良Ⅱ(NCBk)算法聚类结果

       ①最优结果展示

       ②参数敏感性分析

       ③算法优化分析

四、文章之合

4.1 数据集选择和试验设计

4.2 实验结果

4.3 总结



前言

初次分享,不成熟之处望诸君指正。

笔者于同济大学本科课程《数据工程》学习聚类部分时,突感算法之美,在算法改良的大作业契机之下,用工科利器matlab戏写一段改良代码,抛砖引玉。

一、文章之起

我们知道,K-means(k均值算法)、Bi-k-means(二分k均值算法)与DBSCAN(基于密度的聚类算法)均是以相似度为基础的、无监督的聚类算法,每种算法具有不同的优缺点,可以解决的聚类数据特征也不尽相同。

(1)K-means聚类算法由于其选定的初始聚类中心具有随机性,往往会产生不同的聚类结果,同时,由于其以欧氏距离定义密度,所以这种算法只有应用在球状分布的数据中才能正常工作(即存在簇形状偏差的问题)。

缺点如下图所示:

图1.簇形状偏差问题

(2)Bi-K-means聚类算法是对K-means算法的改进,可以通过类似层次聚类的方式改进K-means算法,但同时也易陷入了局部最优解(K-means算法最优情况为全局最优解),并且对于形状大小不一致的数据同样会产生簇形状偏差的问题,同时由于其划分机制的“强约束性(排他性)”,数据点只能被划分一次,这对有部分较为离群的点存在的情况是不利的,如图2(a)中初次分类的黄色离群点在聚类结果图2(b)中被分为绿色类簇(实际上属于黄色类簇)。

(a)初次二分类簇

(b)聚类结果

图2.强约束性(排他性)问题

(3)DBSCAN在参数选择合适的情况下,对数据的鲁棒性较高,并且十分适合于有背景噪声的情况,但是对初始参数的选择要求很高。值得一提的是,以上聚类算法均不能应用于密度不同的数据上。

(a)ε=1.2

(b)ε=1.5

(c)ε=5.0

图3.DBSCAN聚类算法参数敏感问题

    本实验提出一种针对K-means初始聚类选择敏感问题的改良算法,共分为两个改良步骤:其一,以Bi-k-means的思路进行初次改良,同时解决强约束性(排他性)的问题;其二,引进DBSCAN邻近域的概念,解决Bi-k-means中簇形状偏差的问题(即可以分类不同形状的数据),同时其参数选择的鲁棒性较DBSCAN好。

二、文章之承

kmeans、bikmeans本体复现不在此赘述,奉上代码流程图

图4.K-means算法流程图

图5.Bi-k-means算法流程

2.1.改良Ⅰ算法

   Step1 原理阐述

    考虑到Bi-k-means算法对K-means算法改良的关键是使中心点的选择具有层次性,以保证结果不陷入局部最优解,代价为产生强约束性(排他性)的问题。改良算法Ⅰ通过层次选择中心点后全局范围的K-means聚类替换二分K-means中2-means聚类的方法,由于已有聚类有很大概率可以保持稳定,所以这不仅可以去除排他性问题,也保留了Bi-k-means层次选择中心点的精华。

    Step2 编程实现

图6.改良算法Ⅰ流程

    算法说明:

  • 对比改良效果后,在选择划分类簇使将采用基于SSE最大的策略。

2.2 改良算法Ⅱ:NeighCorrect-Bi-kmeans(NCBk)算法

Step1 原理阐述

       改良算法Ⅰ可以修正大多数Bi-k-means适用时的数据结果,而改良算法Ⅱ主要解决的问题是K-means聚类算法家族无法适用于形状不同的数据的问题。算法原理如下:

  • 思路:在改良算法Ⅰ迭代的基础上,对每一次分类结果进行修正。
  • 定义核心点与边界点:围绕聚类中心进行球状扩张,直至在球状领域内的某单连通域出现凹边界时停止,则该范围内,属于聚类中心类别的点为核心点,其余为边界点.

图7.米老鼠图样核心点、邻近点说明

  • 处理边界点:基于图与DBSCAN算法边界点的思想,假设:任何形状中的边界点都可以用邻近半径(r)范围内包含各类簇的点的多少来判定该点的从属(r事先设定,往往可在一定范围内浮动),划定为数量最多的点的类别。
  1. 本算法的修正实质上是在迭代的过程中,人为地帮助聚类中心更精确地定位至图形的中心,而使其具有了表观上识别形状的能力。
  2. 由于改良算法Ⅰ的迭代结果已经将大多数核心点正确地分类,所以在邻近半径选择合适的情况下,不存在邻近点类簇吞并核心点的情况。
  • 基于形状修正方法的判别标准:在修正之后会出现形状不同的情况,此时若单纯选择SSE较大的簇进行分类,可能导致大类簇的过度分裂小类簇的欠分裂。定义分散度(Disper)为判别聚类效果是否优秀的标准,从而选择下一步分类的类簇。

图8.米老鼠图样过度分裂示意图

    Step2 编程实现

图9. NCBk算法流程

    算法说明:

  • 基础部分的算法为改良算法Ⅰ中的迭代算法

三、文章之转

3.1 使用数据说明

表1.数据集统计表

no.

Datasets

Instances

Number of classes (k)

Number of features (d)

Size of classes

1

five

2000

5

2

-

2

Aggregation

788

7

2

170,34,273,

102,130,45,34

        *数据集1具有相当明显的球状几何特征,且密度稍有不均

(a)five

(b)Aggregation

图10.数据集示意图

3.2 实验流程设计

  1. 实验目的:

①探究K-means、Bi-k-means、改良Ⅰ、改良Ⅱ(NCBk)算法在不同数据中的聚类结果及其表现;

②验证不同算法的适用范围及对比不同算法聚类表现;

③探究改良算法的效果,并尝试解释效果提升的机理。

  1. 实验方案:

表2.实验方案表

       *DBSCAN算法已将两个参数调整至最佳状态

3.3 评价指标

  1. 无标签的“five. mat”数据集采用SSE评价聚类效果;
  2. 有标签的“Aggregation. mat”数据集采用正确率评价聚类效果。

3.4 实验结果

3.4.1 实验组1:数据集“five. mat”聚类

       (1) K-means算法
  1. 利用K-means聚类较多球状类簇(5个)时,具有很大的不确定性,结果繁多;
  2. 聚类效果较好的结果出现次数少,总体来看,K-means聚类效果不佳。
       (2) Bi-k-means算法

       从上述结果可以得出结论:

  1. 利用Bi-k-means聚类时,结果依然有很多,甚至较K-means算法更多;
  2. 与K-means算法相比,Bi-k-means的结果SSE分布范围较小,且结果更为集中,可以得到与K-means相同的最好结果。
  3. Bi-k-means算法表现稍微优于K-means,但仍然存在以下问题:

       ①Bi-k-means优化失效问题

       在实验的过程中,Bi-k-means算法偶然会出现K-means算法中的初始聚类中心的选择不当问题,如下图所示,由于左下方球状类簇密度较其他类簇小,在进行紫色类簇与黄色类簇二分类时,初始聚类点选择不当,最终造成欠分裂与过度分裂现象。

图15. 聚类中心随机选择结果

       ②强约束(排他性)问题

       与此同时,Bi-k-means存在强约束问题,如动图1所示,当在包含三个球状类簇的范围内进行二分类时,往往会将中间的球状类簇过度分裂,并且在下一次二分类时,这部分过度分裂的点无法返回原本类簇,导致聚类结果变差。

       在一定程度上,强约束问题会导致Bi-k-means算法出现很大的不稳定性,这也是Bi-k-means算法结果比K-means算法结果种类更多的原因之一。

       (3) 改良Ⅰ算法

       在数据集“five. mat”上,20次尝试后,改良算法有且仅有一种结果,且为SSE结果最小的最优表现,改良效果明显。

动图2.改良Ⅰ算法聚类过程

       观察实验结果,可以得到以下结论:

  1. 改良Ⅰ算法延续了二分k-means算法的层次聚类思想,良好地解决了K-means算法初始聚类中心选择随机的问题;
  2. 同时,改良Ⅰ算法针对二分k-means固有缺陷(强约束问题)进行了良好的优化;
  3. 在一定程度上,改良Ⅰ算法可以解决由密度不均导致的二分k-means优化失效的问题;
  4. 改良Ⅰ算法表现十分稳定。

3.4.2 实验组2:数据集“Aggregation. mat”聚类

       (a)改良前聚类结果

       由于该数据集在大小形状上均不规则,传统的K-means算法家族进行准确的聚类十分困难,结果如下:

K-means算法

正确率

Bi-k-means算法

SSE

(a)

87%

(b)

72%

改良Ⅰ算法

正确率

(c)

78%

       图16.传统K-means算法聚类结果

       (b)改良Ⅱ(NCBk)算法聚类结果
       ①最优结果展示

动图3.改良Ⅱ算法聚类过程示意图(r=3)

       “Aggregation. mat”数据集经过改良Ⅱ(NCBk)算法聚类后达到了99.6%的准确度,并且十分稳定,不会出现其他结果。

       ②参数敏感性分析

       为探究新参数的敏感度与鲁棒性,根据实验方案,试验参数邻域半径r取不同值时的结果,得到以下结论:

  1.  2.65<r<5.35 时,表现最优,正确率稳定达99%以上;
  2. 当 2.20<r<2.65 时,正确率降低,但仍有一定概率出现最优情况;
  3. 当 r<2.20 时,左下角两个小球类簇分类出现错误,产生欠分裂现象,表现变差;
  4. 当 r>5.35 时,随着领域半径的变大,分出的类簇数逐渐变少,符合直观认知。
       ③算法优化分析

       “Aggregation. mat”作为形状特征明显的数据集,在参数正确的情况下,DBSCAN算法可以很好解决,现比较改良Ⅱ(NCBk)算法与DBSCAN算法参数调节的难易程度、敏感性与对不同数据集的鲁棒性。

       首先,利用DBSCAN算法对“Aggregation. mat”数据集进行聚类,可以看到除了正确分出的7类,在月亮形类簇中距离较远的点被误判为了噪声点,这是我们不愿意看到的,而改良Ⅱ算法可以保证每个聚类点正确划分。

图17.DBSCAN算法聚类结果

       其次,在参数设置方面,DBSCAN算法需要正确决定两个参数(邻域半径ε、最小点数Minpts),才能产生较好的聚类结果,并且对ε敏感度非常高:

(a)ε=1.1

(b)ε=1.6

(c)ε=4

图18.DBSCAN算法不同参数结果

       相比之下,改良Ⅱ(NCBk)算法只需要确定一个参数,并且最优结果参数范围比DBSCAN算法大得多,对参数的鲁棒性更强。

       最后,在密度稍有不均的数据集1上试验两种算法,可以看出改良Ⅱ算法表现良好,DBSCAN算法表现较差,故改良Ⅱ算法对不同数据集具有较高的鲁棒性。

(a)DBSCAN

(b)改良Ⅱ算法

图19.数据集1不同算法聚类结果


四、文章之合

4.1 数据集选择和试验设计

       在本实验中,选择了数据集1 "five.mat" 和数据集2 "Aggregation.mat" 作为研究对象。

  1. 数据集1是经典的球状类簇,同时还具有一定难度的密度不均匀特征,故选用数据集1来测试传统K-means、Bi-k-means算法和改良Ⅰ算法,以探究改良Ⅰ算法在经典聚类问题下的性能表现;
  2. 数据集2则包含了不同形状的类簇,故在数据集2上测试改良Ⅱ(NCBk)算法,并使用传统DBSCAN算法作为对照组,以探究改良Ⅱ(NCBk)算法的性能表现。

4.2 实验结果

       对聚类结果进行可视化分析与评价指标(SSE、正确率)的统计分析后,得到以下结果:

  1. 在数据集1上,改良Ⅰ算法比K-means与Bi-k-means算法更好,解决了初始聚类中心随机与强约束性的问题;
  2. 而在数据集2上,改良Ⅱ(NCBk)算法比DBSCAN算法表现更好,并且以较少的代价(引入新参数)降低了DBSCAN算法参数难度,并且提高了在不同数据集上的鲁棒性。

4.3 总结

       本实验通过学习各种算法的原理与优缺点,尝试对K-means算法进行复现与算法改良,Matlab实验结果表明,改良Ⅰ算法具有一定的实用价值,可以用于解决经典聚类问题中的一些难点,同时在形状不同的数据集上,改良Ⅱ算法可以作为一种替代方案,取得更好的聚类效果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值