spectral_clustering#
- sklearn.cluster.spectral_clustering(affinity, *, n_clusters=8, n_components=None, eigen_solver=None, random_state=None, n_init=10, eigen_tol='auto', assign_labels='kmeans', verbose=False)[原始碼]#
將群集應用於正規化拉普拉斯矩陣的投影。
實務上,當個別群集的結構高度非凸時,或更廣泛地說,當群集的中心和分散程度的量測不適合完整描述群集時,頻譜群集非常有用。例如,當群集是 2D 平面上巢狀的圓時。
如果 affinity 是圖的鄰接矩陣,則此方法可用於尋找正規化圖分割 [1]、[2]。
在使用者指南中閱讀更多內容。
- 參數:
- affinity形狀為 (n_samples, n_samples) 的類陣列、稀疏矩陣
描述要嵌入的樣本關係的親和力矩陣。必須是對稱的。
- 可能的範例
圖的鄰接矩陣,
樣本的成對距離矩陣的熱核,
樣本的對稱 k 最近鄰連通性矩陣。
- n_clustersint,預設值為 None
要提取的群集數量。
- n_componentsint,預設值為 n_clusters
用於頻譜嵌入的特徵向量數量。
- eigen_solver{None、'arpack'、'lobpcg' 或 'amg'}
特徵值分解方法。如果為 None,則使用
'arpack'
。有關'lobpcg'
的更多詳細資訊,請參閱 [4]。Eigensolver'amg'
使用選用的代數多重網格預處理執行'lobpcg'
,並且需要安裝 pyamg。在非常大的稀疏問題上,它可以更快 [6] 和 [7]。- random_stateint、RandomState 執行個體,預設值為 None
用於初始化 lobpcg 特徵向量分解(當
eigen_solver == 'amg'
時)以及 K-Means 初始化的虛擬隨機數產生器。使用 int 以使結果在不同呼叫中具有決定性(請參閱詞彙表)。注意事項
當使用
eigen_solver == 'amg'
時,也必須使用np.random.seed(int)
固定全域 numpy 種子,以取得具決定性的結果。有關更多資訊,請參閱 pyamg/pyamg#139。- n_initint,預設值為 10
k-means 演算法將使用不同的質心種子執行的次數。最終結果將是 n_init 次連續執行的最佳輸出(以慣性表示)。僅在
assign_labels='kmeans'
時使用。- 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="lobpcg"
或eigen_solver="amg"
時,tol<1e-5
的值可能會導致收斂問題,應避免使用。在 1.2 版中新增:新增了 'auto' 選項。
- assign_labels{'kmeans'、'discretize'、'cluster_qr'},預設值為 'kmeans'
用於在嵌入空間中指派標籤的策略。在拉普拉斯嵌入之後,有三種方法可以指派標籤。可以應用 k-means,這是一個常見的選擇。但是,它也可能對初始化很敏感。離散化是另一種方法,它對隨機初始化的敏感度較低 [3]。cluster_qr 方法 [5] 直接從頻譜群集中的特徵向量提取群集。與 k-means 和離散化相比,cluster_qr 沒有調整參數,也不是迭代方法,但在品質和速度方面都可能勝過 k-means 和離散化。如需群集策略的詳細比較,請參閱以下範例:將希臘硬幣的圖片分割成區域。
在 1.1 版中變更:新增了新的標記方法 'cluster_qr'。
- verbosebool,預設值為 False
詳細模式。
在 0.24 版中新增。
- 傳回值:
- labels整數陣列,形狀:n_samples
群集的標籤。
注意事項
圖形應僅包含一個連通元件,否則結果沒有意義。
此演算法會針對
k=2
求解正規化切割:它是一種正規化頻譜群集。參考文獻
[4]範例
>>> import numpy as np >>> from sklearn.metrics.pairwise import pairwise_kernels >>> from sklearn.cluster import spectral_clustering >>> X = np.array([[1, 1], [2, 1], [1, 0], ... [4, 7], [3, 5], [3, 6]]) >>> affinity = pairwise_kernels(X, metric='rbf') >>> spectral_clustering( ... affinity=affinity, n_clusters=2, assign_labels="discretize", random_state=0 ... ) array([1, 1, 1, 0, 0, 0])