将新点投影到 MDS 空间中

机器算法验证 r 多维尺度
2022-03-20 02:06:59

我正在尝试将一个新点投影A(x, y, z)R. 这是我到目前为止所拥有的:

set.seed(1)
x <- matrix(rnorm(3*10), ncol = 3)
DM <- dist(x) 
MDS <- cmdscale(DM)

# New data point to be projected
A <- c(1, 2, 3)

我不A直接包括x然后拟合 MDS,因为它会影响空间坐标。有切实可行的解决方案吗?


编辑
我相信我通过估计 beta 来预测 MDS 轴找到了解决方案:

x1 <- cbind(1, x) # add intercept
B <- solve(t(x1) %*% x1) %*% t(x1) %*% MDS # Betas

> MDS
             [,1]        [,2]
 [1,] -1.80789362  0.06801597
 [2,] -0.64418055 -0.21163109
 [3,]  0.04694820 -1.27040928
 [4,]  3.39617277 -0.21657115
 [5,] -0.96981358  0.46269025
 [6,] -0.24716695 -0.79861234
 [7,]  0.33620625  0.02618564
 [8,]  0.62473570  1.35544267
 [9,]  0.01895042  0.80023822
[10,] -0.75395865 -0.21534889

> x1 %*% B # same as MDS
             [,1]        [,2]
 [1,] -1.80789362  0.06801597
 [2,] -0.64418055 -0.21163109
 [3,]  0.04694820 -1.27040928
 [4,]  3.39617277 -0.21657115
 [5,] -0.96981358  0.46269025
 [6,] -0.24716695 -0.79861234
 [7,]  0.33620625  0.02618564
 [8,]  0.62473570  1.35544267
 [9,]  0.01895042  0.80023822
[10,] -0.75395865 -0.21534889

A <- c(1, 2, 3)
A <- c(1, A) # add intercept

> A %*% B # coordinates of A in the MDS plane
          [,1]      [,2]
[1,] -2.759456 0.5927178

我的程序正确吗?

2个回答

如果您使用欧几里得距离,那么经典 MDS 等效于 PCA,它很容易定义到低维空间的映射,如变形虫所提到的。该站点上应该有各种线程来描述如何执行此操作。否则,De Silva 和 Tenenbaum (2004) 描述了如何为具有任意距离的经典 MDS 执行此映射(请注意,它不适用于 MDS 的非经典变体,例如非度量 MDS,最小化应力标准的变体, ETC。)。他们将此过程称为“基于距离的三角测量”。虽然最初不是这样表述的,但事实证明它是通过使用 Nyström 近似来工作的,这是一种使用较小的子矩阵来近似大矩阵的特征值/特征向量的方法(参见 Platt 2005)。

假设我们有训练点。之间的平方距离存储在矩阵个条目中。我们使用这些距离和经典 MDS 来计算维嵌入。矩阵的每一列包含一个训练点的低维嵌入坐标。表示的伪逆的转置。的组件来计算,而不是从头开始(有关详细信息,请参阅论文)。nij(i,j)Δnkk×nLkLk#LkLkδi表示到所有其他点的平方距离表示列的平均值。iΔniδμ=1ni=1nδi

现在,假设我们想将一个新点映射到低维空间中。计算向量到每个训练点的平方距离。a的低维嵌入坐标由下给出:aδaaa

xa=12Lk#(δaδμ)

参考:

德席尔瓦和特南鲍姆(2004 年)使用地标点的稀疏多维缩放。

普拉特(2005 年)FastMap、MetricMap 和 Landmark MDS 都是 Nystrom 算法。

根据变形虫的评论,如果使用欧几里德距离作为 MDS ,R 中的另一个实用解决方案是使用 thestats::prcomp()及其相关方法:predict()

set.seed(1)
x <- matrix(rnorm(3*10), ncol = 3)

# New data point to be projected
A <- c(1, 2, 3)

> predict(prcomp(x, rank. = 2), matrix(A, nrow = 1))
           PC1        PC2
[1,] -2.759456 -0.5927178