譜嵌入#

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 矩陣的熱核),此嵌入也可以「運作」。

但是,必須小心始終使親和力矩陣對稱,以便特徵向量分解按預期工作。

注意:拉普拉斯特徵圖是此處實作的實際演算法。

請在使用者指南中閱讀更多內容。

參數:
adjacency形狀為 (n_samples, n_samples) 的 {類陣列、稀疏圖}

要嵌入的圖的鄰接矩陣。

n_componentsint,預設值為 8

投影子空間的維度。

eigen_solver{‘arpack’, ‘lobpcg’, ‘amg’}, 預設值=None

所使用的特徵值分解策略。AMG 需要安裝 pyamg。它在非常大型的稀疏問題上可能更快,但也可能導致不穩定。如果為 None,則使用 'arpack'

random_stateint、RandomState 實例或 None,預設值=None

用於初始化 lobpcg 特徵向量分解的偽隨機數產生器,當 eigen_solver == 'amg' 時,以及用於 K-Means 初始化。使用整數可以使結果在多次呼叫之間具有確定性(請參閱詞彙表)。

注意

當使用 eigen_solver == 'amg' 時,也必須使用 np.random.seed(int) 來固定全域 numpy 種子,以獲得確定性結果。請參閱 pyamg/pyamg#139 以取得更多資訊。

eigen_tolfloat,預設值="auto"

Laplacian 矩陣特徵值分解的停止準則。如果 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,則計算對稱正規化 Laplacian。

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)