亲和力传播聚类算法是一种基于数据点之间相似度的聚类方法,它不需要预先指定簇的数量,而是通过迭代过程自动确定簇的数量和簇中心。该算法的核心思想是将数据点之间的相似度信息传递给其他数据点,从而找到最佳的簇中心和簇分配。
亲和力传播聚类算法的参数设置对聚类结果有很大影响。以下是一些关键参数的说明:
相似度矩阵(S):这是一个形状为(n_samples, n_samples)的数组,表示数据点之间的相似度。通常,相似度矩阵是通过计算数据点之间的距离得到的,例如使用欧几里得距离。
偏好值(preference):这是一个形状为(n_samples,)的数组或浮点数,表示每个数据点成为簇中心的偏好程度。偏好值较大的数据点更有可能被选为簇中心。如果未指定偏好值,则默认为相似度矩阵的中位数,从而得到一个适中的簇数量。
收敛迭代次数(convergence_iter):这是一个整数,默认值为15。当迭代过程中簇的数量没有变化时,算法会停止迭代。
最大迭代次数(max_iter):这是一个整数,默认值为200。这是算法执行的最大迭代次数。
阻尼因子(damping):这是一个浮点数,默认值为0.5。阻尼因子用于控制算法的收敛速度,其值在0.5到1之间。
复制(copy):这是一个布尔值,默认为True。如果设置为False,则算法会在原地修改相似度矩阵,以节省内存。
详细输出(verbose):这是一个布尔值,默认为False。如果设置为True,则算法会在执行过程中输出详细信息。
返回迭代次数(return_n_iter):这是一个布尔值,默认为False。如果设置为True,则算法会返回执行的迭代次数。
随机状态(random_state):这是一个整数、RandomState实例或None,默认为None。用于控制算法的随机性,以确保结果的可重复性。
亲和力传播聚类算法返回以下值:
簇中心索引(cluster_centers_indices):这是一个形状为(n_clusters,)的数组,表示簇中心的索引。
簇标签(labels):这是一个形状为(n_samples,)的数组,表示每个数据点所属的簇。
迭代次数(n_iter):这是一个整数,表示算法执行的迭代次数。只有当return_n_iter参数设置为True时才会返回这个值。
以下是一个使用亲和力传播聚类算法的示例代码:
import numpy as np
from sklearn.cluster import affinity_propagation
from sklearn.metrics.pairwise import euclidean_distances
# 生成示例数据
X = np.array([
[1, 2],
[1, 4],
[1, 0],
[4, 2],
[4, 4],
[4, 0]
])
# 计算相似度矩阵
S = -euclidean_distances(X, squared=True)
# 执行亲和力传播聚类
cluster_centers_indices, labels = affinity_propagation(S, random_state=0)
print("簇中心索引:", cluster_centers_indices)
print("簇标签:", labels)
在这个示例中,首先生成了一个包含6个数据点的示例数据集。然后,计算了数据点之间的相似度矩阵。接下来,使用亲和力传播聚类算法对数据进行聚类,并输出了簇中心的索引和每个数据点所属的簇。
当算法没有收敛时,即使返回了簇中心索引和簇标签,这些结果也可能是退化的,需要谨慎使用。当所有训练样本具有相同的相似度和偏好值时,簇中心和标签的分配取决于偏好值。如果偏好值小于相似度,则会返回一个簇中心和标签0给每个样本。否则,每个训练样本都成为自己的簇中心,并被分配一个唯一的标签。
Brendan J. Frey and Delbert Dueck, “Clustering by Passing Messages Between Data Points”, Science Feb. 2007