smacof#
- sklearn.manifold.smacof(dissimilarities, *, metric=True, n_components=2, init=None, n_init='warn', n_jobs=None, max_iter=300, verbose=0, eps=1e-06, random_state=None, return_n_iter=False, normalized_stress='auto')[source]#
使用 SMACOF 算法计算多维尺度变换。
SMACOF(通过主化复杂函数进行尺度变换)算法是一种多维尺度变换算法,它使用主化技术最小化目标函数(*应力*)。应力主化,也称为 Guttman 变换,保证应力单调收敛,并且比梯度下降等传统技术更强大。
用于度量 MDS 的 SMACOF 算法可归纳为以下步骤:
设置初始启动配置,随机或非随机。
计算应力
计算 Guttman 变换
重复步骤 2 和 3 直到收敛。
非度量算法在计算应力之前增加了一个单调回归步骤。
- 参数:
- dissimilarities形状为 (n_samples, n_samples) 的类数组
点之间的成对不相似度。必须是对称的。
- metric布尔型, 默认值为 True
计算度量或非度量 SMACOF 算法。当为
False
(即非度量 MDS)时,不相似度为 0 的值被视为缺失值。- n_components整型, 默认值为 2
嵌入不相似度的维度数量。如果提供了
init
数组,则此选项将被覆盖,并使用init
的形状来确定嵌入空间的维度。- init形状为 (n_samples, n_components) 的类数组, 默认值为 None
用于初始化算法的嵌入的起始配置。默认情况下,算法使用随机选择的数组进行初始化。
- n_init整型, 默认值为 8
SMACOF 算法将以不同初始化运行的次数。最终结果将是运行中的最佳输出,由具有最小最终应力的运行决定。如果提供了
init
,则此选项将被覆盖,并执行单次运行。1.9 版本中已更改:
n_iter
的默认值将在 1.9 版本中从 8 变为 1。- n_jobs整型, 默认值为 None
用于计算的作业数量。如果使用多个初始化(
n_init
),则算法的每次运行都将并行计算。None
表示 1,除非在joblib.parallel_backend
上下文。-1
表示使用所有处理器。有关更多详细信息,请参阅术语表。- max_iter整型, 默认值为 300
SMACOF 算法单次运行的最大迭代次数。
- verbose整型, 默认值为 0
详细程度。
- eps浮点型, 默认值为 1e-6
应力(按嵌入距离平方和归一化)的容差,达到该容差时声明收敛。
1.7 版本中已更改:
eps
的默认值已从 1e-3 更改为 1e-6,这是由于收敛判据计算中的一个错误修复。- random_state整型, RandomState 实例或 None, 默认值为 None
确定用于初始化中心的随机数生成器。传入一个整数可在多次函数调用中获得可重现的结果。请参阅术语表。
- return_n_iter布尔型, 默认值为 False
是否返回迭代次数。
- normalized_stress布尔型 或 “auto”, 默认值为 “auto”
是否返回归一化应力值(Stress-1)而不是原始应力。默认情况下,度量 MDS 返回原始应力,而非度量 MDS 返回归一化应力。
1.2 版本中新增。
1.4 版本中已更改: 默认值在 1.4 版本中从
False
更改为"auto"
。1.7 版本中已更改: 度量 MDS 也支持归一化应力。
- 返回:
- X形状为 (n_samples, n_components) 的 ndarray
点在
n_components
空间中的坐标。- stress浮点型
应力的最终值(所有受约束点的差异和距离的平方距离之和)。如果
normalized_stress=True
,则返回 Stress-1。值为 0 表示“完美”拟合,0.025 表示极佳,0.05 表示良好,0.1 表示一般,0.2 表示差[1]。- n_iter整型
对应于最佳应力的迭代次数。仅当
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) >>> Z, stress = smacof( ... dissimilarities, n_components=2, n_init=1, eps=1e-6, random_state=42 ... ) >>> Z.shape (3, 2) >>> np.round(stress, 6).item() 3.2e-05