【问题标题】:SVD of very large matrix in RR中非常大的矩阵的SVD
【发布时间】:2013-05-25 02:09:45
【问题描述】:

我想在 r 中生成一个 30000 x 30000 的矩阵,将 30000 个元素的向量乘以其转置,然后获得该矩阵的 SVD,但程序告诉我 r 无法定位大小为 900000000 的向量。帮助我,我该怎么办?

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

【问题讨论】:

    标签: r matrix svd


    【解决方案1】:

    SVD 的部分优点在于您不需要需要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
    

    【讨论】:

    • 另外,请注意(取决于您的应用程序)您可以通过计算少于完整的左奇异向量集来加快速度。请参阅?svd 的“详细信息”部分,了解有关如何/为什么要手动将nu 设置为小于min(nrow(x), ncol(x)) 的更多详细信息。
    猜你喜欢
    • 2013-06-25
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2018-02-09
    • 2012-12-25
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多