지금까지 세 번, 같은 질문에 부딪혔습니다.
66강 문제 3에서 에서 를 소거할 수 없다고 했습니다. 역행렬이 있을 때만 됩니다라고 미뤘습니다.
66강 문제 5에서 정사영은 되돌릴 수 없다고 했습니다. 눌러붙인 정보를 복원할 방법이 없기 때문입니다.
67강 문제 2에서 행 연산이 해집합을 보존하는 근거가 되돌릴 수 있음이었습니다.
세 번 모두 같은 것을 묻고 있습니다.
어떤 행렬을 되돌릴 수 있는가.
이 강의가 그 질문에 답합니다. 답을 요약하면 이렇습니다. 되돌릴 수 있다는 것은 정보를 잃지 않는다는 것이고, 그것은 68강의 계수가 최대일 때이며, 그때 되돌리는 행렬을 실제로 계산할 수 있습니다.
그리고 마지막에 실무의 역설을 다룹니다. 역행렬을 배우고 나면 대개 계산하지 않게 됩니다.
문제. 에 대해 인 를 찾습니다.
(1) 의 성분을 미지수로 두고 방정식을 세우세요.
(2) 를 구하세요.
(3) 일반적인 행렬에 대한 공식을 만드세요.
생각의 실마리. (1)에서 를 열별로 봅니다. 66강 심화 1의 둘째 관점에서 의 첫 열은 이므로, 과 두 개의 연립방정식입니다.
풀이. (1) 로 두면
(2) 첫째를 풀면 , 에서 , 입니다. 둘째에서 , 입니다.
검산에서 가 확인됩니다.
(3) 로 두고 같은 계산을 합니다. 소거하면
**분모가 **이므로 이 값이 이면 가 존재하지 않습니다.
이 문제에서 배우는 것: 역행렬.
역행렬. 정사각행렬 에 대해
인 가 있으면 를 가역이라 하고 를 로 씁니다.
유일합니다. 와 가 모두 역행렬이면
입니다. 결합법칙만 썼습니다.
공식을 기억해 둡니다.
대각을 바꾸고, 반대각의 부호를 바꾸고, 로 나눕니다.
검산에서 이고 입니다.
라는 값이 존재를 가릅니다. 이것이 78강의 행렬식이며, 79강에서 그것이 넓이의 배율임을 봅니다. 넓이 배율이 이라는 것은 평면이 선으로 눌린다는 뜻이므로 되돌릴 수 없습니다. 문제 3에서 이 직관을 정식화합니다.
정의에서 양쪽 곱을 모두 요구한 점도 눈여겨보십시오. 곱셈이 교환적이지 않으므로 와 가 원칙적으로 다른 조건입니다. 정사각행렬에서는 한쪽만 성립해도 다른 쪽이 따라온다는 사실이 있으며 심화 3에서 다룹니다.
바로 확인 1.
확인 1-1. 역행렬의 정의를 쓰세요.
답. 인 이며 로 씁니다.
확인 1-2. 의 역행렬을 구하세요.
답. 이므로 입니다.
확인 1-3. 역행렬이 유일한 이유를 쓰세요.
답. 이므로 두 역행렬이 같습니다.
문제. 의 역행렬을 구합니다.
(1) 문제 1의 방식으로 하면 무엇을 몇 번 해야 합니까?
(2) 그것을 한 번에 처리하는 방법을 만드세요.
(3) 실행해서 을 구하세요.
생각의 실마리. (1)에서 를 에 대해 풀어야 합니다. 왼쪽 행렬이 모두 같고 상수항만 다릅니다. 그러면 소거 과정도 똑같으므로 따로 할 이유가 없습니다.
풀이. (1) 연립방정식 개를 풀어야 하고, 계수행렬이 모두 로 같습니다.
(2) 상수항 세 개를 나란히 붙여 한꺼번에 소거합니다.
왼쪽이 가 되도록 밀면 오른쪽에 답 세 개가 동시에 나타납니다.
(3) 검산에서
이고 가 확인됩니다.
이 문제에서 배우는 것: 가우스-조던 역행렬 계산.
절차. 를 만들어 기약행사다리꼴로 밉니다.
- 왼쪽이 가 되면 오른쪽이 입니다.
- 왼쪽이 가 되지 못하면 는 가역이 아닙니다.
왜 작동하는지를 봅니다. 67강 문제 4에서 소거 전체가 기본행렬의 곱이었습니다. 왼쪽이 가 되었다는 것은
라는 뜻이고, 그러면 입니다. 그런데 같은 연산이 오른쪽 블록에도 적용되었으므로
이 오른쪽에 남습니다. 소거 과정 자체가 을 만들어 냅니다.
검산에서 이것을 직접 확인합니다. 문제 1의 에 대해
이고 입니다.
여기서 중요한 결과가 하나 따라옵니다.
가역행렬은 기본행렬의 곱입니다. 이므로 이고, 기본행렬의 역행렬도 기본행렬입니다.
이 사실이 78강에서 행렬식의 곱셈 성질을 증명할 때 쓰입니다. 기본행렬 하나에 대해 확인하고 곱으로 확장하면 되기 때문입니다.
바로 확인 2.
확인 2-1. 가우스-조던으로 역행렬을 구하는 절차를 쓰세요.
답. 를 기약행사다리꼴로 밀어 을 얻습니다.
확인 2-2. 그 방법이 작동하는 이유를 쓰세요.
답. 소거가 를 만들고 같은 곱이 오른쪽 에 적용되어 이 되기 때문입니다.
확인 2-3. 왼쪽이 가 되지 못하면 무엇을 뜻합니까?
답. 가 가역이 아닙니다.
문제. 를 봅니다.
(1) 공식을 적용해 보세요.
(2) 를 밀면 어떻게 됩니까?
(3) 되돌릴 수 없는 이유를 변환의 언어로 설명하세요.
생각의 실마리. (3)에서 66강 문제 5의 정사영을 떠올립니다. 여러 입력이 같은 출력으로 가면 되돌릴 수 없습니다. 가 그런지 확인하려면 의 비자명해를 찾아보면 됩니다.
풀이. (1) 이므로 공식의 분모가 입니다. 역행렬이 없습니다.
(2) 검산에서 기약행사다리꼴이
이고 피벗 열이 입니다. 왼쪽 블록의 둘째 열에 피벗이 서지 못했습니다. 왼쪽이 가 되지 않으므로 가역이 아닙니다.
(3) 의 두 열이 와 로 평행합니다. 그러면 는 언제나 그 방향의 벡터이므로 평면 전체가 직선으로 눌립니다.
실제로
이므로 와 이 같은 곳으로 갑니다. 서로 다른 입력이 같은 출력을 주면 출력에서 입력을 복원할 수 없습니다.
이 문제에서 배우는 것: 가역의 동치 조건.
가역 판정. 가 일 때 다음은 모두 같은 뜻입니다.
조건 관점 이 존재합니다 정의 계수 RREF가 입니다 소거 피벗이 개입니다 소거 이 자명해뿐입니다 영공간 모든 에 대해 해가 유일합니다 방정식 열들이 일차독립입니다 열 입니다 행렬식(78강)
여덟 조건이 모두 같은 것을 말합니다. 상황에 따라 확인하기 쉬운 것을 고르면 됩니다.
이 목록이 왜 하나로 묶이는지 봅니다. 68강의 판정 정리에서
이었습니다. 68강에서 이미 대부분 증명한 셈이고, 이 강의는 그것을 "되돌리기"의 언어로 옮긴 것입니다.
되돌릴 수 없는 경우를 특이하다고 합니다.
| 용어 | 뜻 |
|---|---|
| 가역, 정칙 | 역행렬이 있습니다 |
| 특이 | 역행렬이 없습니다 |
기하로 정리하면 이렇습니다.
66강 문제 5의 표를 다시 봅니다. 회전·확대·전단은 가역이고 정사영만 특이했습니다. 정사영이 유일하게 차원을 줄이는 변환이었기 때문입니다.
바로 확인 3.
확인 3-1. 이면 는 가역입니까?
답. 아닙니다. 자유변수가 있어 비자명한 영벡터가 존재합니다.
확인 3-2. 열이 일차종속이면 무엇을 뜻합니까?
답. 특이하며 역행렬이 없습니다.
확인 3-3. 특이행렬을 변환으로 설명하세요.
답. 차원을 뭉개어 정보를 잃으므로 되돌릴 수 없습니다.
문제. 가 모두 가역일 때 다음을 구하세요.
(1)
(2)
(3) 과 (cA)^
생각의 실마리. (1)에서 후보를 곱해 가 나오는지 확인하면 됩니다. 역행렬이 유일하므로 하나만 찾으면 끝입니다. 66강 문제 4에서 전치의 곱이 순서를 뒤집었으니 여기서도 그럴 것이라 예상할 수 있습니다.
풀이. (1) 을 시험합니다.
반대쪽도 같습니다. 따라서
순서가 뒤집힙니다.
(2) 의 양변을 전치합니다. 66강의 을 쓰면
이므로
전치와 역은 순서를 바꿔도 됩니다. 검산에서 두 값이 같습니다.
(3) 의 역은 입니다. 정의가 대칭이기 때문입니다. 그리고 이면
입니다.
이 문제에서 배우는 것: 역행렬의 성질.
성질 식 곱 (AB)^{-1}=B^{-1}A^ 전치 (A^{\top})^{-1}=(A^{-1})^ 두 번 스칼라 () 거듭제곱 (A^{k})^{-1}=(A^{-1})^
첫 줄에서 순서가 뒤집히는 것을 기하로 읽으면 자연스럽습니다. 는 "먼저 , 그다음 "이므로 되돌리려면 나중에 한 것부터 되돌려야 합니다. 신발을 신고 외투를 입었으면 벗을 때는 외투부터입니다.
주의할 것이 하나 있습니다. 에는 좋은 공식이 없습니다.
로 확인하면 왼쪽이 이고 오른쪽이 입니다. 덧셈은 곱셈과 달리 역과 잘 어울리지 않습니다. 다만 가 계수 인 특별한 경우에는 공식이 있으며 심화 5에서 다룹니다.
전치와 역이 교환된다는 (2)의 결과도 뒤에서 쓰입니다. 대칭행렬 가 가역이면 도 대칭입니다. 86강의 스펙트럼 정리와 87강의 이차형식에서 이 성질을 씁니다.
바로 확인 4.
확인 4-1. 을 쓰세요.
답. 입니다.
확인 4-2. 을 쓰세요.
답. 입니다.
확인 4-3. 입니까?
답. 아닙니다. 에서 입니다.
문제. 를 풀려고 합니다.
(1) 로 푸는 방법과 소거로 푸는 방법의 계산량을 비교하세요.
(2) 정확도는 어떻습니까?
(3) 결론을 쓰세요.
생각의 실마리. (1)에서 을 구하는 것은 를 미는 것이므로, 상수항이 개인 연립방정식을 푸는 셈입니다. (2)는 실험으로 확인합니다.
풀이. (1) 계산량을 셉니다.
| 방법 | 계산량 |
|---|---|
| 소거 (LU) | |
| 계산 후 곱 | 이상 |
역행렬을 구하는 것이 세 배 이상 비쌉니다. 게다가 구한 뒤 를 계산하는 이 더 붙습니다.
(2) 검산에서 두 가지를 확인합니다.
인 무작위 행렬에서는 잔차가 비슷합니다.
| 방법 | |
|---|---|
solve |
1.105\times10^ |
inv로 곱 |
7.609\times10^ |
여기서는 차이가 없습니다. 조건이 좋은 문제에서는 두 방법 모두 잘 작동합니다.
차이는 조건이 나쁠 때 드러납니다. 힐베르트 행렬 에서 참해가 이 되도록 를 만들고 풀면
| 방법 | |
|---|---|
solve |
2.315\times10^ |
inv로 곱 |
1.183\times10^ |
약 배 차이입니다. 이 행렬의 조건수가 이므로 배정밀도의 한계를 넘어섰고, 두 방법 모두 정확하지 않지만 역행렬 쪽이 훨씬 나쁩니다.
(3) 결론입니다.
이 문제에서 배우는 것: 역행렬은 개념이지 계산법이 아닙니다.
원칙. 를 계산하지 말고 를 푸세요.
이유를 정리합니다.
| 이유 | 내용 |
|---|---|
| 비용 | 세 배 이상 비쌉니다 |
| 정확도 | 조건이 나쁠 때 오차가 커집니다 |
| 희소성 | 가 희소해도 은 대개 빽빽합니다 |
| 불필요 | 대개 자체가 아니라 가 필요합니다 |
셋째 줄이 실무에서 특히 큽니다. 67강 심화 5에서 소거의 채움을 보았는데, 역행렬은 그보다 심합니다. 대각선 근처만 채워진 행렬의 역행렬은 통째로 빽빽해져 저장조차 불가능합니다.
가 여러 개여도 마찬가지입니다. 70강의 LU 분해를 한 번 해 두면 각 에 대해 만 들므로, 역행렬을 구하는 것보다 언제나 낫습니다.
수식에서 을 쓰는 것은 여전히 옳습니다. 표기와 계산을 구별하십시오.
82강에 나올 회귀 공식인데, 이 식을 그대로 코드로 옮기면 안 됩니다. 실제로는 를 풀거나, 더 나아가 QR 분해를 씁니다. 83강에서 그 이유를 자세히 봅니다.
이것이 이 과목에서 반복되는 교훈의 세 번째입니다. 67강 심화 3에서 크라메르 공식이 계산에 쓰이지 않았고, 47강에서 근의 공식보다 뉴턴법이 실용적이었습니다. 닫힌 형태의 공식이 최선의 알고리즘인 경우는 오히려 드뭅니다.
바로 확인 5.
확인 5-1. 대신 무엇을 해야 합니까?
답. 를 소거나 LU 분해로 직접 풉니다.
확인 5-2. 역행렬 계산이 비싼 정도를 쓰세요.
답. 소거의 세 배 이상입니다.
확인 5-3. 희소 행렬에서 역행렬이 왜 문제입니까?
답. 역행렬이 대개 빽빽해져 저장과 계산이 불가능해지기 때문입니다.
| 개념 | 내용 |
|---|---|
| 역행렬 | 인 , 유일합니다 |
| 공식 | \frac{1}{ad-bc}\begin{pmatrix}d&-b\\ -c&a\end |
| 계산법 | |
| 가역 = 기본행렬의 곱 | A^{-1}=E_{k}\cdots E_ |
| 특이 | 역행렬이 없습니다 |
| 가역의 동치 조건 | |
|---|---|
| RREF가 | |
| 열이 일차독립 | |
| 모든 에 유일한 해 |
| 성질 | 식 |
|---|---|
| 곱 | (AB)^{-1}=B^{-1}A^ |
| 전치 | (A^{\top})^{-1}=(A^{-1})^ |
| 두 번 | |
| 스칼라 | (cA)^{-1}=\frac1cA^ |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| (AB)^{-1}=A^{-1}B^ | 순서가 뒤집힙니다 |
| (A+B)^{-1}=A^{-1}+B^ | 성립하지 않습니다 |
코드에서 inv(A)@b |
solve(A,b)를 씁니다 |
| 정사각이 아닌데 역을 찾습니다 | 83강의 의사역행렬입니다 |
문제 6. 의 역행렬을 구하세요.
답. 이므로 입니다.
문제 7. 가 가역입니까?
답. 아닙니다. 이고 두 열이 평행합니다.
문제 8. 이고 가 일 때 가역입니까?
답. 아닙니다. 계수가 여야 합니다.
문제 9. 을 쓰세요.
답. 입니다.
문제 10. 을 쓰세요.
답. 입니다.
문제 11. 가 가역이고 일 때 를 쓰세요.
답. 입니다.
문제 12. 일 때 를 쓰세요.
답. 입니다. 곱하는 쪽이 다릅니다.
문제 13. 대각행렬 의 역행렬을 쓰세요.
답. 입니다.
문제 14. 대각 성분에 이 있는 대각행렬은 가역입니까?
답. 아닙니다. 그 열이 영벡터라 계수가 부족합니다.
문제 15. 회전행렬의 역행렬을 쓰세요.
답. 입니다. 이기 때문입니다.
문제 16. 에 비자명해가 있으면 는 가역입니까?
답. 아닙니다.
문제 17. 를 밀었더니 왼쪽에 영행이 생겼습니다. 무엇을 뜻합니까?
답. 계수가 보다 작으므로 가역이 아닙니다.
문제 18. 코드에서
inv(A) @ b대신 무엇을 씁니까?
답. solve(A, b)를 씁니다.
심화 1. 가역 동치 조건들이 왜 모두 같은지 하나로 꿰어 설명하세요.
풀이. 여덟 조건을 세 묶음으로 나누고 각 묶음 안의 동치를 보인 뒤 묶음끼리 잇습니다.
첫 묶음: 소거의 언어입니다.
정사각행렬에서 피벗이 개면 각 행과 각 열에 하나씩이고, 기약이므로 그 열이 단위벡터입니다. 따라서 RREF가 입니다. 역도 자명합니다.
둘째 묶음: 방정식의 언어입니다.
68강 문제 5에서 자유변수의 개수가 였습니다.
그리고 열의 일차독립이 여기 붙습니다. 이므로
66강 문제 1의 관점이 여기서 값을 합니다.
셋째 묶음: 역행렬의 존재입니다.
이면 이므로 이 를 만족합니다. 그리고 각 가 가역이므로 도 가역이고, 에서 도 따라옵니다. 문제 2의 절차가 곧 이 방향의 증명입니다.
거꾸로 이 존재하면 의 양변에 을 곱해 을 얻으므로 둘째 묶음이 성립합니다.
세 묶음이 이어졌습니다. 남은 것은 인데, 78강에서 행렬식을 정의한 뒤 소거로 계산하면 피벗들의 곱이 되므로 자연스럽게 붙습니다.
이 정리의 실용적 가치는 가장 확인하기 쉬운 조건을 고를 수 있다는 데 있습니다.
| 상황 | 쓰기 좋은 조건 |
|---|---|
| 삼각행렬 | 대각에 이 없습니다 |
| 손으로 소거 중 | 피벗이 개 |
| 열의 구조가 보임 | 일차독립 |
| 이론 전개 |
심화 2. 정사각행렬에서 이면 임을 보이세요.
풀이. 정의에서 양쪽 곱을 요구했는데, 정사각행렬에서는 한쪽만 확인해도 충분합니다.
가 모두 이고 라고 합니다.
1단계. 가 가역입니다. 이라 하면 양변에 를 곱해
입니다. 이므로 심화 1에 의해 가 가역입니다.
2단계. 입니다. 의 오른쪽에 을 곱하면
입니다. 따라서 입니다.
정사각이라는 조건이 결정적입니다. 직사각에서는 성립하지 않습니다.
에서 이지만
입니다. 는 의 오른쪽 역이지만 왼쪽 역은 아닙니다.
기하로 읽으면 분명합니다. 가 를 에 끼워 넣고 가 셋째 성분을 버립니다. 끼워 넣은 뒤 버리면 제자리이지만, 버린 뒤 끼워 넣으면 셋째 성분이 사라진 채입니다.
이 예가 보여 주는 것은 차원이 다르면 완전한 되돌리기가 불가능하다는 점입니다. 인 행렬에는 양쪽 역이 존재할 수 없으며, 그 대신 쓰는 것이 83강의 의사역행렬입니다.
심화 3. 블록 삼각행렬의 역행렬을 구하고 슈어 보수를 소개하세요.
풀이. 66강 심화 3의 블록 곱셈을 씁니다. 다음을 봅니다.
역행렬을 같은 모양으로 가정하고 미지 블록을 찾습니다.
왼쪽 아래에서 이므로 가 가역이면 입니다. 그러면 왼쪽 위에서 이므로 이고, 오른쪽 아래에서 이므로 입니다. 오른쪽 위는
입니다. 정리하면
검산에서 , , 일 때 결과가
이고 np.linalg.inv와 일치합니다.
일반 블록 행렬에서는 왼쪽 아래가 이 아니므로 더 복잡합니다.
에서 블록 소거를 하면 (둘째 블록행에서 첫째의 배를 뺍니다)
가 되고, 여기 나타난
를 슈어 보수라 합니다. 이 가역일 조건이 와 가 모두 가역인 것이 됩니다.
슈어 보수가 나타나는 곳이 많습니다.
| 분야 | 용도 |
|---|---|
| 최적화 | 제약 있는 문제의 KKT 시스템 |
| 통계 | 다변량 정규분포의 조건부 분산 |
| 수치해석 | 영역 분할법 |
| 제어 | 리카티 방정식 |
둘째 줄이 특히 인상적입니다. 다변량 정규분포에서 일부 변수를 관측했을 때 나머지의 조건부 공분산이 정확히 슈어 보수이며, 130강대의 확률 과목에서 다시 봅니다.
심화 4. 셔먼-모리슨 공식을 유도하고 그 쓰임을 밝히세요.
풀이. 문제 4에서 에 좋은 공식이 없다고 했습니다. 그런데 가 계수 이면 있습니다.
유도. 오른쪽을 라 하고 를 확인합니다. 로 두면
마지막 항에서 은 스칼라이므로 밖으로 뺍니다.
괄호 안이 정확히 입니다.
이면 공식이 무너지는데, 그때는 실제로 이 특이합니다.
검산에서 , , 일 때 이고 공식의 결과가 직접 계산한 역행렬과 일치합니다.
쓰임이 큽니다. 을 이미 알고 있을 때 가 계수 만큼 바뀌면 다시 계산하지 않고 갱신할 수 있습니다.
| 방법 | 계산량 |
|---|---|
| 처음부터 다시 | n^ |
| 셔먼-모리슨 | n^ |
이 크면 결정적인 차이입니다.
응용을 봅니다.
| 분야 | 갱신되는 것 |
|---|---|
| 칼만 필터 | 관측이 하나 들어올 때 공분산 |
| 준뉴턴법 | BFGS의 헤세 근사 |
| 온라인 회귀 | 데이터가 하나 추가될 때 |
| 교차검증 | 표본 하나를 뺐을 때 |
둘째 줄이 47강의 뉴턴법과 이어집니다. 뉴턴법은 매 단계 이계도함수 행렬의 역을 필요로 하는데, 그것을 직접 계산하는 대신 계수 또는 의 갱신으로 근사해 가는 것이 준뉴턴법입니다. 209강에서 다시 봅니다.
일반화도 있습니다. 계수가 인 갱신에 대해서는 우드버리 항등식이 있으며, 슈어 보수와 밀접합니다.
심화 5. 역행렬이 없을 때 무엇을 하는지 세 갈래로 정리하세요.
풀이. 가 특이하거나 정사각이 아니면 이 없습니다. 그래도 비슷한 것을 풀고 싶을 때 세 가지 길이 있습니다.
첫째, 근사합니다. 를 정확히 만족하는 것이 없으면 가장 가까운 것을 찾습니다.
이것이 82강의 최소제곱이며, 정규방정식 로 귀착됩니다. 64강의 정사영이 기하적 정체입니다.
둘째, 고릅니다. 해가 무수히 많으면 그중 하나를 규칙으로 뽑습니다. 흔한 규칙은 노름이 최소인 것입니다.
**두 규칙을 합친 것이 의사역행렬 **입니다. 언제나 존재하고 유일하며, 가 가역이면 입니다. 88강의 특이값 분해로 계산합니다.
| 상황 | 가 주는 것 |
|---|---|
| 가역 | 정확한 해 |
| 과결정 | 최소제곱 해 |
| 부족결정 | 최소 노름 해 |
| 둘 다 | 최소제곱 중 최소 노름 |
셋째, 바꿉니다. 문제 자체를 조금 고쳐 가역으로 만듭니다.
이면 가 언제나 가역입니다. 87강에서 그것이 양정치임을 보이며, 이것이 능형회귀이고 233강의 가중치 감쇠와 같습니다.
세 갈래를 비교합니다.
| 길 | 무엇을 포기하는가 | 얻는 것 |
|---|---|---|
| 근사 | 정확한 해 | 언제나 답이 있습니다 |
| 고르기 | 해의 유일성이 준 뜻 | 하나로 정해집니다 |
| 바꾸기 | 원래 문제 | 안정성 |
셋 다 사람이 추가 정보를 넣는 것입니다. 데이터가 결정하지 못하는 부분을 무엇으로 채울지 정하는 일이며, 그 선택이 곧 모형의 가정입니다. 67강 심화 6에서 조건이 나쁜 문제를 다룰 때 한 이야기와 같습니다.
심화 6. 역행렬을 쓰지 않고 같은 목적을 이루는 방법들을 정리하세요.
풀이. 문제 5에서 를 계산하지 말라고 했습니다. 그러면 이 나오는 여러 상황을 각각 어떻게 처리하는지 정리합니다.
상황 1:
한 번이면 소거, 여러 면 LU 분해를 재사용합니다.
| 방법 | 준비 | 마다 |
|---|---|---|
| LU 분해 | n^ | |
| 역행렬 | 이상 | n^ |
준비 비용만 다르고 이후는 같습니다. LU가 언제나 유리합니다. 70강에서 다룹니다.
상황 2: (오른쪽이 행렬)
를 열별로 푸는 것이며 역시 LU 재사용입니다. 대부분의 수치 라이브러리가 이 연산을 직접 제공합니다.
상황 3: (이차형식)
를 풀고 를 계산합니다. 가우스 과정 회귀와 마할라노비스 거리에서 이 꼴이 나옵니다.
상황 4:
행렬식을 계산해 로그를 취하면 넘침이 납니다. LU 분해의 대각 성분에 로그를 씌워 더합니다.
이고 이어도 안전합니다. 확률 모형의 우도 계산에서 늘 이렇게 합니다.
상황 5: 가 특별한 구조를 가짐
| 구조 | 방법 |
|---|---|
| 대각 | 성분별 나눗셈 |
| 삼각 | 전진·후진 대입만 () |
| 직교 | (80강) |
| 대칭 양정치 | 콜레스키 분해 () |
| 순환 | FFT로 대각화 (60강) |
구조를 알면 훨씬 싸집니다. 셋째 줄이 특히 좋습니다. 직교행렬은 전치만 하면 되므로 계산이 사실상 공짜이고, 그래서 80강의 QR 분해와 88강의 특이값 분해가 실무에서 선호됩니다.
정리하면 역행렬을 명시적으로 만들어야 하는 경우는 거의 없습니다. 굳이 필요하다면 공분산 행렬의 역을 해석하려는 경우 정도인데, 그때조차 성분 하나하나가 아니라 조건부 독립 구조를 읽으려는 것이므로 다른 방법이 있습니다.
이 강의에서는 numpy만 씁니다. 68강의 rref를 그대로 써서 를 밀고, 성질들을 확인하며, 역행렬로 푸는 것이 왜 나쁜지를 수치로 보이는 것이 핵심입니다.
import numpy as np
def rref(M):
R = M.astype(float).copy(); m, n = R.shape; r = 0; piv = []
for c in range(n):
k = None
for i in range(r, m):
if abs(R[i, c]) > 1e-12: k = i; break
if k is None: continue
if k != r: R[[r, k]] = R[[k, r]]
R[r] = R[r] / R[r, c]
for i in range(m):
if i != r and abs(R[i, c]) > 1e-12: R[i] -= R[i, c] * R[r]
piv.append(c); r += 1
if r == m: break
return np.round(R, 10), piv
# --- 문제 1: 2x2 공식 ---------------------------------------------------
A = np.array([[1.,2.],[3.,4.]])
det = A[0,0]*A[1,1] - A[0,1]*A[1,0]
Ainv = np.array([[A[1,1],-A[0,1]],[-A[1,0],A[0,0]]])/det
print(det, Ainv.tolist()) # -2.0 [[-2.0, 1.0], [1.5, -0.5]]
print(np.round(A@Ainv,10).tolist(), np.round(Ainv@A,10).tolist())
# [[1.0, 0.0], [0.0, 1.0]] [[1.0, 0.0], [0.0, 1.0]]
# --- 문제 2: [B | I] -> [I | B^-1] --------------------------------------
B = np.array([[2.,1.,1.],[1.,3.,2.],[1.,0.,0.]])
R, p = rref(np.column_stack([B, np.eye(3)]))
Binv = R[:, 3:]
print(np.round(Binv,10).tolist())
# [[0.0, 0.0, 1.0], [-2.0, 1.0, 3.0], [3.0, -1.0, -5.0]]
print(np.round(B@Binv,10).tolist())
# [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
print(np.allclose(Binv, np.linalg.inv(B))) # True
# --- 문제 3: 특이행렬은 왼쪽이 I가 되지 못합니다 ------------------------
C = np.array([[1.,2.],[2.,4.]])
R2, p2 = rref(np.column_stack([C, np.eye(2)]))
print(R2.tolist(), p2, int(np.linalg.matrix_rank(C)))
# [[1.0, 2.0, 0.0, 0.5], [-0.0, -0.0, 1.0, -0.5]] [0, 2] 1
# 피벗이 왼쪽 블록의 1번 열이 아니라 오른쪽 블록(2번 열)에 섰습니다
# --- 문제 4: 곱과 전치의 역 ---------------------------------------------
P = np.array([[1.,1.],[0.,1.]]); Q = np.array([[2.,0.],[1.,1.]])
print(np.round(np.linalg.inv(P@Q),10).tolist()) # [[0.5, -0.5], [-0.5, 1.5]]
print(np.round(np.linalg.inv(Q)@np.linalg.inv(P),10).tolist()) # 같습니다
print(np.round(np.linalg.inv(P.T),10).tolist(),
np.round(np.linalg.inv(P).T,10).tolist())
# [[1.0, 0.0], [-1.0, 1.0]] [[1.0, 0.0], [-1.0, 1.0]]
# --- 문제 5: solve 대 inv ------------------------------------------------
rng = np.random.default_rng(3)
M = rng.standard_normal((200,200)); b = rng.standard_normal(200)
print("%.3e" % float(np.linalg.norm(M@np.linalg.solve(M,b) - b)),
"%.3e" % float(np.linalg.norm(M@(np.linalg.inv(M)@b) - b)))
# 1.105e-12 7.609e-13 (조건이 좋으면 잔차는 비슷합니다)
H = np.array([[1/(i+j+1) for j in range(12)] for i in range(12)]) # 힐베르트
xh = np.ones(12); bh = H@xh
print("%.3e" % float(np.linalg.norm(np.linalg.solve(H,bh) - xh)),
"%.3e" % float(np.linalg.norm(np.linalg.inv(H)@bh - xh)))
# 2.315e-01 1.183e+01 (조건이 나쁘면 약 50배 차이가 납니다)
print("%.3e" % float(np.linalg.cond(H))) # 1.715e+16
# --- 심화 1: 소거 자체가 A^-1을 만듭니다 --------------------------------
E1 = np.array([[1.,0.],[-3.,1.]])
E2 = np.array([[1.,0.],[0.,-0.5]])
E3 = np.array([[1.,-2.],[0.,1.]])
print(np.round(E3@E2@E1,10).tolist()) # [[-2.0, 1.0], [1.5, -0.5]]
print(np.round(E3@E2@E1@A,10).tolist()) # [[1.0, 0.0], [0.0, 1.0]]
# --- 심화 4: 셔먼-모리슨 ------------------------------------------------
A5 = np.array([[4.,1.,0.],[1.,3.,1.],[0.,1.,2.]])
u = np.array([1.,0.,2.]); v = np.array([0.,1.,1.])
Ai = np.linalg.inv(A5); den = 1 + v @ Ai @ u
sm = Ai - np.outer(Ai@u, v@Ai)/den
print(float(den), bool(np.allclose(sm, np.linalg.inv(A5 + np.outer(u,v)))))
# 1.7222222222222223 True
실행하면 주석과 같은 값이 나옵니다. 다섯 곳을 짚어 둡니다.
첫째, 공식이 맞습니다. 이고 양쪽 곱이 모두 입니다.
둘째, 를 밀면 오른쪽에 이 그대로 나오고 np.linalg.inv와 일치합니다. 직접 구현한 절차가 라이브러리와 같은 답을 줍니다.
셋째, 특이행렬의 신호가 68강의 방식으로 읽힙니다. 피벗 열이 [0, 2]인데 번 열은 오른쪽 블록입니다. 왼쪽 블록의 번 열에 피벗이 서지 못했으므로 왼쪽이 가 될 수 없고, 계수가 입니다.
넷째, 과 이 모두 확인됩니다.
다섯째가 이 강의의 실무적 핵심입니다. 조건이 좋으면 두 방법의 잔차가 비슷합니다. 무작위 에서 오히려 inv 쪽 잔차가 약간 작게 나왔습니다. 그러니 "역행렬은 언제나 부정확하다"고 말하면 과장입니다. 차이가 드러나는 곳은 조건이 나쁜 문제이며, 힐베르트 행렬에서 오차가 대 로 약 배 벌어집니다. 조건수가 이라 두 방법 다 신뢰할 수 없지만, 역행렬 쪽이 확실히 더 나쁩니다. 여기에 비용 차이 세 배가 더해지므로 결론은 분명합니다.
코드로 할 수 없는 일도 분명히 해 둡니다. 가역 동치 조건이 모두 같다는 것은 실험으로 확인할 수 없습니다. 심화 1의 증명이 그 자리를 맡습니다. 그리고 잔차가 작다고 해가 정확한 것도 아닙니다. 조건이 나쁘면 잔차는 작은데 해가 크게 틀릴 수 있으며, 힐베르트 예가 그 경우입니다. 무엇을 재고 있는지 늘 확인해야 합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| A^ | 역행렬 | 입니다 |
| 가역, 정칙 | invertible | 역행렬이 있습니다 |
| 특이 | singular | 역행렬이 없습니다 |
| 행렬식 | 에서 가역을 가릅니다 | |
| 첨가 | 역행렬 계산의 출발점입니다 | |
| 슈어 보수 | Schur complement | 입니다 |
| 셔먼-모리슨 | Sherman-Morrison | 계수 갱신의 역행렬입니다 |
| A^ | 의사역행렬 | 언제나 존재합니다 (83강) |
다음 70강에서는 소거의 결과를 저장합니다. 67강 문제 4에서 를 얻었고, 행 교환이 없으면 왼쪽 곱이 아래삼각행렬임을 보았습니다. 그것이 이며, 한 번 분해해 두면 상수항이 달라져도 다시 소거하지 않습니다. 이 단원을 닫는 실용적 결론입니다.