복붙노트

[PYTHON] numpy.linalg.solve ()가 numpy.linalg.inv ()보다 더 정확한 행렬 반전을 제공하는 이유는 무엇입니까?

PYTHON

numpy.linalg.solve ()가 numpy.linalg.inv ()보다 더 정확한 행렬 반전을 제공하는 이유는 무엇입니까?

Numpy.linalg.solve ()가 좀 더 정확한 답변을 제공하는 반면 numpy.linalg.inv ()는 (내가 믿는) 추정치를 제공하면서 다소 왜 파손되는 지 이해할 수 없습니다.

예를 들어, 방정식 C ^ {- 1} * d를 풀고 있는데 C는 행렬이고, d는 벡터 배열입니다. 토론을 위해 C의 크기는 모양 (1000,1000)이고 d는 모양 (1,1000)입니다.

numpy.linalg.solve (A, b)는 x에 대해 방정식 A * x = b, 즉 x = A ^ {- 1} * b를 풀어 냄. 따라서이 방정식을 다음 중 하나를 통해 풀 수 있습니다.

(1)

inverse = numpy.linalg.inv(C)
result = inverse * d

또는 (2)

numpy.linalg.solve(C, d)

방법 (2)는 훨씬 정확한 결과를 제공합니다. 왜 이런거야?

어떤 사람이 다른 사람보다 "잘 작동"하는 것과 정확히 무슨 일이 일어나고 있습니까?

해결법

  1. ==============================

    1.np.linalg.solve (A, b)는 A의 역수를 계산하지 않습니다. 대신 gesv LAPACK 루틴 중 하나를 호출합니다. 먼저 LU 분해를 사용하여 A를 분해 한 다음 앞으로 및 뒤로 대체를 사용하여 x를 해결합니다 (여기 참조).

    np.linalg.solve (A, b)는 A의 역수를 계산하지 않습니다. 대신 gesv LAPACK 루틴 중 하나를 호출합니다. 먼저 LU 분해를 사용하여 A를 분해 한 다음 앞으로 및 뒤로 대체를 사용하여 x를 해결합니다 (여기 참조).

    np.linalg.inv는 A / A-1 = I에서 A-1을 풀면 A의 역행렬을 계산하기 위해 동일한 방법을 사용합니다. 여기서 I는 정체성입니다. 인수 분해 단계는 위와 정확히 동일하지만 x (n 길이의 벡터)보다 A-1 (n × n 행렬)을 풀기 위해 더 많은 부동 소수점 연산이 필요합니다. 또한, A-1 · b = x 항을 통해 x를 얻고 싶다면 여분의 행렬 곱셈이 더 많은 부동 소수점 연산을 초래하므로 성능이 저하되고 더 많은 숫자 오류가 발생합니다.

    A-1을 계산하는 중간 단계가 필요하지 않습니다. x를 직접 얻는 것이 더 빠르고 정확합니다.

    * inv에 대한 소스의 관련 비트가 여기에 있습니다. 불행하게도 템플릿 화 된 C 이후로 이해하기가 약간 까다 롭습니다. 중요한 점은 항등 행렬이 매개 변수 B로 LAPACK 솔버에 전달된다는 것입니다.

  2. from https://stackoverflow.com/questions/31256252/why-does-numpy-linalg-solve-offer-more-precise-matrix-inversions-than-numpy-li by cc-by-sa and MIT license