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...)