vlambda博客
学习文章列表

层次聚类算法介绍及其参数讲解

算法介绍

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。

在社会学领域,一般通过给定网络的拓扑结构定义网络节点间的相似性或距离,然后采用单连接层次聚类或全连接层次聚类将网络节点组成一个树状图层次结构。其中,树的叶节点表示网络节点,非叶节点一般由相似或距离接近的子节点合并而得到。

层次聚类方法的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。该方法的优点是可随时停止划分,主要步骤如下:

  1. 移除网络中的所有边,得到有n个孤立节点的初始状态;

  2. 计算网络中每对节点的相似度;

  3. 根据相似度从强到弱连接相应节点对,形成树状图;

  4. 根据实际需求横切树状图,获得社区结构。

自底向上的合并算法:

层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。

示意图如下图所示:

算法优势

优点:

  1. 距离和规则的相似度容易定义,限制少;

  2. 不需要预先制定聚类数;

  3. 可以发现类的层次关系;

  4. 可以聚类成其它形状;

缺点:

  1. 计算复杂度太高;

  2. 奇异值也能产生很大影响;

  3. 算法很可能聚类成链状;

参数介绍

sklearn.cluster.AgglomerativeClustering(n_clusters=2,*,affinity='euclidean',memory=None,connectivity=None,compute_full_tree='auto',linkage='ward',distance_threshold=None)

参数:

  1. n_clusters:一个整数,指定分类簇的数量。

  2. connectivity:一个数组或者可调用对象或者None,用于指定连接矩阵。

  3. affinity:一个字符串或者可调用对象,用于计算距离。可以为:'euclidean'、'l1'、'l2'、'mantattan'、'cosine'、'precomputed',如果linkage='ward',则affinity必须为'euclidean'。

  4. memory:用于缓存输出的结果,默认为不缓存。

  5. n_components:在v-0.18中移除。

  6. compute_full_tree:通常当训练了n_clusters后,训练过程就会停止,但是如果compute_full_tree=True,则会继续训练从而生成一颗完整的树。

  7. linkage:一个字符串,用于指定链接算法。

    (1).'ward':单链接single-linkage,采用dmindmin;

    (2).'complete':全链接complete-linkage算法,采用dmaxdmax;

    (3).'average':均连接average-linkage算法,采用davgdavg;

  8. pooling_func:一个可调用对象,它的输入是一组特征的值,输出是一个数。

属性:

  1. labels:每个样本的簇标记。

  2. n_leaves_:分层树的叶节点数量。

  3. n_components:连接图中连通分量的估计值。

  4. children:一个数组,给出了每个非节点数量。

方法:

  1. fit(X[,y]):训练样本。

  2. fit_predict(X[,y]):训练模型并预测每个样本的簇标记。

调优方法

BIRCH算法(常用):

  1. 适合大规模数据集,线性效率;

  2. 只适合分布呈凸形或者球形的数据集、需要给定聚类个数和簇之间的相关参数。

CURE算法:

  1. 能够处理非球形分布的应用场景;

  2. 采用随机抽样和分区的方式可以提高算法的执行效率。

适用场景

适合包含大量聚类,可能是连通性约束的,非欧几里得距离。

如果是按变量(或标题)聚类,此类聚类的代表是层次聚类,层次聚类会生成聚类树状图,可以直观看到聚类结果,可结合专业知识综合判定分析。

由于K-means聚类需要自己设定聚类个数,设置的太多或太少都可能影响聚类效果,而层次聚类可以自动聚类类别数量,不需要事先设定聚类个数,因此有时也会将K-means聚类和层次聚类结合起来使用。

demo示例

from sklearn.cluster import AgglomerativeClusteringimport numpy as npX = np.array([[12], [14], [10], [42], [44], [40]])clustering = AgglomerativeClustering().fit(X)clustering# AgglomerativeClustering()clustering.labels_# array([1, 1, 1, 0, 0, 0])