Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算R中一个大矩阵的零空间_R_Matrix_R Bigmemory_Large Data - Fatal编程技术网

计算R中一个大矩阵的零空间

计算R中一个大矩阵的零空间,r,matrix,r-bigmemory,large-data,R,Matrix,R Bigmemory,Large Data,我在R中找不到任何函数或包来计算bigmatrix(来自库(bigmemory))的零空间或(QR分解)。例如: library(bigmemory) a <- big.matrix(1000000, 1000, type='double', init=0) @Mahon@user20650@F.Privė为了清楚起见,我打电话给bigmemory团队并询问 从本质上讲,是否有一个QR函数(QR分解)的实现,它可以处理大内存矩阵 我觉得澄清最初提出的问题很有用@F.Privė-回答得好

我在R中找不到任何函数或包来计算
bigmatrix
(来自
库(bigmemory)
)的零空间或(QR分解)。例如:

library(bigmemory)

a <- big.matrix(1000000, 1000, type='double', init=0)

@Mahon@user20650@F.Privė为了清楚起见,我打电话给bigmemory团队并询问

从本质上讲,是否有一个QR函数(QR分解)的实现,它可以处理大内存矩阵

我觉得澄清最初提出的问题很有用@F.Privė-回答得好。希望你的回答和他们的回答能帮助人们在未来获得指导。他们的答复如下:

谢谢你的来信。目前还没有qr分解的实现。理想情况下,您可以使用Householder反射(如果矩阵密集)或Givens旋转(如果稀疏)来实现这一点

irlba包与bigmemory兼容。它提供了截断奇异值分解。因此,如果矩阵相对稀疏,可以在矩阵的秩处截断。这可能是你最好的选择。如果您不知道排名,那么可以使用包迭代地更新截断

请注意,如果你的矩阵是(高而瘦或短而胖),那么SO解决方案是可以的。然而,任何时候你需要计算叉积,你就会失去一些数值稳定性。如果您计划反转矩阵,这可能是一个问题


如果要计算矩阵的完整奇异值分解,可以使用packagebigstatsr按块执行计算。
FBM
代表文件备份的大矩阵,是一个类似于包bigmemory的文件备份的
Big.Matrix
对象的对象

library(bigstatsr)
options(bigstatsr.block.sizeGB = 0.5)

# Initialize FBM with random numbers
a <- FBM(1e6, 1e3)
big_apply(a, a.FUN = function(X, ind) {
  X[, ind] <- rnorm(nrow(X) * length(ind))
  NULL
}, a.combine = 'c')

# Compute t(a) * a
K <- big_crossprodSelf(a, big_scale(center = FALSE, scale = FALSE))

# Get v and d where a = u * d * t(v) the SVD of a
eig <- eigen(K[])
v <- eig$vectors
d <- sqrt(eig$values)

# Get u if you need it. It will be of the same size of u
# so that I store it as a FBM.
u <- FBM(nrow(a), ncol(a))
big_apply(u, a.FUN = function(X, ind, a, v, d) {
  X[ind, ] <- sweep(a[ind, ] %*% v, 2, d, "/")
  NULL
}, a.combine = 'c', block.size = 50e3, ind = rows_along(u),
a = a, v = v, d = d)

# Verification
ind <- sample(nrow(a), 1000)
all.equal(a[ind, ], tcrossprod(sweep(u[ind, ], 2, d, "*"), v))
库(bigstatsr)
选项(bigstatsr.block.sizeGB=0.5)
#用随机数初始化FBM

a执行以下任一工作
?qr
,或
?矩阵::qr
,或
?质量::Null
是。我知道,但是这些函数不适用于bigmatrix(S4类),或者我不能将它们用于大矩阵。我只能对正则矩阵使用这些函数,不能对bigmatrix使用。好的,我不确定你是否有一个大矩阵或bigmatrix;)。目前,您的问题是因为它直接要求提供一揽子建议,而在当前状态下,它可能会关闭。但这很有趣。你能用更多的细节来编辑你的问题吗。例如,您是否可以添加一个bigmatrix的小示例(包括使用的任何包),说明标准工具是如何不起作用的,并可能要求提供一个替代方案。感谢该软件包启动了一些方法,但是QR函数不完整,但是,此fork添加了QR函数。它确实给出了一个警告:这是不建议的。-你可以问作者为什么有一个大矩阵。例如:library(bigmemory)aHello。非常感谢您的指导。但我不想做线性模型拟合。我只想对一个大矩阵做一个完整的QR分解(或全SVD),然后进入它的零空间。我运行了“RcppEigen”包,但该包没有给我mat.obj的QR分解,只提供了线性模型拟合。谢谢。谢谢技术,有用的评论。所以答案是没有QR分解,或者零空间计算出框,因此,C++代码需要被写。@ USER 20650 -是的,这是当前的情况-不幸的。迈克尔·K.在这里帮了大忙(又称大记忆)。也就是说,我非常喜欢F.Privėalternate方法,我计划更详细地看一看它。@techno感谢您的关注。我目前正在做F.Privė的解决方案,但我希望相关函数很快就会被编写出来。谢谢你的回答,但我需要计算m×n矩阵A(A=u.d.t(v))的“完整”奇异值分解,其中u是m×m矩阵,d是m×n矩阵,v是n×n矩阵。我确实需要矩阵v进入零空间,但是从你提出的方法得到的矩阵元素与我想要的不同。例如,请看:@Mahin从我的回答中,您得到
u
是m x n,
d
是对角线n x n(这里只给出了对角线),而
v
是您想要的n x n。完全可以从这3个矩阵中完美地重构
a
。@Mahin据我所知,您所说的完整SVD只是在
u
中添加了一些(无用的)列
v
应该是相同的,您可以通过比较
svd(mat)$v
svd(mat,nu=nrow(mat),nv=ncol(mat))$v
对任何行多于列的矩阵进行验证。@F.Privé您是对的。我错了。在这两种情况下,svd(mat)$v和svd(mat,nu=nrow(mat),nv=ncol(mat))$v,矩阵元素是相同的,现在我可以从v计算零空间。非常感谢。是否可以在您的计算机上使用1e6x1e6 bigmatrix并通过R中的这些命令计算其SVD?我不知道我如何才能为这种大小的矩阵工作。谢谢
library(bigstatsr)
options(bigstatsr.block.sizeGB = 0.5)

# Initialize FBM with random numbers
a <- FBM(1e6, 1e3)
big_apply(a, a.FUN = function(X, ind) {
  X[, ind] <- rnorm(nrow(X) * length(ind))
  NULL
}, a.combine = 'c')

# Compute t(a) * a
K <- big_crossprodSelf(a, big_scale(center = FALSE, scale = FALSE))

# Get v and d where a = u * d * t(v) the SVD of a
eig <- eigen(K[])
v <- eig$vectors
d <- sqrt(eig$values)

# Get u if you need it. It will be of the same size of u
# so that I store it as a FBM.
u <- FBM(nrow(a), ncol(a))
big_apply(u, a.FUN = function(X, ind, a, v, d) {
  X[ind, ] <- sweep(a[ind, ] %*% v, 2, d, "/")
  NULL
}, a.combine = 'c', block.size = 50e3, ind = rows_along(u),
a = a, v = v, d = d)

# Verification
ind <- sample(nrow(a), 1000)
all.equal(a[ind, ], tcrossprod(sweep(u[ind, ], 2, d, "*"), v))