python - 在使用 numpy.linalg.inv() 时没有得到具有矩阵的点积及其逆的单位矩阵
问题描述
from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
mat = X.T.dot(X)
inv(mat)
mat.dot(inv(mat))
矩阵的点积及其逆应该是单位矩阵。但是,这里的输出是 -
array([[ 1.00000000e+00, 6.70961522e-16, 3.98202719e-16,
-2.04084178e-15, 3.07963387e-16],
[-6.46120445e-15, 1.00000000e+00, 4.44698794e-16,
1.40254635e-15, 2.71601492e-16],
[ 3.00736839e-15, -5.65091222e-16, 1.00000000e+00,
1.63129995e-16, -6.43576692e-17],
[ 1.01120865e-14, -1.23622826e-15, -6.99882344e-16,
1.00000000e+00, -1.13627444e-16],
[-6.31447442e-15, 2.46897480e-15, 9.95010178e-16,
-2.81959392e-15, 1.00000000e+00]])
请解释。
解决方案
这一定是由于算法舍入,但我发现如果你对矩阵进行对角化并用逆计算点积,你最终会得到单位矩阵。这可能是由于用于计算对角矩阵的逆矩阵的不同算法造成的。
import numpy as np
m = np.random.randn(5,5)
print(np.linalg.det(m))
e = np.linalg.eig(m)[0]
mdiag = np.eye(5)*e
print(mdiag.dot(np.linalg.inv(mdiag)))
这种方法似乎总是适用于 3x3 矩阵,但有时对于更大的矩阵会失败,因为在 1e-17 的顺序中留下了一个虚数部分
推荐阅读
- python - 如何使用标量和数组创建 csv 文件?Python
- tableau-api - 如何在 Tableau 中“硬编码”饼图?
- python - Python - 从列表中弹出一个元素
- dataframe - 在 Julia 中,如果某些列不同,我该如何组合多个数据框?
- python - 在 AWS CodeDeploy 上为 django runserver 命令运行新的 shell 进程
- android - 为什么 Delphi 10.3 App 在 Android 11 中崩溃?
- javascript - 我应该如何在 Typescript 中定义一个动态类型,它应该保留用户输入的实际类型
- javascript - ReactJS如何使用if函数
- javascript - 映射时获取重复按钮
- ios - 如何从字符串中提取值?(迅速)