查找具有高条件数的矩阵的逆
Finding inverse of a matrix with high condition number
我试图找到 this 9x9 covariance matrix so I can use it with mahalanobis distance. However, the result I'm getting from matrix inverse 的逆矩阵是一个充满 1.02939420e+16
的矩阵。我一直在试图找出原因,考虑到 Wolfram 会给我正确的答案,这似乎与矩阵的条件数有关,在这种情况下是 3.98290435292e+16
。
虽然我想了解这背后的数学原理,但此时此刻我真正需要的只是这个问题的解决方案,以便我可以继续实施。有没有办法找到这种矩阵的逆矩阵?或者是否有可能直接从数据中找到逆协方差矩阵?
编辑:矩阵数据(与pastebin相同link)
[[ 0.46811097 0.15024959 0.01806486 -0.03029948 -0.12472314 -0.11952018 -0.14738093 -0.14655549 -0.06794621]
[ 0.15024959 0.19338707 0.09046136 0.01293189 -0.05290348 -0.07200769 -0.09317139 -0.10125269 -0.12769464]
[ 0.01806486 0.09046136 0.12575072 0.06507481 -0.00951239 -0.02944675 -0.05349869 -0.07496244 -0.13193147]
[-0.03029948 0.01293189 0.06507481 0.12214787 0.04527352 -0.01478612 -0.02879678 -0.06006481 -0.1114809 ]
[-0.12472314 -0.05290348 -0.00951239 0.04527352 0.164018 0.05474073 -0.01028871 -0.02695087 -0.03965366]
[-0.11952018 -0.07200769 -0.02944675 -0.01478612 0.05474073 0.13397166 0.06839442 0.00403321 -0.02537928]
[-0.14738093 -0.09317139 -0.05349869 -0.02879678 -0.01028871 0.06839442 0.14424203 0.0906558 0.02984426]
[-0.14655549 -0.10125269 -0.07496244 -0.06006481 -0.02695087 0.00403321 0.0906558 0.17054466 0.14455264]
[-0.06794621 -0.12769464 -0.13193147 -0.1114809 -0.03965366 -0.02537928 0.02984426 0.14455264 0.32968928]]
您提供的矩阵 m
具有 0
的行列式,因此从数值的角度来看是不可逆的(这解释了您拥有的巨大价值往往会撞到 Inf
):
In [218]: np.linalg.det(m)
Out[218]: 2.8479946613617788e-16
如果你开始做线性代数 operations/problem 求解,我强烈建议检查一些基本概念,这将避免做数值 mistakes/errors:
https://en.wikipedia.org/wiki/Invertible_matrix
你面临着一个非常重要和基础的数学问题。如果您的方法给出不可逆矩阵,则该方法有问题。尝试解决一个ill-posed problem. Probably all well-posed problems have been solved in the XIX century. The most common way to solve ill-posed problems is regularization. Sometimes Moore-Penrose pseudoinverse的方法可能比较方便。 Scipy.linalg 有伪逆。但是伪逆并不是捷径。使用伪逆,你用可解决的问题 B 替换不可解决的问题 A。有时问题 B 的解决方案可以成功地代替问题 A 的不存在解决方案,但这是数学研究的问题。
零行列式意味着您的矩阵具有线性相关的行(或列)。换句话说,模型中的某些信息是冗余的(它包含过多或重复的信息)。重新开发您的模型以排除冗余。
我试图找到 this 9x9 covariance matrix so I can use it with mahalanobis distance. However, the result I'm getting from matrix inverse 的逆矩阵是一个充满 1.02939420e+16
的矩阵。我一直在试图找出原因,考虑到 Wolfram 会给我正确的答案,这似乎与矩阵的条件数有关,在这种情况下是 3.98290435292e+16
。
虽然我想了解这背后的数学原理,但此时此刻我真正需要的只是这个问题的解决方案,以便我可以继续实施。有没有办法找到这种矩阵的逆矩阵?或者是否有可能直接从数据中找到逆协方差矩阵?
编辑:矩阵数据(与pastebin相同link)
[[ 0.46811097 0.15024959 0.01806486 -0.03029948 -0.12472314 -0.11952018 -0.14738093 -0.14655549 -0.06794621]
[ 0.15024959 0.19338707 0.09046136 0.01293189 -0.05290348 -0.07200769 -0.09317139 -0.10125269 -0.12769464]
[ 0.01806486 0.09046136 0.12575072 0.06507481 -0.00951239 -0.02944675 -0.05349869 -0.07496244 -0.13193147]
[-0.03029948 0.01293189 0.06507481 0.12214787 0.04527352 -0.01478612 -0.02879678 -0.06006481 -0.1114809 ]
[-0.12472314 -0.05290348 -0.00951239 0.04527352 0.164018 0.05474073 -0.01028871 -0.02695087 -0.03965366]
[-0.11952018 -0.07200769 -0.02944675 -0.01478612 0.05474073 0.13397166 0.06839442 0.00403321 -0.02537928]
[-0.14738093 -0.09317139 -0.05349869 -0.02879678 -0.01028871 0.06839442 0.14424203 0.0906558 0.02984426]
[-0.14655549 -0.10125269 -0.07496244 -0.06006481 -0.02695087 0.00403321 0.0906558 0.17054466 0.14455264]
[-0.06794621 -0.12769464 -0.13193147 -0.1114809 -0.03965366 -0.02537928 0.02984426 0.14455264 0.32968928]]
您提供的矩阵 m
具有 0
的行列式,因此从数值的角度来看是不可逆的(这解释了您拥有的巨大价值往往会撞到 Inf
):
In [218]: np.linalg.det(m)
Out[218]: 2.8479946613617788e-16
如果你开始做线性代数 operations/problem 求解,我强烈建议检查一些基本概念,这将避免做数值 mistakes/errors: https://en.wikipedia.org/wiki/Invertible_matrix
你面临着一个非常重要和基础的数学问题。如果您的方法给出不可逆矩阵,则该方法有问题。尝试解决一个ill-posed problem. Probably all well-posed problems have been solved in the XIX century. The most common way to solve ill-posed problems is regularization. Sometimes Moore-Penrose pseudoinverse的方法可能比较方便。 Scipy.linalg 有伪逆。但是伪逆并不是捷径。使用伪逆,你用可解决的问题 B 替换不可解决的问题 A。有时问题 B 的解决方案可以成功地代替问题 A 的不存在解决方案,但这是数学研究的问题。
零行列式意味着您的矩阵具有线性相关的行(或列)。换句话说,模型中的某些信息是冗余的(它包含过多或重复的信息)。重新开发您的模型以排除冗余。