I have a matrix shaped (4000, 4000) and I would like to take the inverse. (My intuition of the inverting matrices breaks down with such large matrices.)
The beginning matrix has values of the magnitude e-10
, with the following values: print matrix
gives an output
[[ 2.19885119e-10 2.16462810e-10 2.13062782e-10 ..., -2.16462810e-10
-2.19885119e-10 -2.16462810e-10]
[ 2.16462810e-10 2.19885119e-10 2.16462810e-10 ..., -2.13062782e-10
-2.16462810e-10 -2.19885119e-10]
[ 2.13062782e-10 2.16462810e-10 2.19885119e-10 ..., -2.16462810e-10
-2.13062782e-10 -2.16462810e-10]
...,
[ -2.16462810e-10 -2.13062782e-10 -2.16462810e-10 ..., 2.19885119e-10
2.16462810e-10 2.13062782e-10]
[ -2.19885119e-10 -2.16462810e-10 -2.13062782e-10 ..., 2.16462810e-10
2.19885119e-10 2.16462810e-10]
[ -2.16462810e-10 -2.19885119e-10 -2.16462810e-10 ..., 2.13062782e-10
2.16462810e-10 2.19885119e-10]]
I then use NumPy's numpy.linalg.inv() to invert the matrix.
import numpy as np
new_matrix = np.linalg.inv(matrix)
print new_matrix
This is the output I get in return:
[[ 1.95176541e+25 9.66643852e+23 -1.22660930e+25 ..., -1.96621184e+25
-9.41413909e+24 1.33500310e+25]
[ 2.01500967e+25 1.08946558e+24 -1.25813014e+25 ..., -2.07717912e+25
-9.86804459e+24 1.42950556e+25]
[ 3.55575106e+25 2.11333704e+24 -2.25333936e+25 ..., -3.68616202e+25
-1.72651875e+25 2.51239524e+25]
...,
[ 3.07255588e+25 1.61759838e+24 -1.95678425e+25 ..., -3.15440712e+25
-1.47472306e+25 2.13570651e+25]
[ -7.24380790e+24 -8.63730581e+23 4.90519245e+24 ..., 8.30663797e+24
3.70858694e+24 -5.32291734e+24]
[ -1.95760004e+25 -1.12341031e+24 1.23820305e+25 ..., 2.01608416e+25
9.40221886e+24 -1.37605863e+25]]
That's a huge difference! How could that be? A matrix of magnitude e-10
is inverted to a matrix of magnitude e+25
?
Is this mathematically correct, or are the IEEE floating point values breaking down?
If this is mathematically correct, could someone explain to me the mathematical intuition behind this?
EDIT:
Following the comments below, I decided to test.
np.dot(matrix, new_matrix)
should give the identity matrix, A * A^T = Identity.
This is my output:
[[ 0. -3. -16. ..., 16. 8. 12. ]
[-24. -1.5 -8. ..., 32. -4. 36. ]
[ 40. 1. -64. ..., 24. 20. 24. ]
...,
[ 32. -0.5 48. ..., -16. -20. 16. ]
[ 40. 7. 16. ..., -48. -36. -28. ]
[ 16. 3. 12. ..., -80. 16. 0. ]]
Why does numpy.linalg.inv()
result in numerical errors?
np.allclose( np.dot(matrix, new_matrix), np.identity(4000) )
gives False
.
Your matrix is ill-conditionned, since
np.linalg.cond(matrix) > np.finfo(matrix.dtype).eps
According to this answer you could consider using Singular Value Decomposition to inverse such matrices.