(*^_^*)在读大学牲一枚
废话不多说,代码见下:
链接:https://pan.baidu.com/s/1dJHVBDa_LmC3zAFyR6eNTQ?pwd=0929
提取码:0929
欢迎各位指正
文章目录
2.2 改良算法Ⅱ:NeighCorrect-Bi-kmeans(NCBk)算法
3.4.2 实验组2:数据集“Aggregation. mat”聚类
前言
初次分享,不成熟之处望诸君指正。
笔者于同济大学本科课程《数据工程》学习聚类部分时,突感算法之美,在算法改良的大作业契机之下,用工科利器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事先设定,往往可在一定范围内浮动),划定为数量最多的点的类别。
- 本算法的修正实质上是在迭代的过程中,人为地帮助聚类中心更精确地定位至图形的中心,而使其具有了表观上识别形状的能力。
- 由于改良算法Ⅰ的迭代结果已经将大多数核心点正确地分类,所以在邻近半径选择合适的情况下,不存在邻近点类簇吞并核心点的情况。
- 基于形状修正方法的判别标准:在修正之后会出现形状不同的情况,此时若单纯选择SSE较大的簇进行分类,可能导致大类簇的过度分裂或小类簇的欠分裂。定义分散度(Disper)为判别聚类效果是否优秀的标准,从而选择下一步分类的类簇。
图8.米老鼠图样过度分裂示意图
Step2 编程实现
图9. NCBk算法流程
算法说明:
- 基础部分的算法为改良算法Ⅰ中的迭代算法
三、文章之转
3.1 使用数据说明
- 数据来源:聚类数据集(含人造、真实数据集)_聚类数据集资源-CSDN文库
- 数据集描述:在数据集仓库中选取了两个二维数据集,均为“.mat”格式,数据集具体情况如下:
表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 实验流程设计
- 实验目的:
①探究K-means、Bi-k-means、改良Ⅰ、改良Ⅱ(NCBk)算法在不同数据中的聚类结果及其表现;
②验证不同算法的适用范围及对比不同算法聚类表现;
③探究改良算法的效果,并尝试解释效果提升的机理。
- 实验方案:
表2.实验方案表
*DBSCAN算法已将两个参数调整至最佳状态
3.3 评价指标
- 无标签的“five. mat”数据集采用SSE评价聚类效果;
- 有标签的“Aggregation. mat”数据集采用正确率评价聚类效果。
3.4 实验结果
3.4.1 实验组1:数据集“five. mat”聚类
(1) K-means算法
- 利用K-means聚类较多球状类簇(5个)时,具有很大的不确定性,结果繁多;
- 聚类效果较好的结果出现次数少,总体来看,K-means聚类效果不佳。
(2) Bi-k-means算法
从上述结果可以得出结论:
- 利用Bi-k-means聚类时,结果依然有很多,甚至较K-means算法更多;
- 与K-means算法相比,Bi-k-means的结果SSE分布范围较小,且结果更为集中,可以得到与K-means相同的最好结果。
- 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.改良Ⅰ算法聚类过程
观察实验结果,可以得到以下结论:
- 改良Ⅰ算法延续了二分k-means算法的层次聚类思想,良好地解决了K-means算法初始聚类中心选择随机的问题;
- 同时,改良Ⅰ算法针对二分k-means固有缺陷(强约束问题)进行了良好的优化;
- 在一定程度上,改良Ⅰ算法可以解决由密度不均导致的二分k-means优化失效的问题;
- 改良Ⅰ算法表现十分稳定。
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取不同值时的结果,得到以下结论:
- 当 2.65<r<5.35 时,表现最优,正确率稳定达99%以上;
- 当 2.20<r<2.65 时,正确率降低,但仍有一定概率出现最优情况;
- 当 r<2.20 时,左下角两个小球类簇分类出现错误,产生欠分裂现象,表现变差;
- 当 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来测试传统K-means、Bi-k-means算法和改良Ⅰ算法,以探究改良Ⅰ算法在经典聚类问题下的性能表现;
- 数据集2则包含了不同形状的类簇,故在数据集2上测试改良Ⅱ(NCBk)算法,并使用传统DBSCAN算法作为对照组,以探究改良Ⅱ(NCBk)算法的性能表现。
4.2 实验结果
对聚类结果进行可视化分析与评价指标(SSE、正确率)的统计分析后,得到以下结果:
- 在数据集1上,改良Ⅰ算法比K-means与Bi-k-means算法更好,解决了初始聚类中心随机与强约束性的问题;
- 而在数据集2上,改良Ⅱ(NCBk)算法比DBSCAN算法表现更好,并且以较少的代价(引入新参数)降低了DBSCAN算法参数难度,并且提高了在不同数据集上的鲁棒性。
4.3 总结
本实验通过学习各种算法的原理与优缺点,尝试对K-means算法进行复现与算法改良,Matlab实验结果表明,改良Ⅰ算法具有一定的实用价值,可以用于解决经典聚类问题中的一些难点,同时在形状不同的数据集上,改良Ⅱ算法可以作为一种替代方案,取得更好的聚类效果。