[PYTHON] numpy.linalg.solve ()가 numpy.linalg.inv ()보다 더 정확한 행렬 반전을 제공하는 이유는 무엇입니까?
PYTHONnumpy.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.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 솔버에 전달된다는 것입니다.
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
'PYTHON' 카테고리의 다른 글
[PYTHON] 기존의 TensorFlow 계산 그래프를 수정할 수 있습니까? (0) | 2018.11.23 |
---|---|
[PYTHON] Windows, Python 2.6에 PygraphViz 설치하기 (0) | 2018.11.23 |
[PYTHON] 파이썬 사전에 새 항목 추가 [duplicate] (0) | 2018.11.23 |
[PYTHON] 파이썬 - 문자열에서 연속 된 경우에만 중복을 제거하는 방법? (0) | 2018.11.23 |
[PYTHON] 판다는 문자열에서 숫자를 추출합니다. (0) | 2018.11.23 |