scipy.cluster.hierarchy.

cophenet#

scipy.cluster.hierarchy.cophenet(Z, Y=None)[source]#

计算由链接 Z 定义的层次聚类中每个观测值之间的 cophenetic 距离。

假设 pq 是不相交的聚类 st 中的原始观测值,并且 st 由直接父聚类 u 连接。观测值 ij 之间的 cophenetic 距离只是聚类 st 之间的距离。

参数:
Zndarray

层次聚类被编码为一个数组 (参见 linkage 函数)。

Yndarray (可选)

计算由链接矩阵 Z 定义的一组 \(n\) 个在 \(m\) 维空间中的观测值的 cophenetic 相关系数 cY 是生成 Z 的压缩距离矩阵。

返回:
cndarray

cophentic 相关距离 (如果传递了 Y)。

dndarray

压缩形式的 cophenetic 距离矩阵。第 \(ij\) 个条目是原始观测值 \(i\)\(j\) 之间的 cophenetic 距离。

参见

linkage

有关链接矩阵的描述。

scipy.spatial.distance.squareform

将压缩矩阵转换为方形矩阵。

注释

cophenet 除了 NumPy 之外,还实验性地支持与 Python Array API Standard 兼容的后端。 请考虑通过设置环境变量 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 single, cophenet
>>> from scipy.spatial.distance import pdist, squareform

给定一个数据集 X 和一个链接矩阵 Z, X 中的两个点之间的 cophenetic 距离是每个点对应的最大的两个不同的簇之间的距离

>>> 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]]

X 对应于这个数据集

x x    x x
x        x

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

scipy.cluster.hierarchy.cophenet 方法的输出以压缩形式表示。 我们可以使用 scipy.spatial.distance.squareform 将输出看作一个常规矩阵 (其中每个元素 ij 表示 X 中每个 i, j 点对之间的 cophenetic 距离)

>>> squareform(cophenet(Z))
array([[0., 1., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [1., 0., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [1., 1., 0., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 0., 1., 1., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 1., 0., 1., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 1., 1., 0., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 0., 1., 1., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 1., 0., 1., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 1., 1., 0., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 0., 1., 1.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 0., 1.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 1., 0.]])

在这个例子中, X 上非常接近 (即, 在同一个角落) 的点之间的 cophenetic 距离是 1. 对于其他的点对, 距离是 2, 因为这些点将位于不同角落的簇中 - 因此, 这些簇之间的距离会更大。