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')[source]#

使用SMACOF算法计算多维尺度变换。

SMACOF(通过对复杂函数进行主要化来进行缩放)算法是一种多维尺度变换算法,它使用主要化技术最小化目标函数(应力)。应力主要化,也称为古特曼变换,保证了应力的单调收敛,并且比传统的梯度下降等技术更强大。

度量MDS的SMACOF算法可以概括为以下步骤:

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

  2. 计算应力。

  3. 计算古特曼变换。

  4. 迭代步骤2和3直到收敛。

非度量算法在计算应力之前添加了一个单调回归步骤。

参数:
dissimilaritiesarray-like of shape (n_samples, n_samples)

点之间的成对差异。必须是对称的。

metricbool, default=True

计算度量或非度量SMACOF算法。当False(即非度量MDS)时,差异为0被视为缺失值。

n_componentsint, default=2

将差异嵌入其中的维度数。如果提供了init数组,则此选项将被覆盖,并使用init的形状来确定嵌入空间的维数。

initarray-like of shape (n_samples, n_components), default=None

用于初始化算法的嵌入的起始配置。默认情况下,算法使用随机选择的数组进行初始化。

n_initint, default=8

使用不同初始化运行SMACOF算法的次数。最终结果将是运行的最佳输出,由最终应力最小的运行决定。如果提供了init,则此选项将被覆盖,并且只执行一次运行。

n_jobsint, default=None

用于计算的作业数。如果使用了多个初始化(n_init),则每个算法运行都并行计算。

None 表示 1,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有处理器。更多详情请参见 词汇表

max_iterint, default=300

单次运行SMACOF算法的最大迭代次数。

verboseint, default=0

详细程度。

epsfloat, default=1e-3

关于应力的相对容差,在此容差下声明收敛。根据是否使用normalized_stress,需要分别调整eps的值。

random_stateint, RandomState instance or None, default=None

确定用于初始化中心的随机数生成器。传递一个整数以在多次函数调用中获得可重复的结果。参见 词汇表

return_n_iterbool, default=False

是否返回迭代次数。

normalized_stressbool or “auto” default=”auto”

是否使用并返回归一化应力值(Stress-1)而不是默认计算的原始应力。仅在非度量MDS中受支持。

版本 1.2 中新增。

版本 1.4 中更改: 版本 1.4 中的默认值从 False 更改为 "auto"

返回值:
Xndarray of shape (n_samples, n_components)

n_components空间中点的坐标。

stressfloat

应力的最终值(所有约束点的差异和距离的平方距离之和)。如果normalized_stress=True并且metric=False,则返回Stress-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...)