《看见到洞见》系列文章汇聚、分享的是绿盟科技创新中心对于数据分析在安全领域应用的技战术思考与经验,力求由浅入深层次递进,实战到方法论双线剖析。此文为系列文章之引子第二篇,深入浅出的对常用的数据分析和机器学习的算法进行介绍。
在上一篇中,我们介绍了几种常用的监督学习方法。在本篇中,我们介绍无监督学习方法中的聚类方法。聚类是在高维度的未标注数据中寻找特征的一系列方法。其思想是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能的大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。由于聚类算法不需要有标签的数据,所以聚类算法在很多领域得到了广泛的应用,如模式识别、数据分析、图像处理、市场研究、客户分割、Web文档分类等。本篇将介绍K-means聚类,层次聚类和DBSCAN聚类三种聚类算法。
K-means聚类
K-means聚类算法是一种应用非常广泛的聚类方法,是一种划分聚类方法。其基本思想为:给定一个包含n个对象的数据集,K-means聚类算法可以构建数据的k个划分,每个划分就是一个簇,并且满足:
- 每个簇至少包含一个对象。
- 每个对象必须属于并且仅属于一个簇。
K-means算法的流程如图 1所示。
当结果簇是密集的,而且簇和簇之间的区别比较明显时,K-means的效果较好。对于大数据集,K-means是相对可伸缩的和高效的,它的复杂度是O(nkt),其中,n是对象的个数,k是簇的数目,t是迭代的次数。
K-means的最大问题是要求先给出k的个数。k的选择一般基于经验值和多次实验结果。对于不同的数据集,k的取值没有可借鉴性。另外,K-means对孤立数据点是敏感的,少量噪声数据就能对平均值造成极大的影响。
层次聚类算法
与K-means算法不同,层次聚类算法不再产生单一聚类,而是产生一个聚类层次,也就是说产生一棵层次树。层次聚类算法最多包含n步,其中,n是数据集中对象的数量。每一步执行的操作就是在前面步骤的聚类基础上生成新聚类。层次聚类算法的流程如图 2所示。
- 将每个对象归为一类, 共得到n类,每类仅包含一个对象。类与类之间的距离就是它们所包含的对象之间的距离。
- 找到最接近的两个类并合并成一类,于是总的类数少了一个。
- 重新计算新的类与所有旧类之间的距离。
- 重复第2步和第3步,直到最后合并成一个类为止(此类包含了n个对象)。
由于这种聚类算法迭代合并所有分类,所以这种层次聚类称为“凝聚”法。也有一种“划分”层次聚类法,与“凝聚”相反,它先将所有对象放在同一类中,并不断划分成更小的类,划分法一般很少使用。
DBSCAN
(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)
DBSCAN是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。
DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为:任一满足核心对象条件的数据对象p,数据集D中所有从p密度可达的数据对象o所组成的集合构成了一个完整的聚类C,且p属于C。
算法流程可以描述为:扫描整个数据集,找到任意一个核心点,对该核心点进行扩充。扩充的方法是寻找从该核心点出发的所有密度相连的数据点(注意是密度相连)。遍历该核心点的邻域内的所有核心点(因为边界点是无法扩充的),寻找与这些数据点密度相连的点,直到没有可以扩充的数据点为止。最后聚类成的簇的边界节点都是非核心数据点。之后就是重新扫描数据集(不包括之前寻找到的簇中的任何数据点),寻找没有被聚类的核心点,再重复上面的步骤,对该核心点进行扩充直到数据集中没有新的核心点为止。数据集中没有包含在任何簇中的数据点就构成异常点。
DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。与K-means算法比较,DBSCAN算法不需要输入要划分的聚类个数。但是由于它直接对整个数据库进行操作,且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:
- 当数据量增大时,要求较大的内存支持,I/O消耗也很大。
- 当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。
小结:本篇介绍了无监督学习的聚类算法中常用到的三种方法。至此机器学习算法方面的介绍也暂告一段落。
如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669