聚类的概念

    聚类是无监督学习的一种,目的是为了对一组没有标签的数据,按照特定的特征,把它们分成不同的类,换句话说,就是把这一组无标签的的数据中,特征相近的那些数据聚合成一个类,聚合成的一个类叫做一个簇。

不同类型的聚类

    按照数据分布的特点,采用的聚类方法可能会有所不同,常见的聚类算法包含以下几种:

        基于原型的聚类:对于聚类结果的每一个簇,我们都可以找到一个典型的数据来代表这个簇,换句话说,该数据的特征是这个簇中数据特征最标准的体现,那么这个标准数据就叫做这个簇的原型。以普通数据与原型数据之间的距离为标准,可以把所有数据聚合到不同的簇中。
       层次聚类:顾名思义,就是在不同层次上对数据进行聚类,如:有一组数据,我们可以先把他们聚成四个簇a、b、c、d,然后通过衡量这四个簇之间的相似度,进一步把这四个簇两两聚合(如a和c聚合,b和d聚合),最后得到两个簇。
       基于密度的聚类:把数据中分布密度相同的数据聚合成一类,也就是以数据分布的密度作为聚类的标准。

几种常见的聚类算法

    K-均值聚类(k-means聚类)
        K-均值聚类是原型聚类的一种,它以一簇数据的均值作为原型(也叫做聚类中心),通过迭代地进行 求取原型→划分与原型相近的数据点 的操作来完成聚类目的。K-均值算法的伪代码如下(图片来自:周志华-《机器学习》):
        聚类算法学习总结
        这里先随机确定了k个原型点,表示要将数据集D聚合成k个簇,然后对于数据集中的其他数据点i,各自找出离自己最近的那个原型点j,那么表示数据点i属于原型点j所代表的那个簇,对所有的数据点都进行一次上述操作之后,我们就得到了k个簇。当然,由于k个原型点是我们随机选取的,并不是真正能够代表一个簇的原型数据点,所以这样的聚类结果并不是准确的,我们对于
得到的每个簇,以各簇的均值作为新的原型点,再次进行聚类,之后重复进行“求各簇均值→以各簇均值为新原型点聚类”,直至原型点不再变化,表示我们得到了真正的原型点,同时用的得到了最终的聚类结果。

    AGNES算法
        AGNES算法是层次聚类算法的一种,他先将数据集中每个样本看作一个初始聚类簇,然后在算法的每一步找出距离最近的两个聚类簇进行合并,重复进行上述过程,直至达到预设的聚类簇个数。
        如上所说,AGNES算法的每一步都需要计算聚类簇之间的距离以找出距离最近的两个聚类簇,关于两个聚类簇之间的距离,有三种可选的计算方法:计算两个簇中最远的两个点的距离作为两个簇的距离、计算两个簇中最近的两个点的距离作为两个簇的距离、计算两个簇中所有点两两之间的平均距离作为两个簇之间的距离。三种计算簇距离的公式如下图(图片来自 :周志华-《机器学习》):聚类算法学习总结
        AGNES算法的伪代码如下(图片来自 :周志华-《机器学习》):
        聚类算法学习总结
      DBSCAN算法
           DBSCAN算法是基于密度的聚类算法,要描述该算法,首先要定义几个概念(图片来自 :周志华-《机器学习》):
            给定数据集D={x1,x2,......xm}:

聚类算法学习总结
聚类算法学习总结
            基于上面个两个概念,一个样本的密度描述为:该样本的ε-邻域内样本的个数,MinPts对应的就是样本的阈值,如果一个样本的ε-邻域内样本个数不少于MinPts,则该样本称为核心对象,核心对象指的应该是一个簇中非边界点的那些点
            DBSCAN算法的伪代码如下(图片来自 :周志华-《机器学习》):
聚类算法学习总结
如上图:
        1-7行首先将数据集中所有的核心对象找出来放在一个集合里,
        9行创建一个集合用来存储未访问的那些数据,
        10-24行为两层循环,
        在外循环前半部分,随机选取一个未访问过的核心对象,然后由内循环从该对象开始,展开广度优先搜索
                17行 将未访问数据集合中 核心对象ε-邻域内样本 放到访问队列中来(18行),下一次会对这些邻域内的样本进行访问,并(可能)将它们邻域中的样本添加到访问队列尾部,以此类推。
        由于内循环会判断当前访问的点是否是核心对象,是的话就把它邻域中的对象加到访问队列中来,不是的话就保留该点自己在访问队列中即可,而前面又说核心对象是那些非簇边界的点,所以访问队列中不是核心对象的点就是簇的边界点,所以内循环的判断语句限制了当访问到边界点的时候,不再进行扩展(邻域中的点不加到访问对像中来)。所以,内循环结束后,所有访问过的对象组成一个簇。
        19行将每次访问过的对象从未访问过的对象集合里删除,最后刚开始未访问的数据集去掉内循环之后未访问的数据集就是一个簇的数据(22行),23行将前面刚得到的那个簇中的核心对象从总核心对象集合中删除,然后继续下一次外循环,又得到一个簇,直至所有核心对象都被访问过,算法结束。


后续待更新... ...

 参考文献:周志华-《机器学习》
                   Pang-Ning Tan, Michal Steinbach, Vipin Kumar-《数据挖掘导论》(中文版)

相关文章: