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 演算法可以歸納為以下步驟

  1. 設定一個初始起始組態,隨機與否。

  2. 計算壓力

  3. 計算 Guttman 轉換

  4. 重複步驟 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=Truemetric=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...)