2024.4.4 疑似逆行列【numpy】
非正方行列には疑似逆行列が定義される。
$ A : m x n
このとき、$ A^+ = (A^T A)^{-1}A^T を$ Aの疑似逆行列(ムーア・ペンローズの疑似逆行列、pseudo inverse matrix)とよぶ。
確認
$ \mathbf{x} : n-vector
$ \mathbf{b} : m-vector
とすると、
$ A \mathbf{x} = \mathbf{b}
に対して左から疑似逆行列を掛ける。
$ A^+ A \mathbf{x} = A^+ \mathbf{b}
$ (A^T A)^{-1}A^TA\mathbf{x} = A^+\mathbf{b}
$ \mathbf{x} = A^+ \mathbf{b}
となる。
code:pinv01.py
import numpy as np
from numpy.linalg import pinv, matrix_rank, inv, norm, cond
A = np.random.random(3, 5) Apinv = pinv(A)
print('生成された行列のサイズ', Apinv.shape)
print('生成された行列のランク', matrix_rank(Apinv))
print('norm of A A+ A = A')
print(norm(A @ Apinv @ A - A))
print('norm of A+ A A+ = A+')
print(norm(Apinv @ A @ Apinv - Apinv))
print('norm of (A A+)* = A A+')
print(norm(np.conjugate(A @ Apinv).T - A @ Apinv))
print('norm of (A+ A)* = A+ A')
print(norm(np.conjugate(Apinv @ A).T - Apinv @ A))