谱嵌入#
- sklearn.manifold.spectral_embedding(adjacency, *, n_components=8, eigen_solver=None, random_state=None, eigen_tol='auto', norm_laplacian=True, drop_first=True)[source]#
将样本投影到图拉普拉斯算子的前几个特征向量上。
邻接矩阵用于计算归一化图拉普拉斯算子,其谱(特别是与最小特征值相关的特征向量)可以用最少切割次数来解释,这些切割次数将图分割成大小相近的组件。
即使
adjacency
变量不是严格意义上的图的邻接矩阵,而是样本之间的亲和力或相似度矩阵(例如欧几里得距离矩阵的热核或k-NN矩阵),这种嵌入也可以“工作”。但是,必须注意始终使亲和矩阵对称,以便特征向量分解按预期工作。
注意:此处实现的实际算法是拉普拉斯特征映射。
在用户指南中了解更多信息。
- 参数:
- adjacency形状为 (n_samples, n_samples) 的 {数组、稀疏图}
要嵌入的图的邻接矩阵。
- n_componentsint,默认=8
投影子空间的维数。
- eigen_solver{'arpack', 'lobpcg', 'amg'},默认=None
要使用的特征值分解策略。AMG 需要安装 pyamg。在非常大的稀疏问题上,它可能更快,但也可能导致不稳定。如果为 None,则使用
'arpack'
。- random_stateint、RandomState 实例或 None,默认=None
用于在
eigen_solver == 'amg'
时初始化 lobpcg 特征向量分解以及 K 均值初始化的伪随机数生成器。使用 int 可以使结果在调用之间确定性(参见词汇表)。注意
当使用
eigen_solver == 'amg'
时,还需要使用np.random.seed(int)
固定全局 numpy 种子才能获得确定性结果。有关更多信息,请参见 pyamg/pyamg#139。- 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="amg"
时,tol<1e-5
的值可能会导致收敛问题,应避免。1.2 版新增: 添加了“auto”选项。
- norm_laplacianbool,默认=True
如果为 True,则计算对称归一化拉普拉斯算子。
- drop_firstbool,默认=True
是否丢弃第一个特征向量。对于谱嵌入,这应该是 True,因为对于连通图,第一个特征向量应该是常数向量,但是对于谱聚类,这应该保持为 False 以保留第一个特征向量。
- 返回:
- embedding形状为 (n_samples, n_components) 的 ndarray
简化的样本。
备注
当图具有一个连通分量时,谱嵌入(拉普拉斯特征映射)最有用。如果图具有多个分量,则前几个特征向量只会揭示图的连通分量。
参考文献
示例
>>> from sklearn.datasets import load_digits >>> from sklearn.neighbors import kneighbors_graph >>> from sklearn.manifold import spectral_embedding >>> X, _ = load_digits(return_X_y=True) >>> X = X[:100] >>> affinity_matrix = kneighbors_graph( ... X, n_neighbors=int(X.shape[0] / 10), include_self=True ... ) >>> # make the matrix symmetric >>> affinity_matrix = 0.5 * (affinity_matrix + affinity_matrix.T) >>> embedding = spectral_embedding(affinity_matrix, n_components=2, random_state=42) >>> embedding.shape (100, 2)