scipy.cluster.hierarchy.

is_isomorphic#

scipy.cluster.hierarchy.is_isomorphic(T1, T2)[source]#

确定两个不同的聚类分配是否等价。

参数:
T1类数组

单个簇 ID 到扁平簇 ID 的分配。

T2类数组

单个簇 ID 到扁平簇 ID 的分配。

返回:
bbool

扁平簇分配 T1T2 是否等价。

参见

linkage

获取链接矩阵的描述。

fcluster

用于创建扁平簇分配。

注释

数组 API 支持(实验性): 如果输入是一个惰性数组(例如 Dask 或 JAX),返回值将是一个 0 维布尔数组。

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

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 参见注释

Dask

⚠️ 参见注释

不适用

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

示例

>>> from scipy.cluster.hierarchy import fcluster, is_isomorphic
>>> from scipy.cluster.hierarchy import single, complete
>>> from scipy.spatial.distance import pdist

如果两个扁平簇分配表示相同的簇分配,但具有不同的标签,则它们可以是同构的。

例如,我们可以使用 scipy.cluster.hierarchy.single 方法并将输出扁平化为四个簇

>>> 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 = single(pdist(X))
>>> T = fcluster(Z, 1, criterion='distance')
>>> T
array([3, 3, 3, 4, 4, 4, 2, 2, 2, 1, 1, 1], dtype=int32)

然后我们可以使用 scipy.cluster.hierarchy.complete 方法做同样的事情:

>>> Z = complete(pdist(X))
>>> T_ = fcluster(Z, 1.5, criterion='distance')
>>> T_
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32)

我们可以看到,在这两种情况下,我们都获得了四个簇,并且所有数据点都以相同的方式分布 - 唯一改变的是扁平簇标签(3 => 1, 4 => 2, 2 => 3 and 4 => 1),因此两个簇分配是同构的

>>> is_isomorphic(T, T_)
True