层次聚类中的簇标签

Python 中的无监督学习

Benjamin Wilson

Director of Research at lateral.io

层次聚类中的簇标签

  • 不只是可视化工具!
  • 可在任意中间阶段取回簇标签
  • 可用于如交叉列联等分析

欧洲歌唱大赛的层次聚类

Python 中的无监督学习

中间聚类与树状图高度

  • 例如在高度 15:
    • 保加利亚、塞浦路斯、希腊为一簇
    • 俄罗斯和摩尔多瓦为一簇
    • 亚美尼亚单独成簇

带有高度 15 水平线的放大簇

Python 中的无监督学习

树状图展示簇间距离

  • 树状图高度 = 合并簇间的距离
  • 例如仅含塞浦路斯和希腊的簇,距离约为 6

突出显示塞浦路斯/希腊簇的放大图

Python 中的无监督学习

树状图展示簇间距离

  • 树状图高度 = 合并簇间的距离
  • 例如仅含塞浦路斯和希腊的簇,距离约为 6
  • 该新簇与仅含保加利亚的簇距离约为 12

突出显示塞浦路斯/希腊簇及塞浦路斯/希腊/保加利亚簇的放大图

Python 中的无监督学习

中间聚类与树状图高度

  • 树状图的高度表示合并簇间的最大距离
  • 不要合并距离超过该阈值的簇(如 15)

带有高度 15 水平线的放大簇

Python 中的无监督学习

簇间距离

  • 由"链接方法"决定
  • 在"完全链接"中:簇间距离为两簇样本间的最大距离
  • 通过 method 参数指定,如 linkage(samples, method="complete")
  • 更换链接方法,会得到不同的层次聚类
Python 中的无监督学习

提取簇标签

  • 使用 fcluster() 函数
  • 返回包含簇标签的 NumPy 数组

带有高度 15 水平线的放大簇

Python 中的无监督学习

使用 fcluster 提取簇标签

from scipy.cluster.hierarchy import linkage
mergings = linkage(samples, method='complete')
from scipy.cluster.hierarchy import fcluster

labels = fcluster(mergings, 15, criterion='distance') print(labels)
[ 9  8 11 20  2  1 17 14 ... ]
Python 中的无监督学习

将簇标签与国家名称对齐

给定字符串列表 country_names

import pandas as pd
pairs = pd.DataFrame({'labels': labels, 'countries': country_names})
print(pairs.sort_values('labels'))
               countries  labels
5                Belarus       1
40               Ukraine       1
...
36                 Spain       5
8               Bulgaria       6
19                Greece       6
10                Cyprus       6
28               Moldova       7
...
Python 中的无监督学习

Passons à la pratique !

Python 中的无监督学习

Preparing Video For Download...