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 求解正規化切割:它是一種正規化頻譜群集。

參考文獻

範例

>>> 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])