실제 대칭 행렬의 역함수는 이론상 실제 대칭 행렬을 반환해야합니다 (동일한 것은 은닉 행렬에 유효합니다). 그러나 numpy 또는 scipy를 사용하여 역함수를 계산할 때 반환 된 행렬은 비대칭입니다. 이 오류는 숫자 오류로 인한 것임을 이해합니다.대칭 행렬의 역함수
이 비대칭을 피하는 가장 좋은 방법은 무엇입니까? 나는 그것을 수학적으로 유효하게하고 싶다. 계산을 위해서 사용할 때 오류를 더 전파하지 않기를 바란다.
import numpy as np
n = 1000
a =np.random.rand(n, n)
a_symm = (a+a.T)/2
a_symm_inv = np.linalg.inv(a_symm)
if (a_symm_inv == a_symm_inv.T).all():
print("Inverse of matrix A is symmetric") # This does not happen!
else:
print("Inverse of matrix A is asymmetric")
print("Max. asymm. value: ", np.max(np.abs((a_symm_inv-a_symm_inv.T)/2)))
편집
이 문제에 대한 내 솔루션입니다 :
math_symm = (np.triu_indices(len(a_symm_inv), 1))
a_symm_inv[math_symm]=np.tril(a_symm_inv, -1).T[math_symm]
문제는이 라인 :'경우 (a_symm_inv == a_symm_inv.T). all() :'. 부동 소수점 수에 대한 산술 연산이 정확하지 않습니다. 따라서 당신은 그들을 정확하게 비교하려고 시도하면 안됩니다. – cel
부동 소수점 숫자를 사용한 계산이 정확하지 않다는 것을 알고 있습니다. 그러나 그 결과는 대칭 적이기를 바랍니다. 예를 들어 위 삼각형을 행렬의 아래쪽 삼각형으로 다시 씁니다. – blaz
하지만 당신의 문제를 이해하지 못합니다. 결과가 대칭 행렬임을 알기 때문에 부동 소수점을 동등하게 (너무 많은 의미를 갖지는 않음) 강제로 지정하려는 경우, 위 삼각형 행렬의 값으로 하위 삼각형 행렬을 덮어 쓸 수 있습니다. – cel