我正在使用R工具来计算SVD(svd(m)
)并且它适用于小矩阵,但是当我传递它20Kx20X
矩阵时。处理后,它会出现以下错误
Error in svd(m) : infinite or missing values in 'x'
我检查过,没有行或列的所有0值,并且没有重复的行和 柱。所有列都有值。
我在这里不能超过20Kx20K
矩阵:(
答案 0 :(得分:1)
我猜你的问题与内存大小无关,虽然我无法在4GB内存机器上处理20Kx20K矩阵。
猜测的原因是svd()内的第一行代码如下:
if (any(!is.finite(x)))
stop("infinite or missing values in 'x'")
换句话说,svd()函数首先测试数据中是否存在任何无限值。
在之前进行任何进一步处理。因此,如果您遇到内存问题,即使在调用svd()之前,这些内容也会很明显。
我建议您检查无限值:
x <- c(0, Inf, NA, NULL)
which(!is.finite(x))
[1] 2 3
这表明第二和第三个值被认为不是有限的。换句话说,数据中任何 NA值都会导致错误。
答案 1 :(得分:0)
如果您正在存储8个字节的双精度数,则20Kx20K意味着8 * 20,000 * 20,000 / 1024 / 1024~3GB的RAM可以将整个内容保存在内存中。
我不知道你有多少RAM可用,但我会研究R可以根据需要将矩阵序列化到磁盘上。
矩阵是稀疏的还是带状的?你能做些什么来减少你需要的内存量吗?
矩阵的零空间有多大?什么是条件数(最大到最小特征值的比率)?大的条件数可以表示解决困难。矩阵不需要零行或列几乎是单数。
更新:
根据您的评论,我会说RAM是您遇到的问题中最少的。听起来有可能将整个矩阵保存在内存中 - 如果你可以解决所有问题。您可以处理整个矩阵。你在64位操作系统上运行 - 你的R 64位版本也是?
不幸的是,SVD的副产品之一是获得零空间的大小。
您可以使用Jacobi迭代获得矩阵的最小特征值。 Lanczos可能是获得最大特征值的好选择。得到所有这些都需要做很多工作;你可能只想要评估最小和最小的五个。
我遇到某些软件时出错,我会立即将其粘贴到Google搜索中。至少我很高兴知道我不是第一个遇到特定问题的人:
答案 2 :(得分:0)
可能svd计算本身也会占用大量内存。如果我们比较MATLAB,我们看到svd计算分配的内存与矩阵本身使用的内存一样多,所以如果你已经有3GB的内存,那么svd计算可能会分配另外3GB,这会产生6GB的内存。