scipy.cluster.hierarchy.

is_valid_linkage#

scipy.cluster.hierarchy.is_valid_linkage(Z, warning=False, throw=False, name=None)[source]#

检查连接矩阵的有效性。

如果连接矩阵是一个具有 \(n\) 行和 4 列的二维数组(双精度类型),则该矩阵有效。前两列必须包含介于 0 和 \(2n-1\) 之间的索引。对于给定的行 i,以下两个表达式必须成立

\[0 \leq \mathtt{Z[i,0]} \leq i+n-1 0 \leq Z[i,1] \leq i+n-1\]

也就是说,一个簇不能加入另一个簇,除非被加入的簇已经被生成。

Z 的第四列表示一个簇中原始观测的数量,因此有效的 Z[i, 3] 值可能不超过原始观测的数量。

参数:
Zarray_like

连接矩阵。

warningbool,可选

当为 True 时,如果传递的连接矩阵无效,则发出 Python 警告。

throwbool,可选

当为 True 时,如果传递的连接矩阵无效,则抛出 Python 异常。

namestr,可选

此字符串指的是无效连接矩阵的变量名。

返回:
bbool

如果不一致矩阵有效,则为 True;否则为 False。

另请参阅

linkage

有关连接矩阵的描述。

注释

Array API 支持 (实验性): 如果输入是一个懒加载的 Array (例如 Dask 或 JAX),返回值可能是一个 0 维布尔 Array。 当 warning=True 或 throw=True 时,调用这个函数会实现数组。

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

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

⚠️ 请参阅注释

⚠️ 请参阅注释

Dask

⚠️ 请参阅注释

n/a

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

示例

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

此模块中聚类方法生成的所有连接矩阵都将有效(即,它们将具有适当的维度,并且两个必需的表达式将对所有行都成立)。

我们可以使用 scipy.cluster.hierarchy.is_valid_linkage 检查这一点

>>> 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.        ]])
>>> is_valid_linkage(Z)
True

但是,如果我们以错误的方式创建连接矩阵 - 或者如果我们以任何必需的表达式不再成立的方式修改有效的连接矩阵,则检查将失败

>>> Z[3][1] = 20    # the cluster number 20 is not defined at this point
>>> is_valid_linkage(Z)
False