2013-05-29 53 views
2

我想在r中生成一個30000 x 30000的矩陣,將30000個元素的向量與其轉置相乘,然後獲得該矩陣的SVD,但程序告訴我r無法定位一個大小爲900000000的矢量圖。幫助我,我該怎麼辦?該SVD的美麗R中非常大的矩陣的SVD

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 

回答

7

部分原因是,你不需要採取x的雙重交叉,以獲得雙重交叉的SVD。

您可以直接從x的SVD元素中獲得x%*%t(x)(又名tcrossprod(x))的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 
+0

另外,請注意(視在你的應用程序中),你可以通過計算比完整的左奇異向量少的數據來加快速度。請參閱'svd'的「Details」部分,瞭解更多關於如何/爲什麼要手動將nu設置爲小於min(nrow(x),ncol(x))的詳細信息。 –