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算法可以概括为以下步骤: - 设置初始起始配置,随机或非随机。 
- 计算应力。 
- 计算古特曼变换。 
- 迭代步骤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...) 
