为什么求解(特征值,特征向量)的cov对于2d和3d矩阵是不同的?

时间:2017-08-27 10:22:46

标签: r

我正在通过使用R命令学习特征值,cov的特征向量,我首先尝试使用2d矩阵,结果似乎正确:

x <- c(60, 35, 74, 30, 80)
y <- c(58, 40, 68, 40, 70)
m <- cbind(x, y)
cv <- cov(m)
eig <- eigen(cv)
det(cv %*% eig$vectors)   # 895.4
det(eig$values * diag(2) %*% eig$vectors)   # 895.4
cv %*% eig$vectors
#        [,1]       [,2]
# x -604.7476  0.6751113
# y -391.0320 -1.0440884
solve(eig$vectors, eig$values*diag(2)) 
#           [,1]       [,2]
# [1,] -604.7476 -0.6751113
# [2,]  391.0320 -1.0440884

然后,我尝试使用3d矩阵:

x <- c(60, 35, 74, 30, 80)
y <- c(58, 40, 68, 40, 70)
z <- c(25, 75, 50, 60, 50)
m <- cbind(x, y, z)
cv <- cov(m)
eig <- eigen(cv)
det(cv %*% eig$vectors)   # -178424.4
det(eig$values * diag(3) %*% eig$vectors)   # -178424.4
cv %*% eig$vectors
#        [,1]      [,2]        [,3]
# x -639.0223  78.10751  0.56623319
# y -416.7254  43.54886 -0.89605389
# z  389.0068 174.95930 -0.02974941
solve(eig$vectors, eig$values*diag(3))
#           [,1]       [,2]        [,3]
# [1,] -639.0223  -95.61750  0.48169216
# [2,]  340.4124   43.54886  0.94419557
# [3,]  457.2808 -166.03865 -0.02974941

我的问题是:为什么“cv%%eig $ vectors”和“solve(eig $ vectors,eig $ values diag(n))”得到2d矩阵相同的数字,但结果3d矩阵的对角线数字是否相同?

1 个答案:

答案 0 :(得分:1)

如果问题中的输出显示,即使在第二种情况下,

cv %% eig$vectorssolve(eig$vectors, eig$valuesdiag(n))也不相等。

第一个等于eig$vectors %*% diag(eig$values),第二个等于t(eig$vectors) %*% diag(eig$values) - 请注意转置。

要查看此内容,请cv展开eig$vectors %*% diag(eig$values) %*% t(eig$vectors)并注意eig$vectors是正交的(因为cv是对称的),因此其转置等于其反转。

注意det(eig $ vectors)是1(它必须是1或-1,因为它是正交的),如果A和B是任何两个适形的矩阵,v是矢量,那么:

  • det(A%*%B)= det(A)* det(B)
  • det(t(A))= det(A)
  • det(diag(v))= prod(v)

所以我们有:

det(cv %*% eig$vectors)
= det(eig$vectors %*% diag(eig$values) %*% t(eig$vectors) %*% eig$vectors)
= det(eig$vectors) * det(diag(eig$values)) * det(t(eig$vectors)) * det(eig$vectors)
= 1 * prod(eig$values) * 1 * 1
= prod(eig$values)

det(eig$values * diag(2) %*% eig$vectors)
= det(diag(eig$values) %*% eig$vectors)
= det(diag(eig$values)) * det(eig$vectors)
= prod(eig$values) * 1  
= prod(eig$values)