谱聚类#
- 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
的归一化割:它是一种归一化谱聚类。参考文献
[4]示例
>>> 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])