赞
踩
hierarchy是一种常用的聚类方法,可以自顶向下无限二分,从而得到不同层次的聚类结果。Python实现一般使用以下函数,其输出为一个n行4列的矩阵,表示层次聚类后的树状图。
tree = scipy.cluster.hierarchy.linkage(arr,'ward')
输出示例如下,前两列代表每一步合并的两个簇,第三列为簇间距离,第四列表示合并后新簇所包含的点数量。
- >>> tree
- 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. ]])
这种输出结果很方便绘制树形的可视化聚类图,例如使用dendrogram()函数:
- dendrogram(tree)
- plt.show()
注意dendrogram()绘制的时候调用了matplotlib库,因此在头文件处设置backend是没用的,需要在调用的函数内部设置或者查看backend,函数如下:
- matplotlib.use('TkAgg')
- dendgrotam(tree)
- print(matplotlib.get_backend())
如果要得到不同层次确切的聚类结果需使用fcluser()函数:
result = fcluster(tree,t=3,criterion='distance')
t为形成簇时的threshold,可以控制生成簇的层次与数量。函数输出为每个样本对应簇类别所组成的列表,最大值即为簇数。结合dict.keys()与dict.values()的对应关系能够很方便地找到聚类前后的样本类别对应关系。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。