내 이해는 numpy.linalg.lstsq 는 LAPACK 루틴 dgelsd 에 의존 한다는 것 입니다.
문제는 해결하는 것입니다.
minimize(overx)∥Ax−b∥2
물론, 이것은 순위 가 vector 길이보다 작은 행렬 A에 대한 고유 한 솔루션 이 없습니다 . 결정되지 않은 시스템의 경우 솔루션 을 다음과 같이 제공하십시오.bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 모든 만족시키는 . (즉, 는 결정되지 않은 시스템에 대한 최소 표준 솔루션입니다.xAx=bz
예를 들어, 시스템이 이면 numpy.linalg.lstsq는 반환 합니다.x+y=1x=.5,y=.5
dgelsd는 어떻게 작동합니까?
루틴 dgelsd
은 A의 특이 값 분해 (SVD)를 계산합니다 .
SVD를 사용하여 선형 시스템을 해결하는 아이디어를 스케치하겠습니다. 특이 값 분해는 인수 분해 여기서 와 는 직교 행렬이고 는 대각 항목을 특이 값으로 알려진 대각 행렬입니다.UΣV′=AUVΣ
행렬 의 유효 순위 는 사실상 0이 아닌 (즉, 기계 정밀도 등과 관련하여 0과 충분히 다른) 특이 값의 수입니다. 0이 아닌 특이 값의 대각 행렬 이라고하자 . SVD는 다음과 같습니다.AS
A=U[S000]V′
역행렬 의 로 주어진다 :A
A†=V[S−1000]U′
솔루션을 고려하십시오 . 그때:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
기본적으로 두 가지 경우가 있습니다.
- 0이 아닌 특이 값의 수 (즉, 행렬 의 크기 )는 길이보다 작습니다 . 여기서 해결책은 정확하지 않습니다. 우리는 선형 시스템을 최소 제곱의 의미로 해결합니다.Ib
- Ax−b=0
이 마지막 부분은 약간 까다 롭습니다 ... 행렬 차원을 추적하고 가 직교 행렬 임을 사용해야합니다 .U
의사 역수의 동등성
경우 선형 독립적 행을 갖는다 (예를 들어 우리는 지방 행렬을 갖는다.), 다음 :
AA†=A′(AA′)−1
결정되지 않은 시스템의 경우 의사 역수가 최소 표준 솔루션을 제공함을 보여줄 수 있습니다.
경우 선형 독립적 인 열을 갖는 (예를 들어 우리는 마른 행렬을 갖는다.), 다음 :
AA†=(A′A)−1A′