恐怕我缺少明显的东西,但是我看不到我在做什么错。如果有人可以帮助我找到它,那就太好了。
这是我从这里开始的完整对称距离矩阵:
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个点生成坐标,以使由这些坐标得出的(欧几里得)距离矩阵尽可能接近我的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功能做错了。
谢谢!
<< [EDIT发现的数据可能不一致
问题可能是根据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(A-B)= 1,我可以表示为2-1 = 1维,即在一条线上,将A放在(x = 0)中,将B放在(x = 1)中。
然后,我引入第三个点C,并指出d(A-C)= 2。我有3分,所以我需要3-1 = 2维。d(A-C)给出的约束是:
((xC-0)^ 2 +(yC-0)^ 2 = d(A-C)^ 2 = 4。
即C可以在以A为中心的半径2的圆周上的任何位置。这将xC和yC都限制在[-2,2]中。
而且它也限制了d(B-C)的可能值,因为:
d(B-C)^ 2 =(xC-1)^ 2 +(yC-0)^ 2
因此,通过替换(yC-0)^ 2项:
d(B-C)^ 2 =(xC-1)^ 2 + 4-(xC-0)^ 2 = -2 * xC + 5
因此d(B-C)^ 2绑定到[-2 *(+ 2)+ 5,-2 *(-2)+5] = [1,9]。
因此,如果我的距离矩阵在[1,3]之外的任何地方都具有A-B = 1,A-C = 2和B-C,它将配置为不对应于欧几里得空间中3个点的系统。
至少,我希望这是有道理的。
所以我想我原来的问题必须撤销。我以为我会将推理留在这里,以备将来参考,或者是否有其他人也有同样的疑问。
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)