【问题标题】:matrix calculation error矩阵计算误差
【发布时间】:2011-02-05 13:06:06
【问题描述】:

我正在使用 R 工具来计算 SVD (svd(m)),它适用于小矩阵,但当我通过 20Kx20X 矩阵时。处理后报如下错误

Error in svd(m) : infinite or missing values in 'x'

我检查了,没有行或列的值全为 0,并且行中没有重复 柱子。所有列都有值。

我不能在这里通过20Kx20K 矩阵:(

【问题讨论】:

    标签: math r matrix


    【解决方案1】:

    我猜你的问题与内存大小无关,虽然我无法在我的 4GB 内存机器上处理 20Kx20K 矩阵。

    这个猜测的原因是svd()里面的第一行代码如下:

    if (any(!is.finite(x))) 
        stop("infinite or missing values in 'x'")
    

    换句话说,svd() 函数首先测试您的数据中是否存在 any 无限值。

    这发生在任何进一步处理之前。所以,如果你有内存问题,甚至在你调用 svd() 之前这些问题就会很明显。

    我建议你检查无限值:

    x <- c(0, Inf, NA, NULL)
    which(!is.finite(x))
    
    [1] 2 3
    

    这表明第二个和第三个值被认为是非有限的。换句话说,您数据中的任何 NA 值都会导致您的错误。

    【讨论】:

    • 我如何知道我的数据中哪个值为 NA?我有 10GB 内存。我用你的代码 > which(is.finite(m)) 命名 integer(0) 来检查是否有任何有限值,它给了我命名 integer(0)
    • which() 标识为真的元素。所以我的代码会告诉你哪些元素会导致问题。重要 - 注意否定感叹号。 !is.finite()
    • 它没有解决问题。我使用了您的功能,但它没有告诉我任何信息。 :(有什么帮助吗?
    • 你能把 which(!is.finite(m)) 的结果粘贴到这里吗?这个小语句将告诉您矩阵中被认为是无限值的索引号。
    【解决方案2】:

    可能 svd 计算本身也使用大量内存。如果我们与 MATLAB 进行比较,我们会发现 svd 计算分配的内存与矩阵本身使用的内存一样多,因此如果您已经使用 3GB 内存,则 svd 计算可能会再分配 3GB,即 6GB 内存。

    【讨论】:

    • 我有 10GB,没有内存问题 :(
    【解决方案3】:

    如果您要存储 8 个字节的双精度,则 20Kx20K 意味着 8*20,000*20,000/1024/1024 ~ 3GB 的 RAM 可以将整个内容保存在内存中。

    我不知道您有多少可用 RAM,但我会研究 R 可以根据需要将矩阵序列化到磁盘上。

    矩阵是稀疏的还是带状的?你能做些什么来减少你需要的内存量吗?

    你的矩阵的零空间有多大?条件数是多少(最大与最小特征值之比)?较大的条件数可能表示求解困难。矩阵不必有零行或零列即可接近奇异。

    更新:

    根据您的评论,我认为 RAM 是您的问题中最少的。听起来可以将整个矩阵保存在内存中——如果你能解决所有问题的话。您可以解决整个矩阵。您在 64 位操作系统上运行 - 您的 R 版本也是 64 位吗?

    不幸的是,SVD 的副产品之一是获取空空间的大小。

    您可以使用 Jacobi 迭代获得矩阵的最小特征值。 Lanczos 可能是获得最大特征值的不错选择。获得所有这些将是很多工作。您可能只需要评估最小和最大的五个。

    每当我遇到某些软件错误时,我都会立即将其粘贴到 Google 搜索中。至少知道我不是第一个遇到特定问题的人是令人欣慰的:

    http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=Error+in+svd(m)+:+infinite+or+missing+values+in+'x'

    【讨论】:

    • 您好,感谢您的回复。是的,我的矩阵很稀疏。我有 10GB 内存。我没有记忆问题。如何检查空空间?特征值的比率?
    • 您好,感谢您的详细解释。是的,R 和 OS 都有 64 位。我尝试了不同的方法来解决这个问题,但都是徒劳的......
    • 谢谢,我已经搜索了谷歌并阅读了这些消息和解决方案,但这并不能解决我的问题。这就是为什么我来这里寻求大师的建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2015-03-31
    • 2015-12-17
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多