目录
前言
层次分析法是一种常用的聚类技术,旨在将数据对象根据其相似性分组。这种方法特别适用于探索性数据分析,它可以帮助我们以树状结构清楚地理解数据的层次关系。本文将通过一个简单的 Python 示例介绍如何使用层次聚类分析法对数据进行处理,并可视化分析结果。
1. 环境准备
首先,我们需要安装和导入所需的库。如果你还未安装这些库,可以使用以下命令:
pip install numpy pandas matplotlib scikit-learn scipy
接下来,导入所需的模块:
import pandas as pd # 导入pandas库
import numpy as np # 导入numpy库
import matplotlib.pyplot as plt # 导入matplotlib绘图库
from scipy.spatial.distance import pdist, squareform # 从scipy库中导入计算距离的模块
from scipy.cluster.hierarchy import linkage # 从scipy库中导入层次聚类的链接函数
from scipy.cluster.hierarchy import dendrogram # 从scipy库中导入绘制树状图的函数
from sklearn.cluster import AgglomerativeClustering # 从sklearn库中导入凝聚层次聚类算法
2. 加载数据(创建数据框)
生成一个包含随机数据的数据框,并给它指定列名和行索引,以便于进一步的数据分析或处理。
np.random.seed(123) # 设置随机数种子以保证结果可重复
variables = ['X', 'Y', 'Z'] # 定义列名
labels = ['ID_0', 'ID_1', 'ID_2', 'ID_3', 'ID_4'] # 定义行索引
X = np.random.random_sample([5, 3]) * 10 # 生成5行3列的随机数矩阵,数值范围为0到10
df = pd.DataFrame(X, columns=variables, index=labels) # 创建数据框,使用随机生成的数据和指定的列名、行索引
print(df) # 打印数据框df
输出结果:
3.计算距离矩阵并输出聚类结果
接下来,我们使用层次聚类方法来计算样本间的欧几里得距离,并创建距离关联矩阵。我们将应用linkage
函数来计算层次聚类。
# 计算距离关联矩阵,两两样本间的欧氏距离
# row_dist = pd.DataFrame(squareform(pdist(df, metric='euclidean')), columns=labels, index=labels)
# print(row_dist) # 打印距离矩阵
row_clusters = linkage(pdist(df, metric='euclidean'), method='complete') # 计算距离矩阵并进行层次聚类,使用完全链接法
# row_clusters = linkage(df.values, method='complete', metric='euclidean') # 另一种方式,可以直接用数据框的值
# 打印层次聚类结果,包括簇标签、距离和簇内项目数量
print(pd.DataFrame(row_clusters, columns=['row label1', 'row label2', 'distance', 'no. of items in clust.'],index=['cluster %d' % (i + 1) for i in range(row_clusters.shape[0])]))
输出结果如:
4.绘制层次聚类树
使用 dendrogram
函数绘制层次聚类树。该树形结构将显示聚类过程以及样本间的相似性。
# 绘制层次聚类树
row_dendr = dendrogram(row_clusters, labels=labels) # 绘制层次聚类的树状图
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.ylabel('Euclidean distance') # 设置y轴标签
plt.show() # 显示图像
如图:
5.绘制层次聚类热度图
为了更深入地分析聚类结果,我们还可以绘制热度图,帮助我们更直观地了解聚类的效果。
# 层次聚类热度图
fig = plt.figure(figsize=(8, 8)) # 创建一个8x8的图形
axd = fig.add_axes([0.09, 0.1, 0.2, 0.6]) # 添加第一个坐标轴,用于绘制树状图
row_dendr = dendrogram(row_clusters, orientation='right') # 绘制右侧的树状图
df_rowclust = df.iloc[row_dendr['leaves'][::-1]] # 根据树状图叶子的顺序重新排列数据框
axm = fig.add_axes([0.23, 0.1, 0.6, 0.6]) # 添加第二个坐标轴,用于绘制热度图
cax = axm.matshow(df_rowclust, interpolation='nearest', cmap='hot_r') # 绘制热度图
axd.set_xticks([]) # 隐藏x轴刻度
axd.set_yticks([]) # 隐藏y轴刻度
for i in axd.spines.values(): # 隐藏坐标轴的边框
i.set_visible(False)
fig.colorbar(cax) # 添加颜色条
axm.set_xticklabels([''] + list(df_rowclust.columns)) # 设置x轴标签
axm.set_yticklabels([''] + list(df_rowclust.index)) # 设置y轴标签
plt.show() # 显示热度图
如图:
总结
本文介绍了如何使用 Python 进行层次聚类分析,包括创建数据框、计算距离矩阵、绘制层次聚类树和热度图的过程。通过这些步骤,我们不仅能够对数据进行聚类分析,还能够可视化结果以便于解读。层次分析法在数据挖掘与机器学习中是一个非常重要的工具,值得深入学习与实践。希望本文能够帮助你更好地理解层次分析法的基本概念和应用方法。