linkage

首发版本:3.00.5.1

语法

linkage(X, [method="single"], [metric="euclidean"], [optimalOrdering=false])

详情

通过凝聚式(Agglomerative)层次聚类算法,根据指定的链接方法自底向上逐步合并簇,并生成描述整个聚类过程的 linkage matrix。

X 为向量,函数将其视为压缩距离矩阵,直接基于其中给出的两两距离执行聚类;若 X 为矩阵,函数将每一列视为一个观测,根据 metric 计算任意两列之间的距离,再执行层次聚类。当前实现采用时间复杂度为 O(n²) 的优化算法,其中 n 为原始观测数。

返回的 linkage matrix 可进一步通过 fcluster 生成聚类标签。

DolphinDB linkage 与 SciPy linkage 的功能相似,存在以下区别:

特性

DolphinDB linkage

SciPy linkage

矩阵输入方向 列为观测,行为特征值(计算列与列之间的距离)。 行为观测,列为特征值(计算行与行之间的距离)。
支持的度量 (metric) 目前仅支持 "euclidean" 和 "cosine"。 支持 euclidean、cityblock、cosine、minkowski、mahalanobis 等多种距离度量,并支持自定义距离函数(不同链接方法支持的 metric 存在限制,例如 ward 仅支持 Euclidean)。
最优排序支持 optimalOrdering 目前仅支持 false。 支持 True,可重新排列树状图中叶节点的顺序,使相邻叶节点之间的距离尽可能小,从而改善树状图的可视化效果。
算法复杂度 所有方法均实现 O(n²) 复杂度 single, complete, average, weighted, ward 为 O(n²);其余方法采用时间复杂度为 O(n³) 的实现。

参数

X 数值向量或矩阵。

  • X 是向量时,指定压缩形式的距离矩阵,它是由原始距离矩阵的上三角部分(不含对角线)按行优先顺序排列而成。长度必须为 n * (n - 1) / 2,其中,n 为原始观测数。

  • X 是矩阵时,指定观测数据,每一列为一个观测向量,每一行为一个特征。矩阵至少需要包含两列。

method 可选参数,字符串标量,指定链接方法。默认值为 "single"。可取值为:

  • "single":单链接,最近点距离。

  • "complete":全链接,最远点距离。

  • "average":平均链接,UPGMA。

  • "weighted":加权平均链接,WPGMA。

  • "centroid":质心链接,UPGMC。

  • "median":中位数链接,WPGMC。

  • "ward":Ward 方差最小化链接。

metric 可选参数,字符串标量,仅当 X 为矩阵时有效,用于指定观测之间的距离度量。可取值为:

  • "euclidean":默认值,表示欧式距离。当 method 为 “centroid”、”median” 或 “ward”,且输入为矩阵时,metric 必须为 “euclidean”。

  • "cosine":余弦距离,定义为 1 - dot(x, y) / (norm(x) * norm(y))

optimalOrdering 可选参数,布尔标量,指定是否重排 linkage matrix,使树状图(dendrogram)中相邻叶节点之间的距离尽可能小。默认值为 false,当前仅支持 false。

返回值

返回一个 DOUBLE 类型的 (n - 1) × 4 矩阵,其中 n 为原始观测数。第 i 行描述第 i 次簇合并操作:第 0 列和第 1 列分别为参与合并的两个簇编号,第 2 列为两个簇在本次合并时的距离,第 3 列为新簇包含的原始观测数。原始观测编号为 0 ~ n−1,新生成的簇按合并顺序依次编号为 n、n+1、...、2n−2。

例子

例1. 输入为压缩距离矩阵

X = [1.0, 2.0, 3.0]
linkage(X)

0

1

2

3

0 1 1 2
2 3 2 3

结果显示:

第 0 行:观测点 0 和 1 距离最近(1.0),合并为新簇 3,包含 2 个原始点

第 1 行:观测点 2 和新簇 3 距离为 2.0,合并为新簇 4,包含 3 个原始点

例2. 输入为矩阵

// 矩阵输入:每一列为一个观测向量
X = matrix(0.0 0.0, 0.0 4.0, 3.0 0.0)
linkage(X, method="single", metric="euclidean")

0

1

2

3

0 2 3 2
1 3 4 3

例3. 使用 average 链接与 cosine 距离

X = matrix(1.0 0.0, 0.0 1.0, 1.0 1.0)
linkage(X, method="average", metric="cosine")

0

1

2

3

0 2 0.29289321881345254 2
1 3 0.6464466094067263 3

例4. 结合 fcluster 函数进行聚类

// 构造观测数据(3个观测点,每个点2个特征)
X = matrix(0.0 0.0, 0.0 4.0, 3.0 0.0)
// 生成 linkage matrix
Z = linkage(X, method="single", metric="euclidean")
// 使用 fcluster 根据距离阈值生成聚类标签
// 设定阈值 t=3.5,准则为 'distance'
labels = fcluster(Z, 3.5, criterion="distance")
labels 
// output: [1, 2, 1]  表示第 0 和第 2 个观测点距离较近(距离为3.0),被归为簇 1;第 1 个点距离较远,被归为簇 2

相关函数:fcluster