层次聚类是一种常用的聚类方法,它可以生成一个树状图(dendrogram),直观地展示数据点之间的相似度。在本示例中,将使用AgglomerativeClustering算法和scipy库中的dendrogram函数来绘制树状图。还将使用matplotlib库来展示最终的图形。
首先,需要导入必要的库。numpy库用于数值计算,matplotlib库用于绘图,scipy库中的hierarchy模块提供了绘制树状图的功能,而sklearn库中的datasets模块提供了iris数据集,将使用这个数据集来进行聚类分析。
import numpy as np
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_iris
接下来,定义一个函数plot_dendrogram,它接受一个模型作为参数,并绘制对应的树状图。在绘制树状图之前,需要创建一个链接矩阵,它包含了每个节点的子节点、距离和样本数量。然后,使用dendrogram函数来绘制树状图。
def plot_dendrogram(model, **kwargs):
# 创建链接矩阵并绘制树状图
# 创建每个节点下的样本数量
counts = np.zeros(model.children_.shape[0])
n_samples = len(model.labels_)
for i, merge in enumerate(model.children_):
current_count = 0
for child_idx in merge:
if child_idx < n_samples:
current_count += 1 # 叶子节点
else:
current_count += counts[child_idx - n_samples]
counts[i] = current_count
linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float)
# 绘制对应的树状图
dendrogram(linkage_matrix, **kwargs)
现在,可以加载iris数据集,并使用AgglomerativeClustering算法进行聚类分析。将设置distance_threshold=0,以确保计算完整的树状图。然后,使用fit方法对数据进行拟合,并使用plot_dendrogram函数绘制树状图。
iris = load_iris()
X = iris.data # 设置distance_threshold=0确保计算完整的树
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)
model = model.fit(X)
plt.title("层次聚类树状图")
# 绘制树状图的前三个层级
plot_dendrogram(model, truncate_mode="level", p=3)
plt.xlabel("节点中的点数(或如果没有括号,则为点的索引)")
plt.show()
通过上述代码,成功地绘制了层次聚类的树状图。树状图的每个节点代表了一组数据点,节点之间的距离表示这些数据点之间的相似度。通过观察树状图,可以直观地了解数据点之间的相似度关系,从而为进一步的聚类分析提供参考。
本示例的运行时间为0分钟0.103秒。可以通过以下链接下载Jupyter notebook和Python源代码,以便在本地环境中运行和修改本示例。
相关示例: