谱聚类是一种基于图论的聚类方法,它在处理具有非凸结构的簇时表现出色。当簇的形状复杂或中心和扩散度量不足以描述整个簇时,谱聚类方法尤其有用。例如,在二维平面上,簇可能是嵌套的圆圈。如果亲和矩阵是图的邻接矩阵,这种方法可以用来找到归一化的图切割。
谱聚类的实现依赖于对归一化拉普拉斯矩阵的特征分解。在实际应用中,这种方法可以有效地解决非凸形状的簇识别问题。例如,当簇的形状复杂或中心和扩散度量不足以描述整个簇时,谱聚类方法尤其有用。
谱聚类的参数设置非常关键,包括亲和矩阵、簇的数量、特征向量的数量、特征值分解方法、随机状态、初始化次数、特征分解的停止准则、标签分配策略和详细模式。这些参数共同决定了谱聚类算法的性能和结果。
亲和矩阵描述了样本之间的关系,必须是对称的。可能的例子包括图的邻接矩阵、样本对之间的距离矩阵的热核、样本的对称k最近邻连接矩阵等。
在谱聚类中,特征值分解方法的选择对于算法的性能至关重要。如果设置为None,则默认使用'arpack'方法。其他可选的方法包括'lobpcg'和'amg'。'amg'方法在非常大的稀疏问题上可能更快,但它需要安装pyamg库。
随机状态参数用于初始化'lobpcg'特征向量分解和K-Means初始化。使用整数可以确保跨调用的结果可确定性。在使用'amg'作为特征值分解方法时,还需要固定全局numpy种子以获得可确定的结果。
n_init参数指定了K-Means算法将使用不同的质心种子运行的次数。最终结果将是n_init连续运行中惯性最好的输出。这个参数仅在assign_labels参数设置为'kmeans'时使用。
eigen_tol参数是拉普拉斯矩阵特征分解的停止准则。如果设置为'auto',则根据使用的特征值分解方法,传递的容忍度将有所不同。例如,如果使用'arpack',则eigen_tol=0.0;如果使用'lobpcg'或'amg',则eigen_tol=None,这将配置底层的lobpcg求解器根据其启发式自动解决值。
assign_labels参数决定了在嵌入空间中分配标签的策略。有三种方法可以在拉普拉斯嵌入后分配标签:k-means、离散化和cluster_qr。k-means是一个流行的选择,但可能对初始化敏感。离散化是另一种方法,它对随机初始化不太敏感。cluster_qr方法直接从特征向量中提取簇,与k-means和离散化相比,cluster_qr没有调整参数,并且不是迭代方法,但在质量和速度方面可能优于k-means和离散化。
详细模式参数用于控制算法的详细输出。
谱聚类算法的输出是样本的簇标签。需要注意的是,图应该只包含一个连通分量,否则结果可能没有意义。这个算法解决了k=2的归一化切割问题:它是一种归一化的谱聚类。
import numpy as np
from sklearn.metrics.pairwise import pairwise_kernels
from sklearn.cluster import spectral_clustering
X = np.array([[1, 1], [2, 1], [1, 0], [4, 7], [3, 5], [3, 6]])
affinity = pairwise_kernels(X, metric='rbf')
labels = spectral_clustering(affinity=affinity, n_clusters=2, assign_labels="discretize", random_state=0)
print(labels)
以上代码展示了如何使用谱聚类算法对一组数据进行聚类。首先,创建了一个数据集X,并计算了其RBF核的亲和矩阵。然后,使用谱聚类函数对数据进行聚类,并将结果打印出来。
谱聚类算法在图像分割等领域有着广泛的应用。例如,它可以用于将希腊硬币的图片分割成不同的区域。通过谱聚类,可以有效地识别出图像中的不同对象,从而实现图像的分割。