赞
踩
目录
层次分析法是一种常用的聚类技术,旨在将数据对象根据其相似性分组。这种方法特别适用于探索性数据分析,它可以帮助我们以树状结构清楚地理解数据的层次关系。本文将通过一个简单的 Python 示例介绍如何使用层次聚类分析法对数据进行处理,并可视化分析结果。
首先,我们需要安装和导入所需的库。如果你还未安装这些库,可以使用以下命令:
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库中导入凝聚层次聚类算法
-
生成一个包含随机数据的数据框,并给它指定列名和行索引,以便于进一步的数据分析或处理。
- 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
-
输出结果:
接下来,我们使用层次聚类方法来计算样本间的欧几里得距离,并创建距离关联矩阵。我们将应用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])]))
输出结果如:
使用 dendrogram
函数绘制层次聚类树。该树形结构将显示聚类过程以及样本间的相似性。
-
- # 绘制层次聚类树
- row_dendr = dendrogram(row_clusters, labels=labels) # 绘制层次聚类的树状图
- plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
- plt.ylabel('Euclidean distance') # 设置y轴标签
- plt.show() # 显示图像
-
如图:
为了更深入地分析聚类结果,我们还可以绘制热度图,帮助我们更直观地了解聚类的效果。
- # 层次聚类热度图
- 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 进行层次聚类分析,包括创建数据框、计算距离矩阵、绘制层次聚类树和热度图的过程。通过这些步骤,我们不仅能够对数据进行聚类分析,还能够可视化结果以便于解读。层次分析法在数据挖掘与机器学习中是一个非常重要的工具,值得深入学习与实践。希望本文能够帮助你更好地理解层次分析法的基本概念和应用方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。