谱聚类#

sklearn.cluster.spectral_clustering(affinity, *, n_clusters=8, n_components=None, eigen_solver=None, random_state=None, n_init=10, eigen_tol='auto', assign_labels='kmeans', verbose=False)[source]#

对归一化拉普拉斯算子的投影应用聚类。

在实践中,当各个聚类的结构高度非凸,或者更普遍地,当聚类的中心和扩展的度量不能充分描述整个聚类时,谱聚类非常有用。例如,当聚类是二维平面上的嵌套圆圈时。

如果 affinity 是图的邻接矩阵,则可以使用此方法查找归一化图割 [1], [2]

用户指南 中了解更多信息。

参数:
affinity形状为 (n_samples, n_samples) 的 {类数组,稀疏矩阵}

描述要嵌入的样本关系的亲和矩阵。必须是对称的

可能的示例
  • 图的邻接矩阵,

  • 样本的成对距离矩阵的热核,

  • 样本的对称 k 近邻连接矩阵。

n_clustersint,默认值=None

要提取的集群数。

n_componentsint,默认值=n_clusters

用于谱嵌入的特征向量数。

eigen_solver{None, ‘arpack’,‘lobpcg’ 或 ‘amg’}

特征值分解方法。如果为 None,则使用 'arpack'。有关 'lobpcg' 的更多详细信息,请参见 [4]。特征求解器 'amg' 运行带有可选代数多重网格预处理的 'lobpcg',并需要安装 pyamg。在非常大的稀疏问题上,它可能更快 [6][7]

random_stateint,RandomState 实例,默认值=None

用于在 eigen_solver == 'amg' 时初始化 lobpcg 特征向量分解以及 K 均值初始化的伪随机数生成器。使用整数可以使结果在多次调用中保持确定性(参见 词汇表)。

注意

使用 eigen_solver == 'amg' 时,需要使用 np.random.seed(int) 固定全局 numpy 种子才能获得确定性结果。有关更多信息,请参见 pyamg/pyamg#139

n_initint,默认值=10

k 均值算法将使用不同的质心种子运行的次数。最终结果将是 n_init 次连续运行中就惯性而言的最佳输出。仅当 assign_labels='kmeans' 时才使用。

eigen_tolfloat,默认值=”auto”

拉普拉斯矩阵特征分解的停止准则。如果 eigen_tol="auto",则传递的容差将取决于 eigen_solver

  • 如果 eigen_solver="arpack",则 eigen_tol=0.0

  • 如果 eigen_solver="lobpcg"eigen_solver="amg",则 eigen_tol=None,这将配置底层的 lobpcg 求解器根据其启发式自动解析该值。详情请参见 scipy.sparse.linalg.lobpcg

请注意,当使用 eigen_solver="lobpcg"eigen_solver="amg" 时,tol<1e-5 的值可能会导致收敛问题,应避免。

版本 1.2 中新增: 添加了 “auto” 选项。

assign_labels{'kmeans','discretize','cluster_qr'},默认值='kmeans'

在嵌入空间中分配标签的策略。在拉普拉斯嵌入之后,有三种方法可以分配标签。k 均值是一种流行的选择,可以应用。但它也可能对初始化敏感。离散化是另一种不太受随机初始化影响的方法 [3]。cluster_qr 方法 [5] 直接从谱聚类中的特征向量中提取集群。与 k 均值和离散化相比,cluster_qr 没有调整参数,也不是迭代方法,但在质量和速度方面都可能优于 k 均值和离散化。有关聚类策略的详细比较,请参考以下示例: 将希腊硬币图片分割成区域

版本 1.1 中已更改: 添加了新的标记方法 'cluster_qr'。

verbosebool,默认值=False

详细模式。

版本 0.24 中新增。

返回值:
labels整数数组,形状:n_samples

集群的标签。

备注

图应仅包含一个连通分量,否则结果毫无意义。

此算法解决了 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')
>>> spectral_clustering(
...     affinity=affinity, n_clusters=2, assign_labels="discretize", random_state=0
... )
array([1, 1, 1, 0, 0, 0])