smacof#
- sklearn.manifold.smacof(dissimilarities, *, metric=True, n_components=2, init=None, n_init=8, n_jobs=None, max_iter=300, verbose=0, eps=0.001, random_state=None, return_n_iter=False, normalized_stress='auto')[原始碼]#
使用 SMACOF 演算法計算多維尺度分析。
SMACOF(以主要化複雜函數進行縮放)演算法是一種多維尺度分析演算法,它使用主要化技術最小化目標函數(壓力)。壓力主要化,也稱為 Guttman 轉換,保證了壓力的單調收斂,並且比梯度下降等傳統技術更強大。
度量 MDS 的 SMACOF 演算法可以歸納為以下步驟
設定一個初始起始組態,隨機與否。
計算壓力
計算 Guttman 轉換
重複步驟 2 和 3 直到收斂。
非度量演算法在計算壓力之前增加了一個單調回歸步驟。
- 參數:
- dissimilarities類陣列,形狀為 (n_samples, n_samples)
點之間的成對相異度。必須是對稱的。
- metricbool,預設值=True
計算度量或非度量 SMACOF 演算法。當
False
(即非度量 MDS)時,相異度為 0 的值會被視為遺失值。- n_componentsint,預設值=2
用於嵌入相異度的維度數量。如果提供
init
陣列,則會覆寫此選項,並使用init
的形狀來決定嵌入空間的維度。- init類陣列,形狀為 (n_samples, n_components),預設值=None
用於初始化演算法的嵌入起始組態。預設情況下,演算法會使用隨機選擇的陣列進行初始化。
- n_initint,預設值=8
SMACOF 演算法將以不同的初始化執行的次數。最終結果將是執行次數的最佳輸出,由最終壓力最小的執行次數決定。如果提供
init
,則會覆寫此選項並執行單次執行。- n_jobsint,預設值=None
用於計算的並行工作數量。如果使用多個初始化 (
n_init
),則會並行計算演算法的每個執行次數。None
表示 1,除非在joblib.parallel_backend
環境中。-1
表示使用所有處理器。有關更多詳細資訊,請參閱詞彙表。- max_iterint,預設值=300
單次執行中 SMACOF 演算法的最大迭代次數。
- verboseint,預設值=0
詳細程度。
- epsfloat,預設值=1e-3
相對於壓力宣告收斂的相對容差。應該根據是否使用
normalized_stress
來單獨調整eps
的值。- random_stateint、RandomState 實例或 None,預設值=None
決定用於初始化中心的亂數產生器。傳遞一個 int 以便在多個函數呼叫中獲得可重複的結果。請參閱詞彙表。
- return_n_iterbool,預設值=False
是否要傳回迭代次數。
- normalized_stressbool 或 “auto”,預設值=”auto”
是否使用並傳回標準化的壓力值(壓力 - 1),而不是預設計算的原始壓力。僅在非度量 MDS 中支援。
在 1.2 版本中加入。
在 1.4 版本中變更: 預設值在 1.4 版本中從
False
變更為"auto"
。
- 傳回值:
- Xndarray,形狀為 (n_samples, n_components)
點在
n_components
空間中的座標。- stressfloat
壓力的最終值(所有受限點的視差和距離的平方距離總和)。如果
normalized_stress=True
且metric=False
,則傳回壓力 - 1。值 0 表示「完美」擬合,0.025 表示優秀,0.05 表示良好,0.1 表示普通,0.2 表示差 [1]。- n_iterint
對應於最佳壓力的迭代次數。只有在
return_n_iter
設定為True
時才會傳回。
參考文獻
[1]「非度量多維尺度分析:一種數值方法」Kruskal, J. Psychometrika, 29 (1964)
[2]「通過最佳化對非度量假設的擬合優度進行多維尺度分析」Kruskal, J. Psychometrika, 29, (1964)
[3]「現代多維尺度分析 - 理論與應用」Borg, I.; Groenen P. Springer Series in Statistics (1997)
範例
>>> import numpy as np >>> from sklearn.manifold import smacof >>> from sklearn.metrics import euclidean_distances >>> X = np.array([[0, 1, 2], [1, 0, 3],[2, 3, 0]]) >>> dissimilarities = euclidean_distances(X) >>> mds_result, stress = smacof(dissimilarities, n_components=2, random_state=42) >>> mds_result array([[ 0.05... -1.07... ], [ 1.74..., -0.75...], [-1.79..., 1.83...]]) >>> stress np.float64(0.0012...)