部分原因是,你不需要採取x
的雙重交叉,以獲得雙重交叉的SVD。
您可以直接從x
的SVD元素中獲得x%*%t(x)
(又名tcrossprod(x)
)的SVD。具體而言(並且直到U列的符號)SVD(x%*%t(x))= U D^2 t(U),其中U和D取自x
的SVD。 (對於一個參考,see here)
要看到它的行動,嘗試了一個小例子:
set.seed(1)
x <- matrix(rnorm(15), ncol=5)
svd(x)$d
# [1] 3.046842 1.837539 1.411585
sqrt(svd(tcrossprod(x))$d)
# [1] 3.046842 1.837539 1.411585
svd(x)$u
# [,1] [,2] [,3]
# [1,] -0.3424029 0.7635281 0.5475264
# [2,] -0.8746155 -0.4719093 0.1111273
# [3,] 0.3432316 -0.4408248 0.8293766
svd(tcrossprod(x))$u
# [,1] [,2] [,3]
# [1,] -0.3424029 0.7635281 0.5475264
# [2,] -0.8746155 -0.4719093 0.1111273
# [3,] 0.3432316 -0.4408248 0.8293766
svd(tcrossprod(x))$v
# [,1] [,2] [,3]
# [1,] -0.3424029 0.7635281 0.5475264
# [2,] -0.8746155 -0.4719093 0.1111273
# [3,] 0.3432316 -0.4408248 0.8293766
另一種方式來看到這一點:
sss <- svd(x)
with(sss, u %*% diag(d)^2 %*% t(u))
# [,1] [,2] [,3]
# [1,] 3.654154 1.684675 -1.322649
# [2,] 1.684675 7.877802 -1.900721
# [3,] -1.322649 -1.900721 3.120415
tcrossprod(x)
# [,1] [,2] [,3]
# [1,] 3.654154 1.684675 -1.322649
# [2,] 1.684675 7.877802 -1.900721
# [3,] -1.322649 -1.900721 3.120415
另外,請注意(視在你的應用程序中),你可以通過計算比完整的左奇異向量少的數據來加快速度。請參閱'svd'的「Details」部分,瞭解更多關於如何/爲什麼要手動將nu設置爲小於min(nrow(x),ncol(x))的詳細信息。 –