spectral_clustering#

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)#

应用聚类到归一化拉普拉斯投影。

在实践中,当单个簇的结构高度非凸或更一般地,当簇的中心和扩展的度量不适合描述完整的簇时,谱聚类非常有用。例如,当簇是嵌套在2D平面上的圆环时。

如果亲和度是图的邻接矩阵,此方法可用于找到归一化的图割 [1], [2]

更多信息请参阅 用户指南

Parameters:
affinity{array-like, sparse matrix} of shape (n_samples, n_samples)

描述样本之间关系的亲和度矩阵。 必须对称

可能的例子:
  • 图的邻接矩阵,

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

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

n_clustersint, default=None

要提取的簇数量。

n_componentsint, default=n_clusters

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

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

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

random_stateint, RandomState instance, default=None

用于初始化lobpcg特征向量分解的伪随机数生成器,当 eigen_solver == 'amg' 时,以及用于K-Means初始化。使用整数使结果在调用之间确定(参见 Glossary )。

Note

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

n_initint, default=10

k-means算法将以不同的质心种子运行多次。最终结果将是n_init次连续运行中惯性最好的输出。仅当 assign_labels='kmeans' 时使用。

eigen_tolfloat, default=”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 的值可能导致收敛问题,应避免。

Added in version 1.2: 添加了’auto’选项。

assign_labels{‘kmeans’, ‘discretize’, ‘cluster_qr’}, default=’kmeans’

在嵌入空间中分配标签的策略。在拉普拉斯嵌入后有三种分配标签的方法。k-means可以应用并且是一个受欢迎的选择。但它也可能对初始化敏感。离散化是另一种对随机初始化不太敏感的方法 [3]。cluster_qr方法 [5] 直接从谱聚类中的特征向量中提取簇。与k-means和离散化相比,cluster_qr没有调优参数,也不是迭代方法,但在质量和速度方面可能优于k-means和离散化。

Changed in version 1.1: 添加了新的标签方法’cluster_qr’。

verbosebool, default=False

详细模式。

Added in version 0.24.

Returns:
labelsarray of integers, shape: n_samples

簇的标签。

Notes

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

该算法解决了 k=2 的归一化割:它是一种归一化谱聚类。

References

Examples

>>> 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])