我们使用SciPy中spatial.distanct子模块下的pdist函数来计算距离矩阵,此矩阵作为层次聚类算法的输入:
在上述代码中,我们基于样本的特征X、Y和Z,使用欧几里得距离计算了样本间的两两距离。通过将pdist函数的返回值输入到squareform函数中,我们得到了一个记录成对样本间距离的对称矩阵:
下面我们使用SciPy中cluster.hierarchy子模块下的linkage函数,此函数以全连接作为距离判定标准,它能够返回一个所谓的关联矩阵(linkage matrix)。
不过在调用linkage函数之前,我们先仔细研究下此函数相关的文档信息:
从对函数的描述中可知:我们可以将由pdist函数得到的稠密矩阵(上三角)作为输入项。或者,将初始化的欧几里得距离矩阵(将矩阵参数项的值设定为euclidean)作为linkage的输入。不过,我们不应使用前面提及的用squareform函数得到的距离矩阵,因为这会生成与预期不同的距离值。综合来讲,这里可能出现三种不同的情况:
·错误的方法:在本方法中,我们使用了通过squareform函数得到的距离矩阵,代码如下:
·正确的方法:在本方法中,我们使用了稠密距离矩阵,代码如下:
·正确的方法:在本方法中,我们以矩阵格式的示例数据作为输入,代码如下:
为了更进一步分析聚类结果,我们通过下面的方式将数据转换为pandas的DataFrame格式(最好在IPython Notebook中使用):
如下表所示,关联矩阵包含多行,每行代表一次簇的合并。矩阵的第一列和第二列分别表示每个簇中最不相似(距离最远)的样本,第三列为这些样本间的距离,最后一列为每个簇中样本的数量。
现在我们已经完成了关联矩阵的计算,下面采用树状图的形式对聚类结果进行可视化展示:
如果是通过执行上述代码生成的图像,或者阅读本书的电子版本,会发现树状图的分支使用了不同的颜色。着色方案来自matplotlib的一个色彩列表,它基于树状图中的距离阈值循环生成不同颜色。例如,通过删除上述代码中的相关注释符,就可使用黑色来绘制此树状图。
此树状图描述了采用凝聚层次聚类合并生成不同簇的过程。例如,从图中可见,首先是ID_0和ID_4合并,接下来是ID_1和ID_2合并,也就是基于欧几里德距离矩阵,选择最不相似的样本进行合并。