Numpy에서 행렬 반전의 복잡성


11

밀도가 높은 정방 행렬을 반전시키는 데 필요한 미분 방정식을 풀고 있습니다. 이 행렬 반전은 계산 시간을 가장 많이 소비하므로 사용 가능한 가장 빠른 알고리즘을 사용하고 있는지 궁금합니다.

내 현재 선택은 numpy.linalg.inv 입니다. 내 숫자에서 나는 그것이 n ( 행 수 ) 인 로 확장되는 것을 알기 O(n3)때문에 방법은 가우시안 제거 인 것처럼 보입니다.

Wikipedia 에 따르면 사용 가능한 빠른 알고리즘이 있습니다. 이것을 구현하는 라이브러리가 있는지 아는 사람이 있습니까?

왜 더 빠른 알고리즘을 사용하여 numpy를 사용하지 않는지 궁금합니다.


매트릭스를 먼저 수행해야합니다. Scipy를보십시오. 당신의 도움을 위해 스파 스. 필요한 많은 도구가 포함되어 있습니다.
Tobal

@Tobal 확실하지 않습니다 ... 어떻게 매트릭스를 "수행"합니까? 정확히 어떻게 scipy.sparse도움이 될까요?
GoHokies

@GoHokies scipy는 numpy를 보완합니다. 고밀도 / 희소 행렬은 일부 계산을 수행하기 전에 구현해야 계산이 향상됩니다. 이 docs.scipy.org/doc/scipy/reference/sparse.html을 읽으십시오 . 저의 영어 실력이 나보다 잘 설명되어 있습니다.
Tobal

@Tobal이 질문은 특히 밀도높은 행렬에 관한 것이므로 scipy.sparse여기서 어떻게 관련이 있는지 모르겠습니다 .
Christian Clason

2
@ Tobal-나는 아직도 이해하지 못한다고 생각합니다. "매트릭스 프리폼"과 "어떤 계산을 수행하기 전에 매트릭스를 제대로 구현해야"한다는 것은 정확히 무엇을 의미합니까? 마지막 의견과 관련하여 희소 행렬과 밀도 행렬에 사용할 수있는 기술이 매우 다르다는 데 동의합니다.
Wolfgang Bangerth

답변:


21

(이것은 의견이 너무 길어지고 있습니다 ...)

실제로 알고리즘에서 역을 계산해야한다고 가정합니다. (1) 먼저, 이러한 대안 알고리즘을 실제로 주장하지 않는 것이 중요합니다 빨리 더 나은 점근 적 복잡성 (더 느리게 기초 작업의 필요한 수의 성장을 의미)가 단지. 실제로, 실제로 는 다음과 같은 이유로 표준 접근법 (주어진 n ) 보다 실제로 (훨씬) 느립니다 .

  1. 표기법 수피의 힘 앞의 정수 N 천문학적 클 수있다 - 그렇게 큰 것을 C는 (1) N (3) 보다 훨씬 작을 수있다 C 2 N 2 X 임의 대 N 의 모든 컴퓨터에 의해 처리 될 수있다 가까운 미래에. (예를 들어, Coppersmith–Winograd 알고리즘의 경우입니다.)영형122.엑스

  2. 복잡성은 모든 (산술) 연산에 동일한 시간이 걸린다고 가정하지만 실제 실제와는 거리가 멀다. 동일한 숫자를 여러 번 곱하는 것이 같은 양의 다른 숫자를 곱하는 것보다 훨씬 빠릅니다 . 이는 현재 컴퓨팅의 주요 병목 현상이 해당 데이터에 대한 실제 산술 연산이 아니라 데이터를 캐시로 가져오고 있기 때문입니다. 따라서 첫 번째 상황 ( 캐시 인식 이라고 함)을 갖도록 재배치 할 수있는 알고리즘 은 이것이 불가능한 알고리즘 보다 훨씬 빠릅니다. (예를 들어 Strassen 알고리즘의 경우입니다.)

또한 수치 적 안정성은 최소한 성능만큼 중요합니다. 그리고 여기서도 표준 접근법이 일반적으로 이깁니다.

영형()영형(2.엑스)


(1) 나는 이것이 매우 드물게 정말 필요가 없다는 것을 지적하지 않은 경우 그러나 나는 나쁘게 것 : 언제 당신이 제품 계산할 필요가 - 1 개 (B)를 , 대신 선형 시스템 해결해야 X = B (예를 들어, 사용 ) 사용은 X 대신 -이 더욱 안정적이고, (행렬의 구조에 따라 수행 될 수 ) 훨씬 신속. 당신이 사용해야하는 경우 - (1) 여러 번, 당신의 인수 분해 미리 계산 할 수 나중에 재사용 (일반적으로 가장 비싼 해결의 일부입니다).1엑스=numpy.linalg.solve엑스1


특히 이론 속도와 실제 속도 사이에 큰 차이를 만드는 세부 사항 (큰 O 표기법의 상수)에서 악마를 지적 해 주셔서 감사합니다.
gaborous

"반드시 거의 필요하지 않습니다"부분을 더 강조해야한다고 생각합니다. 만약 미분 방정식을 푸는 것이 목적이라면, 완전한 역수가 필요한 것 같지는 않습니다.
Jared Goguen

@o_o 글쎄, 그것은 첫 번째 원래 의견이었습니다 (모든 답변을 하나의 답변으로 통합 한 후에 삭제했습니다). 그러나 사이트 (및 이후 독자)의 이익을 위해 XY 문제가있는 경우에도 대답은 문제의 실제 질문 (합리적이고 주제가 모두)에 대답해야한다고 생각했습니다. 또한, 나는 너무 ... 훈계 소리를하고 싶지 않았다
기독교 Clason

1

1

4

numpy 소스 코드 ( https://github.com/numpy/numpy/blob/master/numpy/linalg/umath_linalg.c.src 참조 ) 에 깊이 묻혀 있는 inv 루틴은 dgetrf 함수를 호출하려고 시도합니다. 시스템 LAPACK 패키지에서 원래 매트릭스의 LU 분해를 수행합니다. 이것은 가우시안 제거와 거의 동일하지만 고성능 BLAS에서 더 빠른 매트릭스 곱셈 알고리즘을 사용하여 복잡성을 약간 낮출 수 있습니다.

이 경로를 따르는 경우 배포와 함께 제공된 시스템 라이브러리가 아닌 전체 라이브러리 체인을 사용하여 새 라이브러리를 사용하도록하는 것이 상당히 복잡하다는 경고를 받아야합니다. 최신 컴퓨터 시스템의 한 가지 대안은 scaLAPACK 또는 (python 세계에서는) petsc4py와 같은 패키지를 사용하여 병렬화 된 방법을 보는 것입니다. 그러나 이들은 일반적으로 직접적인 방법에 적용되는 것보다 선형 대수 시스템에 대한 반복 솔버로 사용되며, 특히 고밀도 시스템보다 스파 스 시스템을 대상으로하는 PETSc가 더 행복합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.