scipy.cluster.hierarchy.

fcluster#

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)[source]#

根据给定链接矩阵定义的层次聚类,形成扁平簇。

参数:
Zndarray

使用由 linkage 函数返回的矩阵编码的层次聚类。

t标量
对于准则“不一致”、“距离”或“单调”,

这是在形成扁平簇时要应用的阈值。

对于“maxclust”或“maxclust_monocrit”准则,

这将是请求的最大簇数量。

criterionstr, 可选

用于形成扁平簇的准则。可以是以下任何值:

不一致 :

如果一个簇节点及其所有后代的不一致值小于或等于 t,则其所有叶子后代都属于同一个扁平簇。当没有非单例簇满足此准则时,每个节点都被分配到其自己的簇中。(默认)

距离 :

形成扁平簇,使得每个扁平簇中的原始观测值的同表距离不大于 t

最大簇数 :

找到一个最小阈值 r,使得同一扁平簇中任何两个原始观测值之间的同表距离不大于 r,并且形成的扁平簇不超过 t 个。

单调 :

monocrit[j] <= t 时,从索引为 i 的簇节点 c 形成扁平簇。

例如,要以 0.8 的阈值对不一致矩阵 R 中计算出的最大平均距离进行阈值处理,请执行:

MR = maxRstat(Z, R, 3)
fcluster(Z, t=0.8, criterion='monocrit', monocrit=MR)
最大单调簇数 :

当对于 c 下方(包括 c)的所有簇索引 imonocrit[i] <= r 时,从非单例簇节点 c 形成扁平簇。r 被最小化,使得形成的扁平簇不超过 t 个。monocrit 必须是单调的。例如,为了最小化最大不一致值的阈值 t,使得形成的扁平簇不超过 3 个,请执行:

MI = maxinconsts(Z, R)
fcluster(Z, t=3, criterion='maxclust_monocrit', monocrit=MI)
depthint, 可选

执行不一致计算的最大深度。对于其他准则,它没有意义。默认为 2。

Rndarray, 可选

用于 'inconsistent' 准则的不一致矩阵。如果未提供,则计算此矩阵。

monocritndarray, 可选

一个长度为 n-1 的数组。monocrit[i] 是对非单例 i 进行阈值处理的统计量。monocrit 向量必须是单调的,即,给定索引为 i 的节点 c,对于所有对应于 c 下方节点的节点索引 j,monocrit[i] >= monocrit[j]

返回:
fclusterndarray

一个长度为 n 的数组。T[i] 是原始观测值 i 所属的扁平簇编号。

另请参阅

linkage

有关层次聚类方法工作原理的信息。

附注

数组 API 标准支持

fcluster 除了 NumPy 之外,还对 Python Array API Standard 兼容后端提供实验性支持。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参阅 对数组 API 标准的支持

示例

>>> from scipy.cluster.hierarchy import ward, fcluster
>>> from scipy.spatial.distance import pdist

所有簇链接方法(例如 scipy.cluster.hierarchy.ward)都生成一个链接矩阵 Z 作为其输出。

>>> X = [[0, 0], [0, 1], [1, 0],
...      [0, 4], [0, 3], [1, 4],
...      [4, 0], [3, 0], [4, 1],
...      [4, 4], [3, 4], [4, 3]]
>>> Z = ward(pdist(X))
>>> Z
array([[ 0.        ,  1.        ,  1.        ,  2.        ],
       [ 3.        ,  4.        ,  1.        ,  2.        ],
       [ 6.        ,  7.        ,  1.        ,  2.        ],
       [ 9.        , 10.        ,  1.        ,  2.        ],
       [ 2.        , 12.        ,  1.29099445,  3.        ],
       [ 5.        , 13.        ,  1.29099445,  3.        ],
       [ 8.        , 14.        ,  1.29099445,  3.        ],
       [11.        , 15.        ,  1.29099445,  3.        ],
       [16.        , 17.        ,  5.77350269,  6.        ],
       [18.        , 19.        ,  5.77350269,  6.        ],
       [20.        , 21.        ,  8.16496581, 12.        ]])

该矩阵表示一个树状图,其中第一个和第二个元素是每一步合并的两个簇,第三个元素是这些簇之间的距离,第四个元素是新簇的大小——包含的原始数据点数量。

scipy.cluster.hierarchy.fcluster 可用于展平树状图,从而将原始数据点分配到单个簇中。

这种分配主要取决于距离阈值 t——允许的最大簇间距离。

>>> fcluster(Z, t=0.9, criterion='distance')
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12], dtype=int32)
>>> fcluster(Z, t=1.1, criterion='distance')
array([1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8], dtype=int32)
>>> fcluster(Z, t=3, criterion='distance')
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32)
>>> fcluster(Z, t=9, criterion='distance')
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)

在第一种情况下,阈值 t 太小,不允许数据中的任何两个样本形成簇,因此返回 12 个不同的簇。

在第二种情况下,阈值足够大,允许前 4 个点与其最近的邻居合并。因此,这里只返回 8 个簇。

第三种情况,阈值更高,允许最多 8 个数据点连接——因此这里返回 4 个簇。

最后,第四种情况的阈值足够大,允许所有数据点合并在一起——因此返回一个单一的簇。