gpt4 book ai didi

r - R中非常大的矩阵的SVD

转载 作者:行者123 更新时间:2023-12-02 07:35:45 24 4
gpt4 key购买 nike

我想在 r 中生成一个 30000 x 30000 的矩阵,将一个 30000 元素的向量乘以它的转置,然后获得该矩阵的 SVD,但是程序告诉我 r 无法定位大小为 900000000 的向量。求助我,我该怎么办?

y <- read.csv("C:\\Users\\jmarescr\\Desktop\\BigLetra50.csv",header=TRUE)

x <- matrix(y[1:30000,1],30000,1)
tx <- as.matrix(t(x))

mat <- x %*% tx

Error: can not allocate vector of length 900000000

s <- svd(mat)

Error in svd (x): object 'mat' not found

最佳答案

SVD 的部分优点在于您需要x 的叉积来获得叉积的 SVD。

相反,您可以直接从 x 的元素中获取 x%*%t(x)(又名 tcrossprod(x))的 SVD 的 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

关于r - R中非常大的矩阵的SVD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16820270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com