Ward聚类算法是一种基于特征矩阵的递归合并聚类方法,它通过最小化簇内方差来合并簇。该算法使用基于堆的表示方法来构建惯性矩阵,这种结构化版本考虑了样本之间的拓扑结构。
在Ward聚类算法中,参数X表示一个形状为(n_samples, n_features)的数组,它代表要进行聚类的n_samples个样本的特征矩阵。参数connectivity可以是一个数组或稀疏矩阵,默认为None,它定义了每个样本的相邻样本,这些样本遵循数据的给定结构。如果指定了connectivity矩阵,则算法是结构化的;否则,它是非结构化的。
参数n_clusters是一个整数,默认为None。如果指定了n_clusters,算法将在达到n_clusters时提前停止构建树。这有助于在簇的数量与样本数量相当时减少计算时间。在这种情况下,不会计算完整的树,因此'children'输出的用途有限,而应使用'parents'输出。
参数return_distance是一个布尔值,默认为False。如果设置为True,则返回簇之间的距离。返回值包括children、n_connected_components、n_leaves和parents。children是一个形状为(n_nodes-1, 2)的ndarray,表示每个非叶子节点的子节点。n_connected_components表示图中的连通分量数量,n_leaves表示树中叶子的数量。parents是一个形状为(n_nodes,)的ndarray或None,表示每个节点的父节点。只有当指定了connectivity矩阵时才会返回parents,否则返回None。
如果设置了return_distance为True,则还会返回一个形状为(n_nodes-1,)的ndarray distances,表示节点中心之间的距离。这些距离是根据加权欧几里得距离计算的,并且会根据scipy.hierarchy.linkage中的公式进行更新。
下面是一个使用Ward聚类算法的示例代码:
import numpy as np
from sklearn.cluster import ward_tree
X = np.array([
[1, 2],
[1, 4],
[1, 0],
[2, 2],
[2, 4],
[2, 0],
[3, 2],
[3, 4],
[3, 0],
[4, 2],
[4, 4],
[4, 0]
])
children, n_connected_components, n_leaves, parents = ward_tree(X)
print("Children:", children)
print("Number of connected components:", n_connected_components)
print("Number of leaves:", n_leaves)
print("Parents:", parents)
在这个示例中,首先导入了numpy库和sklearn.cluster模块中的ward_tree函数。然后,创建了一个包含12个样本的特征矩阵X。接下来,调用ward_tree函数并传入X,得到children、n_connected_components、n_leaves和parents的值。最后,打印出这些值。
Ward聚类算法在处理具有复杂结构的数据时非常有用,例如图像、文本或网络数据。通过最小化簇内方差,该算法能够发现数据中的自然聚类结构。此外,通过指定connectivity矩阵,算法还可以考虑数据的拓扑结构,从而提高聚类效果。