恐怕我遗漏了一些明显的东西,但我看不出我做错了什么。
如果有人可以帮我找到它,请,它会很棒。
这是我开始的完整的对称距离矩阵:
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 个点的系统。
至少,我希望这是有道理的。
所以我想我原来的问题必须被撤销。
我想我会把推理留在这里以供将来参考,或者其他人是否应该有同样的疑问。