我正在尝试实现本文中的算法,这需要使用 MDS。更具体地说,它直接指定了 Shepard-Kruskal 算法的用法,并引用了 Kruskal 关于非度量 MDS 的论文。这当然似乎暗示了非度量 MDS 的使用。
我的大部分困惑源于“距离”和“相异”这两个术语的看似不一致的用法,它们通常实际上暗示着同一件事。我的理解是,我的全维点之间的距离实际上X
是MDS.fit_transform()
. 但是,in 的init
论点fit.transform()
在其用法上并不明确。更具体地说,它声明它是起始配置(这当然是有道理的),但它定义了(n_samples,)
对我来说没有意义的维度。我确实进一步查看了源代码本身,发现smacof()
( smacof ),MDS 实际上将数据传递给的函数,指定了输入维度init
作为(n_samples,n_components)。这可以解释为什么到目前为止,当我将 2D 数组交给它时,我的实现并没有中断。
假设我已经正确完成了所有准备工作,那么我在“Structuring Autoencoders”论文中实现算法的方式如下,
z = a_sae.predict(scaled_sae_aData)[1]
while convergence > conv_limit and niter < max_iter:
z_star[:,:] = mds.fit_transform(dist_mat,init=z)
s,u,v = np.linalg.svd( np.dot(z,np.linalg.pinv(z_star)))
s[ s > 0 ] = 1. #### The algorithm block in the paper specifies >=0, but the text states >0
r = np.dot(u,np.dot(np.diag(s),v))
z_tilda[:,:] = np.dot(r,z_star)
a_sae.fit(scaled_sae_aData,[scaled_sae_aData,z_tilda],epochs=n_epochs,batch_size=batch_size)
#### this is the tensorflow model training function
test,z[:,:] = a_sae.predict(scaled_sae_aData)
test[:,:] = descale(test)
convergence = np.percentile( np.abs((sae_aData-test)/sae_aData),75)
niter += 1
我是否错误地实施了sklearn MDS()
?我是否正确理解了算法?
克鲁斯卡尔的论文:
“非度量多维标度:一种数值方法”Kruskal, J. Psychometrika, 29 (1964)”
“通过优化非度量假设的拟合优度来进行多维缩放”Kruskal, J. Psychometrika, 29, (1964)”