


⦁ 펜로즈 특성 확인
A = np.array([[-85, -55, -115],
[-35, 97, -167],
[79, 56, 102],
[63, 57, 69],
[45, -8, 97.5]])
# 특이값 분해
U, D, Vt = np.linalg.svd(A, full_matrices=True)
V = Vt.T
Ut = U.T
# 재구성 확인 A = U*D*Vt
Dmat = np.zeros(A.shape, dtype=complex)
Dmat[:D.shape[0], :D.shape[0]]=np.diag(D)
np.allclose(A, np.dot(U, np.dot(Dmat, Vt)))
# 유사역행렬 D+
Dp = np.linalg.pinv(Dmat)
# 유사역행렬 A+
Ap = np.linalg.pinv(A)
np.allclose(Ap, np.dot(V, np.dot(Dp, Ut)))
# 펜로즈 특성 확인
# 1
np.allclose(A, np.dot(A, np.dot(Ap, A)))
# 2
np.allclose(Ap, np.dot(Ap, np.dot(A, Ap)))
# 3
np.allclose(np.dot(A, Ap), np.dot(A, Ap).T)
# 4
np.allclose(np.dot(Ap, A), np.dot(Ap, A).T)