[PYTHON] 특이 매트릭스에 대한 효율적이고 비단뱀 체크
PYTHON특이 매트릭스에 대한 효율적이고 비단뱀 체크
여기에서 일부 행렬 대수에 대한 작업. 때로는 단수이거나 조건이 좋지 않은 행렬을 뒤집을 필요가 있습니다. 간단히 이렇게하는 것이 파이썬이라고 이해합니다.
try:
i = linalg.inv(x)
except LinAlgErr as err:
#handle it
그러나 그것이 얼마나 효율적인지 확신 할 수 없습니다. 이게 더 나아지지 않을까요?
if linalg.cond(x) < 1/sys.float_info.epsilon:
i = linalg.inv(x)
else:
#handle it
numpy.linalg는 내가 금지 한 시험을 단순히 수행합니까?
해결법
-
==============================
1.첫 번째 해결책은 행렬이 매우 단수이어서 numpy가 전혀 대처할 수없는 경우를 포착합니다. 잠재적으로 상당히 극단적 인 경우입니다. numpy가 답을 제공하는 경우를 잡아 내기 때문에 두 번째 해법이 더 좋지만 반올림 오류로 해답이 손상 될 가능성이 있습니다. 이는 훨씬 합리적인 것 같습니다.
첫 번째 해결책은 행렬이 매우 단수이어서 numpy가 전혀 대처할 수없는 경우를 포착합니다. 잠재적으로 상당히 극단적 인 경우입니다. numpy가 답을 제공하는 경우를 잡아 내기 때문에 두 번째 해법이 더 좋지만 반올림 오류로 해답이 손상 될 가능성이 있습니다. 이는 훨씬 합리적인 것 같습니다.
나쁜 조건의 행렬을 뒤집으려고한다면, 특이 값 분해를 고려해야합니다. 신중하게 사용하면 다른 루틴이 실패하는 경우 현명한 대답을 줄 수 있습니다.
SVD를 원하지 않으면 inv 대신 lu_factor를 사용하는 것에 대한 내 의견을 참조하십시오.
-
==============================
2.그래서 여기에 입력을 기반으로, 솔루션으로 명시적인 테스트로 내 원래 코드 블록을 표시 해요 :
그래서 여기에 입력을 기반으로, 솔루션으로 명시적인 테스트로 내 원래 코드 블록을 표시 해요 :
if linalg.cond(x) < 1/sys.float_info.epsilon: i = linalg.inv(x) else: #handle it
놀랍게도 numpy.linalg.inv 함수는이 테스트를 수행하지 않습니다. 나는 코드를 점검하고 그것이 모든 음모를 통해 발견 된 다음 lapack 루틴을 호출합니다. 매우 비효율적 인 것처럼 보입니다. 또한, DaveP에 의해 만들어진 점은 두 번째입니다. 명시 적으로 필요하지 않으면 행렬의 역행렬을 계산해서는 안됩니다.
-
==============================
3.행렬의 조건 수를 역행렬인지 계산해야합니다.
행렬의 조건 수를 역행렬인지 계산해야합니다.
import numpy.linalg if numpy.isfinite(numpy.linalg.cond(A)): B = numpy.linalg.inv(A) else: # handle it
-
==============================
4.행렬식이 0이 아닌지 확인하는 것이 어떨까요?
행렬식이 0이 아닌지 확인하는 것이 어떨까요?
det = numpy.linalg.det(A) if det != 0: #proceed
from https://stackoverflow.com/questions/13249108/efficient-pythonic-check-for-singular-matrix by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 열린 파일의 경로를 가져옵니다. (0) | 2018.11.15 |
---|---|
[PYTHON] VectorAssembler의 출력에서 Spark ML의 열 이름으로 다시 기능을 매핑하는 방법은 무엇입니까? (0) | 2018.11.15 |
[PYTHON] 행렬 차원을 보존하면서 numpy 배열을 직렬화하려면 어떻게해야합니까? (0) | 2018.11.14 |
[PYTHON] Python pandas to_excel 'utf8'코덱에서 바이트를 디코딩 할 수 없습니다. (0) | 2018.11.14 |
[PYTHON] 판다를 사용하여 행당 다른 수의 열로 CSV 가져 오기 (0) | 2018.11.14 |