복붙노트

[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. ==============================

    1.첫 번째 해결책은 행렬이 매우 단수이어서 numpy가 전혀 대처할 수없는 경우를 포착합니다. 잠재적으로 상당히 극단적 인 경우입니다. numpy가 답을 제공하는 경우를 잡아 내기 때문에 두 번째 해법이 더 좋지만 반올림 오류로 해답이 손상 될 가능성이 있습니다. 이는 훨씬 합리적인 것 같습니다.

    첫 번째 해결책은 행렬이 매우 단수이어서 numpy가 전혀 대처할 수없는 경우를 포착합니다. 잠재적으로 상당히 극단적 인 경우입니다. numpy가 답을 제공하는 경우를 잡아 내기 때문에 두 번째 해법이 더 좋지만 반올림 오류로 해답이 손상 될 가능성이 있습니다. 이는 훨씬 합리적인 것 같습니다.

    나쁜 조건의 행렬을 뒤집으려고한다면, 특이 값 분해를 고려해야합니다. 신중하게 사용하면 다른 루틴이 실패하는 경우 현명한 대답을 줄 수 있습니다.

    SVD를 원하지 않으면 inv 대신 lu_factor를 사용하는 것에 대한 내 의견을 참조하십시오.

  2. ==============================

    2.그래서 여기에 입력을 기반으로, 솔루션으로 명시적인 테스트로 내 원래 코드 블록을 표시 해요 :

    그래서 여기에 입력을 기반으로, 솔루션으로 명시적인 테스트로 내 원래 코드 블록을 표시 해요 :

    if linalg.cond(x) < 1/sys.float_info.epsilon:
        i = linalg.inv(x)
    else:
        #handle it
    

    놀랍게도 numpy.linalg.inv 함수는이 테스트를 수행하지 않습니다. 나는 코드를 점검하고 그것이 모든 음모를 통해 발견 된 다음 lapack 루틴을 호출합니다. 매우 비효율적 인 것처럼 보입니다. 또한, DaveP에 의해 만들어진 점은 두 번째입니다. 명시 적으로 필요하지 않으면 행렬의 역행렬을 계산해서는 안됩니다.

  3. ==============================

    3.행렬의 조건 수를 역행렬인지 계산해야합니다.

    행렬의 조건 수를 역행렬인지 계산해야합니다.

    import numpy.linalg
    
    if numpy.isfinite(numpy.linalg.cond(A)):
        B = numpy.linalg.inv(A)
    else:
        # handle it
    
  4. ==============================

    4.행렬식이 0이 아닌지 확인하는 것이 어떨까요?

    행렬식이 0이 아닌지 확인하는 것이 어떨까요?

    det = numpy.linalg.det(A)
    if det != 0:
       #proceed
    
  5. from https://stackoverflow.com/questions/13249108/efficient-pythonic-check-for-singular-matrix by cc-by-sa and MIT license