入手
dendrogram是scipy
提供的聚类树形图绘制函数,其使用方法大致如下
from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
y = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
z = linkage(y, 'single')
dendrogram(z)
plt.show()
其效果如图所示
很明显 2 , 5 , 1 , 0 , 3 , 4 2,5,1,0,3,4 2,5,1,0,3,4并不是 y y y中的数据,而应该理解为 y y y中数据类别的编号,记作 x x x
y | 2 | 8 | 0 | 4 | 1 | 9 | 9 | 0 |
---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
下面逐条解析聚类图
- 2 2 2和 7 7 7对应 0 0 0和 0 0 0,二者相差0,并且组成一个新的类,编号为8。
- 5 5 5和 6 6 6对应 9 9 9和 9 9 9,二者相差0,组成新类,编号为9。
- 0 0 0和 4 4 4对应 2 2 2和 3 3 3,二者相差1,组成新类,编号为10。
- 3 3 3和 8 8 8对应 4 4 4和 { 2 : 0 , 7 : 0 } \{2:0,7:0\} {2:0,7:0},距离为2,组成新类,编号为11。
- ……以此类推
这个图与矩阵 z z z有着一一对应的关系,下面以 z i j z_{ij} zij表示矩阵 z z z的第 i i i行第 j j j列,列表如下
i i i | z i 0 z_{i0} zi0 | z i 1 z_{i1} zi1 | z i 2 z_{i2} zi2 | z i 3 z_{i3} zi3 | 类别 |
---|---|---|---|---|---|
0 | 2 | 7 | 0 | 2 | 8 |
1 | 5 | 6 | 0 | 2 | 9 |
2 | 0 | 4 | 1 | 2 | 10 |
3 | 8 | 10 | 1 | 4 | 11 |
4 | 1 | 9 | 1 | 3 | 12 |
5 | 3 | 11 | 2 | 5 | 13 |
6 | 12 | 13 | 4 | 8 | 14 |
至此便明白了聚类图以及聚类矩阵的含义。
参数
dendrogram函数的完整参数如下
dendrogram(z, p=30, truncate_mode=none, color_threshold=none, get_leaves=true, orientation='top', labels=none, count_sort=false, distance_sort=false, show_leaf_counts=true, no_plot=false, no_labels=false, leaf_font_size=none, leaf_rotation=none, leaf_label_func=none, show_contracted=false, link_color_func=none, ax=none, above_threshold_color='c0')
各参数含义如下
- z 连接矩阵
- p 调节truncate_mode的参数
- truncate_mode 当z特别大的时候,聚类图会变得很难看,本参数的作用就是让聚类图适当稀疏一些,有一下几个选项
none
不做任何优化'lastp'
最后面的p
个簇显示为一个叶节点。'level'
只现实到第p
级的聚类簇。
color_threshold
设置颜色阈值get_leaves
为true时,在结果字典中包含 r[‘leaves’]=h 的列表。orientation
图的方向,可选参数包括:'top', 'botton', 'left', 'right'
labels
默认为none
,则直接用节点号作为标签;否则可输入一个列表,用于映射标签。count_sort
对于节点n,其两个下级连接的左右次序由本参数决定,可选下列参数false
什么也不做'ascending'
或者true
先画小值子节点'descending'
先画大值子节点
distance_sort
和count_sort
功能相似,且二者不能同时为true
,可选参数如下false
什么也不做'ascending'
或者true
先画距离更小的子节点'descending'
先画距离更大的子节点
show_leaf_counts
当为true时,叶节点在括号中标注其所包含的观测数据的数量。no_plot
为true
时,不对图形进行渲染,此时无法调用plt.show()
no_labels
设为true
则不显示标签leaf_rotation
标签文字旋转角度leaf_font_size
标签的字体尺寸leaf_label_func
用于调整标签的函数show_contracted
当为true时,进入截断模式,即对叶节点进行缩进,变成十字。link_color_func
用于调整连接线颜色的函数ax
绘图的坐标轴,用matplotlib
的都懂,不用的也没必要知道above_threshold_color
绘图颜色字符串,默认为c0
显示层级
dendrogram中的参数实在是太多了,没法一一演示,下面演示一下参数 p p p对聚类图像的调控
import numpy as np
import matplotlib.pyplot as plt
ys = np.random.randint(200, size=[50,1])
z = linkage(ys, 'single')
fig = plt.figure()
ax = fig.add_subplot(211, title='none')
dn = dendrogram(z, ax=ax)
for i,l in enumerate([1,2,4], 4):
ax = fig.add_subplot(2,3,i,title=f"level={l}")
dn = dendrogram(z, p=l, truncate_mode='level', ax=ax, show_contracted=true)
plt.show()
结果如下
发表评论