2017-09-16 103 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