gpt4 book ai didi

r - R程序中超大矩阵的svd

转载 作者:行者123 更新时间:2023-12-04 09:11:05 25 4
gpt4 key购买 nike

我在txt文件中有一个60,000 x 60,000矩阵,我需要获取此矩阵的svd。我使用R,但我不知道R是否可以生成它。

最佳答案

我认为可以使用svd包以及irlbabigmemory来计算(部分)bigalgebra,而无需占用大量内存。

首先让我们创建一个20000 * 20000矩阵并将其保存到文件中

require(bigmemory)
require(bigalgebra)
require(irlba)

con <- file("mat.txt", open = "a")
replicate(20, {
x <- matrix(rnorm(1000 * 20000), nrow = 1000)
write.table(x, file = 'mat.txt', append = TRUE,
row.names = FALSE, col.names = FALSE)
})

file.info("mat.txt")$size
## [1] 7.264e+09 7.3 Gb
close(con)

然后,您可以使用 bigmemory::read.big.matrix读取此矩阵
bigm <- read.big.matrix("mat.txt", sep = " ",
type = "double",
backingfile = "mat.bk",
backingpath = "/tmp",
descriptorfile = "mat.desc")

str(bigm)
## Formal class 'big.matrix' [package "bigmemory"] with 1 slots
## ..@ address:<externalptr>

dim(bigm)
## [1] 20000 20000

bigm[1:3, 1:3]
## [,1] [,2] [,3]
## [1,] -0.3623255 -0.58463 -0.23172
## [2,] -0.0011427 0.62771 0.73589
## [3,] -0.1440494 -0.59673 -1.66319

现在,我们可以使用使用出色的 irlba包,如包小插图中所述。

第一步包括定义可以与 big.matrix对象一起使用的矩阵乘法运算符,然后使用 irlba::irlba函数
### vignette("irlba", package = "irlba") # for more info

matmul <- function(A, B, transpose=FALSE) {
## Bigalgebra requires matrix/vector arguments
if(is.null(dim(B))) B <- cbind(B)

if(transpose)
return(cbind((t(B) %*% A)[]))

cbind((A %*% B)[])
}

dim(bigm)

system.time(
S <- irlba(bigm, nu = 2, nv = 2, matmul = matmul)
)

## user system elapsed
## 169.820 0.923 170.194


str(S)
## List of 5
## $ d : num [1:2] 283 283
## $ u : num [1:20000, 1:2] -0.00615 -0.00753 -0.00301 -0.00615 0.00734 ...
## $ v : num [1:20000, 1:2] 0.020086 0.012503 0.001065 -0.000607 -0.006009 ...
## $ iter : num 10
## $ mprod: num 310

我忘记设置种子以使其可繁殖,但我只是想表明在R中可以做到这一点。

编辑

如果您正在使用软件包 irlba的新版本,则上面的代码将引发错误,因为函数 matmultirlba参数已重命名为 mult。因此,您应该更改代码的这一部分
S <- irlba(bigm, nu = 2, nv = 2, matmul = matmul)

经过
S <- irlba(bigm, nu = 2, nv = 2, mult = matmul)

我要感谢@FrankD指出这一点。

关于r - R程序中超大矩阵的svd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17352771/

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