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 算法可归纳为以下步骤:

  1. 设置初始启动配置,随机或非随机。

  2. 计算应力

  3. 计算 Guttman 变换

  4. 重复步骤 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