Mat*_*ica 1 r matrix matrix-inverse singular
该链接具有我的矩阵的 dput 输出结构。
\n https://pastebin.com/TsUzuF4L
\n\nsolve() 中的错误:系统在计算上是奇异的:R 中的倒数条件数 = 4.35295e-21
\n
我想知道R中是否有任何通用方法可以确定矩阵可逆?有什么功能吗?
\n我添加了属性tol=FALSEor tol = 1e-22(与 error 中的数字相比),但我仍然收到相同的错误。
附:我将其放在 stackexchange 上的原因是,我的矩阵行列式不为零,但 R 给出了上面的错误,并相信我的矩阵不可逆!怎么会?!
\n\n我的矩阵是 45 \xc3\x97 45。dput()输出超出了 Stack Overflow 上 40000 个字符的限制,但为了了解其数字是什么,我在上面显示了其中的一部分。
tl;博士我可以通过设置来反转你的矩阵tol=0,但这可能不是一个好主意。
当我从您提供的链接获取矩阵时,我可以解决问题并反转矩阵,但我建议您应该非常谨慎,因为警告和错误告诉您计算在数值上不稳定 -您可能会在不同的操作系统、不同的编译器等上得到不同的答案。除非您有独立的方法来验证它们,否则您不能相信这些答案。
\nrange(v <- eigen(M)$values)\n## [1] -7.369628e-05 9.355280e+11\nplot(abs(v), log="y", col = sign(v)+3, pch=16)\nRun Code Online (Sandbox Code Playgroud)\n矩阵不是正定的(这可能很重要,具体取决于您的应用);最小特征值比最大特征值小 16 个数量级...
\n\nMatrix::rankMatrix(M)\n## 19, with tolerance 1e-15\nMatrix::rankMatrix(M, tol =0 )\n## 45 with tolerance 0\nRun Code Online (Sandbox Code Playgroud)\n当使用默认容差计算时,您的矩阵被报告为秩不足,即只有 19 个独立维度/列(这对应于上图中大间隙上方的特征值数量)
\n我们可以计算条件数:
\nMatrix::condest(M)\n## $est: [1] 2.732966e+18\nRun Code Online (Sandbox Code Playgroud)\n来自维基百科:
\n\n\n根据经验,如果条件数 \xce\xba(A) = 10^k,那么除了由于算术精度损失而导致数值方法损失的精度之外,您还可能损失最多 k 位的精度方法
\n
在这种情况下k=18(得出你自己的结论)......
\n当我计算行列式时,我得到一个非常不同的值(但仍然非零)。
\ndet(M)\n## [1] 2.568633e+35\nRun Code Online (Sandbox Code Playgroud)\n如果我告诉 R 通过将容差设置为 0 来忽略所有这些警告信号,我可以反转矩阵。
\ni <- solve(M, tol=0)\nRun Code Online (Sandbox Code Playgroud)\n根据您正在做的事情,您可能有兴趣计算考虑矩阵的(接近)秩不足的伪逆MASS::ginv(),例如使用。
由于答案可能高度依赖于系统详细信息,因此以下信息来自sessionInfo():
R Under development (unstable) (2021-07-30 r80684)\nPlatform: x86_64-pc-linux-gnu (64-bit)\nRunning under: Pop!_OS 20.10\n\nMatrix products: default\nBLAS: /usr/local/lib/R/lib/libRblas.so\nLAPACK: /usr/local/lib/R/lib/libRlapack.so\nRun Code Online (Sandbox Code Playgroud)\n