R中cmdscale的意外结果

问题描述 投票:0回答:1

恐怕我缺少明显的东西,但是我看不到我在做什么错。如果有人可以帮助我找到它,那就太好了。

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

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个点的系统。

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

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

r multi-dimensional-scaling
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)

Plot
© www.soinside.com 2019 - 2024. All rights reserved.