fcluster#
- scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)[source]#
根据给定的链接矩阵定义的层次聚类,形成扁平集群。
- 参数:
- Zndarray
使用
linkage
函数返回的矩阵编码的层次聚类。- t标量
- 对于标准“不一致”、“距离”或“单标准”,
这是形成扁平集群时要应用的阈值。
- 对于“最大集群”或“最大集群单标准”标准,
这将是请求的最大集群数。
- criterionstr,可选
在形成扁平集群时要使用的标准。这可以是以下任何值
不一致
:如果一个集群节点及其所有后代的不一致值小于或等于 t,那么其所有叶后代都属于同一个扁平集群。当没有非单一集群满足此条件时,每个节点都分配到自己的集群。(默认)
距离
:形成扁平集群,使每个扁平集群中的原始观察值没有超过 t 的共同遗传距离。
最大集群
:找到一个最小阈值
r
,使同一个扁平集群中的任意两个原始观察值的共同遗传距离不超过r
,且形成的扁平集群不超过 t 个。单标准
:当
monocrit[j] <= t
时,从索引为 i 的集群节点 c 形成扁平集群。例如,要对不一致矩阵 R 中计算出的最大平均距离进行阈值处理,阈值为 0.8,请执行以下操作
MR = maxRstat(Z, R, 3) fcluster(Z, t=0.8, criterion='monocrit', monocrit=MR)
最大集群单标准
:当
monocrit[i] <= r
时,从非单一集群节点c
形成扁平集群,对于所有低于并包括c
的集群索引i
都是如此。r
被最小化,以使形成的扁平集群不超过t
个。单标准必须是单调的。例如,要将最大不一致值上的阈值 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 进行阈值处理的统计量。单标准向量必须是单调的,即给定一个索引为 i 的节点 c,对于所有对应于低于 c 的节点的节点索引 j,
monocrit[i] >= monocrit[j]
。
- 返回值:
- fclusterndarray
长度为
n
的数组。T[i]
是原始观察值i
所属的扁平集群编号。
另请参阅
linkage
有关层次聚类方法工作原理的信息。
示例
>>> 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 个集群。
最后,第四种情况的阈值足够大,可以允许所有数据点合并在一起 - 因此这里返回单个集群。