0

恐怕我遗漏了一些明显的东西,但我看不出我做错了什么。
如果有人可以帮我找到它,请,它会很棒。

这是我开始的完整的对称距离矩阵:

d2 <- structure(list(P1 = c(0, 0.1, 0.3, 0.2, 0, 0.1), P2 = c(0.1, 
0, 0.5, 0.7, 1, 0.9), P3 = c(0.3, 0.5, 0, 1, 0.2, 0.3), P4 = c(0.2, 
0.7, 1, 0, 0.2, 0.5), P5 = c(0, 1, 0.2, 0.2, 0, 0.7), P6 = c(0.1, 
0.9, 0.3, 0.5, 0.7, 0)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))

sum(abs(d2-t(d2)))
#[1] 0

我想为相应的 6 个点生成坐标,以便从这些坐标产生的(欧几里德)距离矩阵尽可能接近 my d2.

cmdscale文档中:

n 个点上的一组欧几里得距离最多可以在 n - 1 个维度上精确表示。

我会认为(n-1)/2尺寸就足够了,事实上,当我跑步时cmdscale,如果我去任何比我高的地方,k=3我得到的东西接近 0 对于更高的坐标,甚至是错误消息:

cmdscale(d2,k=3)
#            [,1]        [,2]          [,3]
#[1,] -0.03526127  0.07755701  1.708755e-05
#[2,] -0.50626939  0.31256816 -5.646907e-02
#[3,] -0.26333957 -0.40518119 -6.978213e-02
#[4,]  0.35902238  0.37455879  2.148406e-02
#[5,]  0.33997864 -0.17998635 -2.809260e-01
#[6,]  0.10586921 -0.17951643  3.856760e-01

cmdscale(d2,k=4)
#            [,1]        [,2]          [,3]          [,4]
#[1,] -0.03526127  0.07755701  1.708755e-05 -7.450581e-09
#[2,] -0.50626939  0.31256816 -5.646907e-02 -7.450581e-09
#[3,] -0.26333957 -0.40518119 -6.978213e-02 -7.450581e-09
#[4,]  0.35902238  0.37455879  2.148406e-02 -7.450581e-09
#[5,]  0.33997864 -0.17998635 -2.809260e-01 -7.450581e-09
#[6,]  0.10586921 -0.17951643  3.856760e-01 -7.450581e-09

cmdscale(d2,k=5)
#            [,1]        [,2]          [,3]          [,4]
#[1,] -0.03526127  0.07755701  1.708755e-05 -7.450581e-09
#[2,] -0.50626939  0.31256816 -5.646907e-02 -7.450581e-09
#[3,] -0.26333957 -0.40518119 -6.978213e-02 -7.450581e-09
#[4,]  0.35902238  0.37455879  2.148406e-02 -7.450581e-09
#[5,]  0.33997864 -0.17998635 -2.809260e-01 -7.450581e-09
#[6,]  0.10586921 -0.17951643  3.856760e-01 -7.450581e-09
#Warning message:
#In cmdscale(d2, k = 5) : only 4 of the first 5 eigenvalues are > 0

因此,假设k=3这就足够了,当我尝试反转操作时会发生这种情况:

dd <- dist(cmdscale(d2,k=3),diag = T,upper = T)
dd
#          1         2         3         4         5         6
#1 0.0000000 0.5294049 0.5384495 0.4940956 0.5348482 0.4844970
#2 0.5294049 0.0000000 0.7578630 0.8710048 1.0045529 0.9013064
#3 0.5384495 0.7578630 0.0000000 1.0018275 0.6777074 0.6282371
#4 0.4940956 0.8710048 1.0018275 0.0000000 0.6319294 0.7097335
#5 0.5348482 1.0045529 0.6777074 0.6319294 0.0000000 0.7065166
#6 0.4844970 0.9013064 0.6282371 0.7097335 0.7065166 0.0000000

这与我的预期完全不同:

as.matrix(dd)-d2
#         P1          P2          P3          P4          P5          P6
#1 0.0000000 0.429404930 0.238449457 0.294095619 0.534848178 0.384497043
#2 0.4294049 0.000000000 0.257862963 0.171004810 0.004552925 0.001306386
#3 0.2384495 0.257862963 0.000000000 0.001827507 0.477707386 0.328237091
#4 0.2940956 0.171004810 0.001827507 0.000000000 0.431929428 0.209733518
#5 0.5348482 0.004552925 0.477707386 0.431929428 0.000000000 0.006516573
#6 0.3844970 0.001306386 0.328237091 0.209733518 0.006516573 0.000000000

sum(abs(as.matrix(dd)-d2))
#[1] 7.543948

有谁知道为什么这两个距离矩阵根本不匹配?

我可以尝试构建自己的最小二乘问题来找到坐标,但首先我需要了解我是否对这些开箱即用的 R 功能做错了什么。

谢谢!


编辑发现的数据中可能存在的不一致

问题可能是根据d2第 1 点和第 5 点重合(它们的距离为 0):

as.matrix(d2)
#      P1  P2  P3  P4  P5  P6
#[1,] 0.0 0.1 0.3 0.2 0.0 0.1
#[2,] 0.1 0.0 0.5 0.7 1.0 0.9
#[3,] 0.3 0.5 0.0 1.0 0.2 0.3
#[4,] 0.2 0.7 1.0 0.0 0.2 0.5
#[5,] 0.0 1.0 0.2 0.2 0.0 0.7
#[6,] 0.1 0.9 0.3 0.5 0.7 0.0

但是这两个点与其他点的距离不同,例如 d(1-2) 是 0.1 而 d(5-2) 是 1?

替换两个 0 似乎无济于事:

d3 <- d2
d3[1,5] <- 0.2
d3[5,1] <- 0.2
dd3 <- cmdscale(as.matrix(d3),k=3)
sum(abs(as.matrix(dist(dd3))-as.matrix(d3)))
#[1] 7.168348

这是否可能表明并非所有距离矩阵都可以简化为一组完全一致的点,无论使用多少维?


编辑最后一个问题的 2 个可能答案。

我怀疑答案是肯定的。而且我在维度的数量上是错误的,我现在明白了为什么你需要N-1而不是一半。

如果我的距离 d(AB) = 1,我可以用 2-1 = 1 维(x 轴)表示,即在一条线上,将 A 放在 (xA=0) 中,将 B 放在 (xB=1) 中。

然后我介绍第三个点 C 并声明 d(AC) = 2。
我有 3 个点,所以我需要 3-1 = 2 个维度(xy 平面)。
d(AC) 给出的约束是:

(xC - 0)^2 + (yC - 0)^2 = d(AC)^2 = 4。

即 C 可以位于以 A 为中心的半径为 2 的圆周上的任何位置。
这将 xC 和 yC 都限制在 [-2,2] 中。

但是,以前我没有考虑过这也会限制 d(BC) 的可能值,因为:

d(BC)^2 = (xC - 1)^2 + (yC - 0)^2

因此,通过替换 (yC - 0)^2 项:

d(BC)^2 = (xC - 1)^2 + 4 - (xC - 0)^2 = -2*xC + 5

d(BC)^2 因此绑定到 [-2*(+2)+5,-2*(-2)+5] = [1,9]。

因此,如果我的距离矩阵在 [1,3] 之外的任何位置包含 d(AB) = 1、d(AC) = 2 和 d(BC),它将配置一个不对应于欧几里得空间中的 3 个点的系统。

至少,我希望这是有道理的。

所以我想我原来的问题必须被撤销。
我想我会把推理留在这里以供将来参考,或者其他人是否应该有同样的疑问。

4

1 回答 1

0

多维缩放为指定的维数创建坐标,以便它们尽可能接近地表示原始矩阵中的距离。但距离将处于不同的尺度。在您的示例中,d3是原始距离矩阵,dd3是坐标矩阵,并且dist(dd3)是与重建坐标的距离矩阵。这些值不同,但它们反映了点之间的相同关系:

d3.v <- as.vector(as.dist(d3))  # Vector of original distances
dd3.v <- as.vector(dist(dd3))   # Vector of distances computed from coordinates
cor(d3.v, dd3.v)
# [1] 0.9433903
plot(d3.v, dd3.v, pch=16)

阴谋

于 2019-11-12T23:05:07.990 回答