譜嵌入#
- 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)