【问题标题】:Convergence error of function svd() in RR中函数svd()的收敛误差
【发布时间】:2014-08-15 20:08:50
【问题描述】:

在R中编码时,我发现函数svd()有时可能会抛出错误消息:

Error in La.svd(x, nu, nv) : error code 1 from Lapack routine 'dgesdd'. 

在谷歌上搜索了一些资料,发现这个错误是指svd()中使用的算法不收敛。很多人也遇到了同样的错误信息,我尝试了很多他们使用的方法,但没有一个能正常工作,例如使用参数LINPACK = TRUE,对矩阵进行四舍五入甚至使用propack.svd()trlan.svd()

我的输入数据是一个矩阵,对角线条目等于 1,其他条目为 0 或相对较小。我猜这个错误与数值精度有关,所以我尝试用round(matrix,6) 之类的东西来舍入矩阵。这有时会有所帮助,但不能从根本上解决问题,我担心这种四舍五入会导致一些有偏差的结果。

如果有人能告诉我如何解决这个问题,我将不胜感激。

【问题讨论】:

  • 可能是您的输入数据有问题,而不是svd()。但是由于没有对您的数据进行描述,因此进一步探索很复杂。
  • 增加输入数据的说明。
  • 在 Linux Debian 3.10.11-1 中使用该函数时,我遇到了与 svd() 和大型矩阵相同的问题。我搬到了 Windows 并且讽刺地它工作了。不知道为什么。

标签: r svd convergence


【解决方案1】:

这发生在我身上,用于大型随机生成 (rnorm) 矩阵(例如,运行 svd 以获取填充 rnorm 的 250 x 800 矩阵的 cor 的前 6 个特征向量)。是的,那个cor矩阵是秩不足的。这样做足够多次,错误就会弹出。 我确实发现在我的情况下四舍五入到 5 位数使它停止发生(至少减少了发生率,这样它就不会在我正在进行的大量随机试验中出现)。与不会影响我结果质量的 OP 不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多