2017-09-16 60 views
14

我无法找到任何功能或包在R.计算的bigmatrix(从library(bigmemory))零空间或(QR分解)例如:计算一个bigmatrix的R中的零空间

library(bigmemory) 

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

我尝试了以下,但得到了显示的错误。我如何找到bigmemory对象的空位?

a.qr <- Matrix::qr(a) 
# Error in as.vector(data) : 
# no method for coercing this S4 class to a vector 
q.null <- MASS::Null(a) 
# Error in as.vector(data) : 
# no method for coercing this S4 class to a vector 
+0

做任何这些工作'?qr'或'?Matrix :: qr'或'?MASS :: Null' – user20650

+0

是的。我这样做,但这些函数不适用于bigmatrix(S4类),或者我不能将它们用于大矩阵。我只能将这些函数用于常规矩阵,而不能用于大矩阵。 – Mahin

+0

好吧,我不确定你是否有一个大的矩阵或bigmatrix;)。目前,您的问题是[偏离主题](https://stackoverflow.com/help/on-topic),因为它直接要求提供套餐推荐,并且在目前的状态下可能会关闭。但它很有趣。你可以编辑你的问题,请进一步的细节。例如,您可以添加一个bigmatrix的小示例(包括使用的任何软件包),说明标准工具不工作的方式,也可能要求替代方案。谢谢 – user20650

回答

9

如果要计算矩阵的完整SVD,你可以使用包bigstatsr块来进行计算。 A FBM表示Filebacked Big Matrix,并且是类似于文件包big.matrix包的对象bigmemory的对象。

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)) 

这需要大约10分钟在我的电脑上。

+0

嗨。谢谢你的回答,但我需要计算一个m×n矩阵A(A = udt(v))的“全”SVD,其中u是一个m×m矩阵,d是一个m×n矩阵,v是一个n×n矩阵。我真的需要矩阵v进入零空间,但从你提出的方法得到的矩阵元素与我想要的不同。例如见:https://math.stackexchange.com/questions/1771013/null-space-from-svd – Mahin

+1

@Mahin从我的回答中,你得到'u'是mxn,'d'是对角线nxn(这里只是对角线给出)和'v'就像你想要的nxn。从这3个矩阵中完全重构'a'是完全的。 –

+3

@Mahin据我所知,你所说的完整SVD只是在u中加入一些(无用的)列。 'v'应该是相同的,你可以通过比较svd(mat)$ v'和'svd(mat,nu = nrow(mat),nv = ncol(mat))$ v'来验证它是否包含更多的矩阵行比列。 –

2

@Mahon @ user20650 @F.Privė为清楚起见我ping通了bigmemory队,问

从本质上讲,是那里的QR功能(QR分解),与大存储矩阵工作的实施?

我觉得有必要弄清楚原问题。 @F.Privė - 很好的答案。希望你的回答,他们的回应将有助于指导未来的人们。他们的回应如下:

感谢您的注意。目前还没有实施qr分解。理想情况下,您可以使用Householder反射(如果矩阵密集)或Givens旋转(如果它很稀疏)来实现此操作。

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

请注意,如果您的矩阵是(高大瘦骨或短而胖),那么SO解决方案是确定的。然而,只要你计算交叉乘积,你就会失去一些数值稳定性。如果您计划对矩阵进行反转,这可能是一个问题。

+0

你好。非常感谢您的指导。但我不想制作线性模型拟合。 我只是想做一个完整的QR分解(或全SVD)的big.matrix,然后进入它的零空间。我运行'RcppEigen'包,但是这个包没有给我mat.obj的QR分解,只给出了线性模型拟合。谢谢。 – Mahin

+2

谢谢技术,有用的意见。所以答案的确是没有QR分解,或者没有空格计算,所以需要编写C++代码。 – user20650

+0

@ user20650 - 是的,这是目前的情况 - 不幸的。迈克尔K.在这里超级有用(A.k.a BigMemory)。这就是说我喜欢*F.Privė*替代方法,我打算更详细地查看一个包。 – Technophobe01