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 |
下面逐条解析聚类图
这个图与矩阵 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')
各参数含义如下
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()
结果如下