层次聚类

引言

前面,我们介绍了一些聚类的方法,像k-means啊,密度聚类,LVQ啊,不管怎么样,都要首先随机指定k个中心点,然后用这些中心点逐步迭代找到最终的中心点。这就有问题了,如果随机选取的点不好,不具有代表性,那么就会很糟糕,轻则只是聚类慢,重则会导致聚类效果比较差。本节我们引入层次聚类,它不需要提前指定随机的中心点,能够有效的对初始样本进行聚类。

层次聚类

本质上讲,层次聚类是自底向上的聚类方式,也就是说最初我们假设每一个点都是一个类,然通过不断的合并,最终形成k个聚类中心点,实现聚类,就像三国时代,几十个诸侯通过不断的兼并,最终形成了三足鼎立,也就是三个聚类点。

簇距离的定义

既然是将不同的聚类簇进行合并,那么就必然要有合并的规则。一般我们都是将距离最近的两个簇进行合并。对于两个点,距离比较好计算,欧氏距离或者闵可夫斯基距离都可以。但是两个簇(簇中不仅包含一个点)的距离怎么定义呢?

一般有下面的是定义

最小距离:

最大距离:

平均距离:

其实本质上还是利用簇中的点的聚类来定义的簇的距离。

那么有了簇的距离的定义,那么就有了合并规则,那么只要按照规则合并聚类各个簇,直到达到终止条件即可(一般的终止条件是指定聚类成k个类)。

从上面的描述看,层次聚类非常简单,确实简单,就是计算麻烦一点,下面我们来具体描述一下他的实现算法

算法实现

输入:

样本集
聚类度量函数
聚类个数

算法过程:

每个样本属于单独的一类,即
计算样本与样本之间的距离,用矩阵表示,其中
另当前聚类数为q = n,开始簇合并聚类

循环

找出距离最近的两个簇,另
后面的簇的编号向前移动一位
删除矩阵的第行和
更新矩阵(主要更新簇与其他簇的距离),
更新当前聚类个数

输出生成的簇

层次聚类的优缺点

本质上讲层次聚类不需要指定初始的聚类中心点,这点还是非常优秀的,但是依旧要指定聚类k数或者终止条件,如果不知道数据的细节,也很难得到好的聚类结果。很多时候在进行k_means聚类前,会应用层次聚类来确定初始的聚类点,这也是层次聚类的一个应用。

实验结果

显示 Gitment 评论