赞
踩
这里,我们来解读一下scipy中给出的层次聚类scipy.cluster.hierarchy的示例:
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
Z = linkage(X, method='centroid')
f = fcluster(Z,t=3,criterion='distance')
fig = plt.figure(figsize=(5, 3))
dn = dendrogram(Z)
print('Z:\n', Z)
print('f:\n', f)
plt.show()
可以得到输出结果:
Z:
[[ 2. 7. 0. 2. ]
[ 5. 6. 0. 2. ]
[ 1. 9. 1. 3. ]
[ 4. 8. 1. 3. ]
[ 0. 11. 1.66666667 4. ]
[ 3. 12. 3.25 5. ]
[10. 13. 7.26666667 8. ]] (7 × 4)
f:
[2 1 2 3 2 1 1 2] (1 ×)
f 代表了 [2, 8, 0, 4, 1, 9, 9, 0] 的每一个元素属于哪一个类别,这里设置了 3 类。如果想要 5 类的话,就可以在 fcluster 函数中的 t 参数设置为 t=5 即可。
关于 Z 矩阵的意义
由于层次聚类每一次都会聚合两个类,那么如果有 n 个样本,那么最终会进行(n-1)次聚合,显然,Z 矩阵有 n-1 行,这就意味着每一行表示了一次操作。
那么接下来,我们从上到下解读。
首先, Z 矩阵表示一个树状图,对于每一行来说,其中第一个和第二个元素是每一步合并的两个簇(本例中的 2 和 7),第三个元素是这些簇之间的距离,第四个元素是新簇的大小——包含的原始数据点的数量.
第一步:
根据 Z 的第一行,那么索引 2 和 7 将会合并为一个新的类,新的类给一个新的索引,譬如为 8,第三个数 0 表示索引 2 和 7 的两个簇之间的距离为 0,这是显然的。最后一个数 2 表示当前合并完的这个类有 2个元素。
同理,我们可以把这一系列过程都表达如下:
import scipy.cluster.hierarchy as hcluster
Z = hcluster.linkage(X, method='centroid')
import scipy.cluster.hierarchy as hcluster
f = fcluster(Z, t=3, criterion='distance')
这个函数压平树状图
这种分配主要取决于距离阈值 t——允许的最大簇间距离
[1] 层次聚类python,scipy(dendrogram, linkage,fcluster函数)2021.6
[2] Python scipy.cluster.hierarchy.fcluster用法及代码示例 2022.7
[3] 层次聚类算法及通过python的scipy进行计算 2022.7
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。