层次聚类是一种常用的聚类方法,它不需要事先指定聚类的数量,而是生成一个聚类层次结构。在本文中,将使用AgglomerativeClustering算法和scipy库中的dendrogram方法来展示如何进行层次聚类分析。AgglomerativeClustering算法是一种自底向上的聚类方法,它从每个样本点作为一个单独的聚类开始,然后逐渐合并这些聚类,直到所有的样本点都合并成一个聚类。
为了更好地理解层次聚类的过程,首先需要了解dendrogram的概念。dendrogram是一种树状图,用于展示层次聚类的结果。在dendrogram中,每个节点代表一个聚类,而节点之间的连线表示聚类之间的合并。通过观察dendrogram,可以直观地了解聚类的结构和层次关系。
在进行层次聚类分析之前,需要准备一些必要的库和数据。将使用numpy库来处理数值计算,matplotlib库来绘制图形,scipy库中的hierarchy模块来生成dendrogram,以及sklearn库中的datasets模块来加载数据集。
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。在这个函数中,首先创建一个链接矩阵,然后使用dendrogram方法来绘制dendrogram。链接矩阵包含了每个节点的子节点、距离和样本点的数量等信息。通过这些信息,可以生成一个完整的dendrogram。
def plot_dendrogram(model, **kwargs):
# Create linkage matrix and then plot the dendrogram
# create the counts of samples under each node
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 # leaf node
else:
current_count += counts[child_idx - n_samples]
counts[i] = current_count
linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float)
# Plot the corresponding dendrogram
dendrogram(linkage_matrix, **kwargs)
现在,已经准备好了所有必要的工具和函数。接下来,将使用AgglomerativeClustering算法来对iris数据集进行层次聚类分析。iris数据集是一个著名的多变量数据集,包含了150个样本点和4个特征。将使用这个数据集来展示层次聚类的效果。
iris = load_iris()
X = iris.data
# setting distance_threshold=0 ensures we compute the full tree.
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)
model = model.fit(X)
plt.title("Hierarchical Clustering Dendrogram")
# plot the top three levels of the dendrogram
plot_dendrogram(model, truncate_mode="level", p=3)
plt.xlabel("Number of points in node (or index of point if no parenthesis).")
plt.show()
通过上述代码,可以生成一个层次聚类的dendrogram。在这个dendrogram中,每个节点代表一个聚类,而节点之间的连线表示聚类之间的合并。通过观察这个dendrogram,可以直观地了解聚类的结构和层次关系。例如,可以看到哪些聚类在早期就被合并,哪些聚类在后期才被合并。这些信息对于理解数据集的结构和特征非常有用。
层次聚类分析是一种非常灵活和强大的聚类方法,它可以应用于各种不同的数据集和应用场景。通过使用AgglomerativeClustering算法和dendrogram方法,可以更好地理解数据集的结构和特征,从而为进一步的数据分析和处理提供有力的支持。