spectral_embedding#

sklearn.manifold.spectral_embedding(adjacency, *, n_components=8, eigen_solver=None, random_state=None, eigen_tol='auto', norm_laplacian=True, drop_first=True)[源码]#

将样本投影到图拉普拉斯矩阵的前几个特征向量上。

邻接矩阵用于计算归一化图拉普拉斯矩阵,其谱(特别是与最小特征值相关的特征向量)在将图分割成大小相近的连通分量所需的最小割数量方面具有解释性。

即使 adjacency 变量并非严格意义上的图的邻接矩阵,而更普遍地是样本间的亲和或相似性矩阵(例如欧几里得距离矩阵的热核或 k-NN 矩阵),此嵌入方法也能“奏效”。

然而,必须注意始终使亲和矩阵对称,以便特征向量分解按预期工作。

注意:拉普拉斯特征图(Laplacian Eigenmaps)是此处实际实现的算法。

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

参数
adjacency{类数组,稀疏图},形状为 (n_samples, n_samples)

要嵌入的图的邻接矩阵。

n_components整型,默认值=8

投影子空间的维度。

eigen_solver{‘arpack’,‘lobpcg’,‘amg’},默认值=None

要使用的特征值分解策略。AMG 需要安装 pyamg。它在非常大的稀疏问题上可能更快,但也可能导致不稳定。如果为 None,则使用 'arpack'

random_state整型,RandomState 实例或 None,默认值=None

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

注意

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

eigen_tol浮点型,默认值=”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_laplacian布尔型,默认值=True

如果为 True,则计算对称归一化拉普拉斯矩阵。

drop_first布尔型,默认值=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)