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)[source]#
将聚类应用于归一化拉普拉斯算子的投影。
在实践中,当单个簇的结构高度非凸,或更一般地,当簇的中心和扩散度量不足以描述完整簇时,谱聚类非常有用。例如,当簇是二维平面上的嵌套圆时。
如果 `affinity` 是图的邻接矩阵,此方法可用于查找归一化图割 [1], [2]。
在用户指南中了解更多。
- 参数:
- affinity{类数组, 稀疏矩阵},形状 (n_samples, n_samples)
描述样本嵌入关系的亲和矩阵。必须是对称的。
- 可能包括
图的邻接矩阵,
样本对距离矩阵的热核,
样本的对称 k 最近邻连接矩阵。
- n_clusters整型,默认=None
要提取的簇数量。
- n_components整型,默认=n_clusters
用于谱嵌入的特征向量数量。
- eigen_solver{None, ‘arpack’, ‘lobpcg’, 或 ‘amg’}
特征值分解方法。如果为 None,则使用
'arpack'
。有关'lobpcg'
的更多详细信息,请参阅 [4]。特征求解器'amg'
运行带有可选代数多重网格预处理的'lobpcg'
,并且需要安装 pyamg。它在非常大的稀疏问题上可能更快 [6] 和 [7]。- random_state整型,RandomState 实例,默认=None
一个伪随机数生成器,用于当
eigen_solver == 'amg'
时 `lobpcg` 特征向量分解的初始化,以及 K-Means 的初始化。使用一个整型值可使结果在多次调用中保持确定性(参见术语表)。注意
当使用
eigen_solver == 'amg'
时,还需要使用np.random.seed(int)
固定全局 numpy 种子以获得确定性结果。有关更多信息,请参阅 pyamg/pyamg#139。- n_init整型,默认=10
K-Means 算法将使用不同质心种子运行的次数。最终结果将是 `n_init` 次连续运行中惯性最佳的输出。仅当
assign_labels='kmeans'
时使用。- eigen_tol浮点型,默认=”auto”
拉普拉斯矩阵特征分解的停止准则。如果
eigen_tol="auto"
,则传入的容差将取决于eigen_solver
。如果
eigen_solver="arpack"
,则eigen_tol=0.0
;如果
eigen_solver="lobpcg"
或eigen_solver="amg"
,则eigen_tol=None
,这会配置底层的scipy.sparse.linalg.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'。
- verbose布尔型,默认=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])