【问题标题】:why solve(eigenvalues, eigenvectors) of cov are different for 2d and 3d matrix?为什么 cov 的求解(特征值,特征向量)对于 2d 和 3d 矩阵是不同的?
【发布时间】:2017-08-27 10:22:45
【问题描述】:

我正在使用 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$valuesdiag(n))”对二维矩阵产生相同的数字,但结果3d 矩阵的对角线数是否相同?

【问题讨论】:

    标签: r


    【解决方案1】:

    cv %% eig$vectorssolve(eig$vectors, eig$valuesdiag(n)) 即使在 2d 情况下也不相等,如问题中的输出所示。

    第一个等于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)
    

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 1970-01-01
      • 2012-08-08
      • 2020-11-08
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 2011-09-29
      相关资源
      最近更新 更多