【发布时间】:2011-02-05 13:06:06
【问题描述】:
我正在使用 R 工具来计算 SVD (svd(m)),它适用于小矩阵,但当我通过 20Kx20X 矩阵时。处理后报如下错误
Error in svd(m) : infinite or missing values in 'x'
我检查了,没有行或列的值全为 0,并且行中没有重复 柱子。所有列都有值。
我不能在这里通过20Kx20K 矩阵:(
【问题讨论】:
我正在使用 R 工具来计算 SVD (svd(m)),它适用于小矩阵,但当我通过 20Kx20X 矩阵时。处理后报如下错误
Error in svd(m) : infinite or missing values in 'x'
我检查了,没有行或列的值全为 0,并且行中没有重复 柱子。所有列都有值。
我不能在这里通过20Kx20K 矩阵:(
【问题讨论】:
我猜你的问题与内存大小无关,虽然我无法在我的 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 值都会导致您的错误。
【讨论】:
可能 svd 计算本身也使用大量内存。如果我们与 MATLAB 进行比较,我们会发现 svd 计算分配的内存与矩阵本身使用的内存一样多,因此如果您已经使用 3GB 内存,则 svd 计算可能会再分配 3GB,即 6GB 内存。
【讨论】:
如果您要存储 8 个字节的双精度,则 20Kx20K 意味着 8*20,000*20,000/1024/1024 ~ 3GB 的 RAM 可以将整个内容保存在内存中。
我不知道您有多少可用 RAM,但我会研究 R 可以根据需要将矩阵序列化到磁盘上。
矩阵是稀疏的还是带状的?你能做些什么来减少你需要的内存量吗?
你的矩阵的零空间有多大?条件数是多少(最大与最小特征值之比)?较大的条件数可能表示求解困难。矩阵不必有零行或零列即可接近奇异。
更新:
根据您的评论,我认为 RAM 是您的问题中最少的。听起来可以将整个矩阵保存在内存中——如果你能解决所有问题的话。您可以解决整个矩阵。您在 64 位操作系统上运行 - 您的 R 版本也是 64 位吗?
不幸的是,SVD 的副产品之一是获取空空间的大小。
您可以使用 Jacobi 迭代获得矩阵的最小特征值。 Lanczos 可能是获得最大特征值的不错选择。获得所有这些将是很多工作。您可能只需要评估最小和最大的五个。
每当我遇到某些软件错误时,我都会立即将其粘贴到 Google 搜索中。至少知道我不是第一个遇到特定问题的人是令人欣慰的:
【讨论】: