python / numpy で特異値分解(SVD)を使って一般化逆行列を計算する

一般化逆行列(擬似逆行列,最小二乗法に対応するやつ)を python で計算するサンプル

特異値分解(SVD)が必要なので,実装は numpy を使います

c++/eigen で実装したコード https://pyopyopyo.hatenablog.com/entry/2021/09/07/090000python版になります

import numpy as np

A = np.random.random((3,3))

# SVDを使って,A を U @ S @ Vh の形に分解する
U,S,Vh = np.linalg.svd(A)

# 検算. U @ np.diag(S) @ Vh は A と一致する
assert np.allclose(U@np.diag(S)@Vh, A)

# 一般化逆行列を計算する
#  A = U @ np.diag(S) @ Vh
# だから
# A+ = Vh.T @ np.diag(1./S) @ U.T
#
Ainv = Vh.T @ np.diag(1./S) @ U.T

# 検算.  A と A+ の積 m は単位行列に一致する
m = A@Ainv
assert np.allclose(m, np.identity(3))