在 R 中编码时,我发现函数 svd()
有时可能会抛出错误消息:
Error in La.svd(x, nu, nv) : error code 1 from Lapack routine 'dgesdd'.
在Google上查了一些资料,原来这个错误是指svd()
中使用的算法。不收敛。很多人也遇到了同样的错误信息,我尝试了很多他们使用的方法但没有一个能正常工作,例如使用参数LINPACK = TRUE
,对矩阵进行四舍五入,甚至使用 propack.svd()
和trlan.svd()
.
我的输入数据是一个矩阵,对角线元素等于1,其他元素为0或相对较小。我猜想这个错误与数值精度有关,所以我尝试用 round(matrix,6)
之类的东西对矩阵进行舍入。这有时会有所帮助,但不能从根本上解决问题,我担心这种舍入会导致一些有偏差的结果。
如果有人能告诉我如何解决这个问题,我将非常感激。
最佳答案
对于大型随机生成(rnorm)矩阵,这种情况发生在我身上(例如,运行 svd 来获取填充 rnorm 的 250 x 800 矩阵的 cor 的前 6 个特征向量)。是的,该 cor 矩阵是秩亏的。这样做足够多次就会弹出错误。 我确实发现,在我的情况下,四舍五入到 5 位数可以让它停止发生(至少减少发生次数,这样它就不会出现在我正在进行的大量随机试验中)。与 OP 不同的是,这不会影响我结果的质量。
关于r - R中函数svd()的收敛误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405671/