谱嵌入算法,也称为Laplacian Eigenmaps,是一种基于图拉普拉斯矩阵的特征向量进行数据降维的方法。该算法通过计算图的邻接矩阵来得到一个归一化的图拉普拉斯矩阵,其谱(尤其是与最小特征值相关联的特征向量)可以解释为将图分割成大小相近的组件所需的最小切割次数。这种嵌入方法不仅适用于图的邻接矩阵,还可以更一般地应用于样本之间的亲和性或相似性矩阵,例如欧几里得距离矩阵的热核或k-NN矩阵。但需要注意的是,必须始终确保亲和性矩阵是对称的,以便特征向量分解能够按预期工作。
在实际应用中,谱嵌入算法通常用于处理具有单一连通分量的图。如果图具有许多组件,那么前几个特征向量将简单地揭示图的连通分量。此外,谱嵌入算法的实现还包括了对拉普拉斯矩阵的特征值分解策略的选择,例如使用'arpack'、'lobpcg'或'amg'等不同的策略。其中,'amg'策略需要安装pyamg库,它可以在非常大的稀疏问题上更快,但也可能引起不稳定性。如果未指定,则默认使用'arpack'策略。
在进行特征值分解时,还可以设置一个用于控制分解过程停止条件的阈值参数eigen_tol。如果设置为'auto',则根据所选的特征值分解策略,该阈值将自动确定。例如,如果使用'arpack'策略,则eigen_tol默认为0.0;如果使用'lobpcg'或'amg'策略,则eigen_tol为None,这会配置底层的lobpcg求解器根据其启发式自动确定该值。需要注意的是,当使用'amg'策略时,tol值小于1e-5可能会导致收敛问题,因此应避免使用过小的值。
谱嵌入算法的另一个重要参数是norm_laplacian,它决定了是否计算对称归一化的拉普拉斯矩阵。默认情况下,该参数设置为True。此外,还有一个参数drop_first,它决定了是否丢弃第一个特征向量。对于谱嵌入,这应该设置为True,因为对于连通图,第一个特征向量应该是一个常数向量;但对于谱聚类,应保持为False以保留第一个特征向量。
谱嵌入算法的输出是一个降维后的样本数组,其形状为(n_samples, n_components)。这种降维方法在数据可视化和聚类分析等领域有着广泛的应用。通过谱嵌入,可以在低维空间中捕捉到高维数据的内在结构,从而更好地理解和分析数据。
代码示例
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
... )
affinity_matrix = 0.5 * (affinity_matrix + affinity_matrix.T)
embedding = spectral_embedding(
affinity_matrix, n_components=2, random_state=42
)
print(embedding.shape) # 输出: (100, 2)