fcluster#
- scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)[源代码]#
从给定的连接矩阵定义的层次聚类中形成扁平聚类。
- 参数:
- Zndarray
由
linkage
函数返回的矩阵编码的层次聚类。- t标量
- 对于标准 ‘inconsistent’、‘distance’ 或 ‘monocrit’,
这是在形成扁平聚类时应用的阈值。
- 对于 ‘maxclust’ 或 ‘maxclust_monocrit’ 标准,
这将是请求的最大聚类数。
- criterionstr, 可选
用于形成扁平聚类的标准。这可以是以下任何值
inconsistent
:如果一个聚类节点及其所有后代的非一致性值小于或等于 t,则其所有叶后代都属于同一扁平聚类。当没有非单例聚类满足此标准时,每个节点都分配到其自身的聚类。(默认)
distance
:形成扁平聚类,以便每个扁平聚类中的原始观测值具有不大于 t 的共表型距离。
maxclust
:找到一个最小阈值
r
,使得同一扁平聚类中任意两个原始观测值之间的共表型距离不超过r
,并且形成的扁平聚类不超过 t 个。monocrit
:当
monocrit[j] <= t
时,从索引为 i 的聚类节点 c 形成一个扁平聚类。例如,要以 0.8 的阈值对不一致矩阵 R 中计算的最大平均距离进行阈值化,请执行
MR = maxRstat(Z, R, 3) fcluster(Z, t=0.8, criterion='monocrit', monocrit=MR)
maxclust_monocrit
:当
monocrit[i] <= r
对于 c 之下和包括 c 的所有聚类索引i
时,从非单例聚类节点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
有关层次聚类方法如何工作的信息。
注意
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 个聚类。
最后,第四种情况的阈值足够大,允许所有数据点合并在一起 - 因此返回单个聚类。