fcluster

首发版本:3.00.5.1

语法

fcluster(Z, t, [criterion='inconsistent'], [depth=2], [R], [monocrit])

详情

根据链接矩阵(linkage matrix)表示的层次型聚合聚类结果生成平面聚类(flat clusters)。

linkage 函数返回的矩阵 Z 描述了从 n 个原始观测点逐步合并的完整树状结构。fcluster 根据 criterion 指定的切分准则,将树状结构切分为若干个互不相交的平面簇,并返回每个原始观测点所属的簇标签。

DolphinDB 的 fcluster 在计算准则上与 SciPy 保持一致,但在结果输出上进行了优化:通过保证标签的连续性和分配稳定性,降低了用户后续数据处理的复杂度,并增强了计算结果的可复现性。

参数

Z 数值矩阵,指定链接矩阵,形状必须为 (n-1) × 4,其中 n 为原始观测点个数。通常由 linkage 函数生成。

t 数值标量。

  • criterion 为 “inconsistent”、”distance” 或 “monocrit” 时,t 指定形成平面聚类时使用的阈值;

  • criterion 为 “maxclust” 或 “maxclust_monocrit” 时,t 指定最大簇数,必须为不小于 1 的正整数。

criterion 可选参数,字符串标量,指定切分准则,可取值为:

  • “inconsistent”:默认值,基于不一致性系数切分。

  • “distance”:基于共表型距离切分。

  • “maxclust”:自动寻找最小阈值,使形成的簇数量不超过 t。

  • “monocrit”:基于 monocrit 指定的单调统计量切分。

  • “maxclust_monocrit”:基于 “monocrit” 寻找最小阈值,使形成的簇数量不超过 t。

depth 可选参数,正整数标量。仅当 criterion='inconsistent' 且未提供 R 时生效,用于指定计算不一致性系数时的最大层深,默认值为 2。

R 可选参数,数值矩阵,指定不一致性矩阵。仅当 criterion="inconsistent" 时使用。

  • 若未指定 R,则函数内部根据 Zdepth 计算不一致性矩阵。

  • 若指定 R,则其形状必须为 (n - 1) * 4。其中,R[i, 3] 表示第 i 个非叶子簇节点的不一致性系数。

monocrit 可选参数,数值向量,长度必须为 n - 1。当 criterion 为 "monocrit" 或 "maxclust_monocrit" 时必填。

  • monocrit[i] 表示编号为 n + i 的非叶子簇节点对应的统计量。

  • 对于 "maxclust_monocrit",monocrit 必须单调:若非叶子节点 n + j 是非叶子节点 n + i 的后代,则必须满足 monocrit[i] >= monocrit[j]。

返回值

返回一个 INT 向量,长度为 n(原始观测点个数)。簇标签从 1 开始编号,第 i 个元素表示第 i 个原始观测点所属的簇标签。

例子

例1. 基于距离阈值(distance)划分

X = [1.0, 2.0, 3.0]
Z = linkage(X)
fcluster(Z, t=1.5, criterion="distance")
// output: [1, 1, 2]

当距离阈值为 1.5 时,前两个观测值之间的距离较小,因此被分到同一个簇中;第三个观测值单独形成一个簇。

例2. 基于最大聚类数(maxclust)划分

X = [1.0, 2.0, 3.0]
Z = linkage(X)
fcluster(Z, t=2, criterion="maxclust")
// output: [1, 1, 2]

当要求最多生成 2 个簇时,算法会自动选择一个合适的切分位置,使最终结果不超过两个簇。

例3. 使用默认不一致系数(inconsistent)划分。未显式指定 criterion 时,默认使用 inconsistent。在该示例中,按照默认不一致性切分准则,三个观测点最终被划分到同一个簇中。

X = matrix(0.0 0.0, 0.0 4.0, 3.0 0.0)
Z = linkage(X, method="single", metric="euclidean")
fcluster(Z, 1.0)
// output: [1, 1, 1]

例4. 基于自定义单调统计量(monocrit)划分。该示例使用用户自定义的单调统计量 monocrit 作为切分依据。当阈值为 1.5 时,前两个观测值被归为同一簇,第三个观测值单独成簇。

Z = linkage([1.0, 2.0, 3.0])
monocrit = [1.0, 2.0]
fcluster(Z, t=1.5, criterion="monocrit", monocrit=monocrit)
// output: [1, 1, 2]

相关函数:linkage