대각화에는 두 가지 제약이 있었습니다.
첫째, 정사각행렬에만 됩니다. 고유값 방정식 에서 좌변과 우변의 차원이 같아야 하기 때문입니다.
둘째, 정사각이어도 언제나 되는 것은 아닙니다. 85강 문제 5의 결손 행렬이 그렇습니다.
86강에서 대칭행렬은 두 문제가 모두 사라짐을 보았습니다. 그런데 실무의 행렬이 대칭인 것도 아니고 정사각인 것도 아닙니다. 데이터 행렬은 대개 이며 입니다.
있습니다. 제약을 하나 풀면 됩니다. 77강 문제 5에서 본 대로 정의역과 공역에서 기저를 따로 잡으면 자유도가 커집니다.
와 가 각각 직교행렬이고 가 대각입니다. 모든 행렬에 대해 언제나 존재하며, 이 과목에서 가장 강력한 도구입니다.
그리고 이미 준비가 끝났습니다. 87강 심화 2에서 가 양반정치라 고유값이 음이 아니었는데, 그 제곱근이 특이값입니다.
문제. 을 봅니다.
(1) 와 의 고유값을 구하세요.
(2) 두 결과를 비교하세요.
(3) 그 제곱근을 계산하세요.
생각의 실마리. 는 이라 고유값을 물을 수 없습니다. **그런데 는 이고 은 **이며, 둘 다 대칭이라 86강의 정리가 적용됩니다.
풀이. (1) 검산에서
(2) 이 아닌 고유값이 같습니다. 크기가 다르므로 큰 쪽에 이 더 붙습니다.
(3) 제곱근이 와 입니다.
이 문제에서 배우는 것: 특이값.
특이값. 가 일 때 의 고유값의 음이 아닌 제곱근을
로 정렬한 것을 의 특이값이라 합니다.
87강 심화 2에서 가 양반정치였으므로 고유값이 음이 아니고, 제곱근이 실수입니다.
두 행렬의 고유값이 같은 이유를 봅니다. 이고 이면 에 대해
****입니다. 이기 때문입니다.
반대 방향도 같으므로 이 아닌 고유값이 일대일 대응합니다.
의 개수만 다릅니다. 73강 심화 2에서 였으므로
| 행렬 | 크기 | 의 개수 |
|---|---|---|
| AA^ |
74강의 영공간과 좌영공간의 차원입니다.
바로 확인 1.
확인 1-1. 특이값의 정의를 쓰세요.
답. 의 고유값의 음이 아닌 제곱근입니다.
확인 1-2. 특이값이 실수인 근거를 쓰세요.
답. 가 양반정치라 고유값이 음이 아니기 때문입니다.
확인 1-3. 와 의 고유값 관계를 쓰세요.
답. 이 아닌 것이 같고 의 개수만 다릅니다.
문제. 같은 에 대해
(1)svd를 실행하고 크기를 확인하세요.
(2) 이 인지 확인하세요.
(3) 와 의 성질을 확인하세요.
생각의 실마리. 의 크기를 맞추는 것이 헷갈립니다. **와 같은 **이어야 합니다.
풀이. (1) 검산에서 가 , 가 길이 , 이 입니다.
(2) 를 으로 만들어 왼쪽 위에 특이값을 놓으면 입니다.
(3) 이고 입니다.
이 문제에서 배우는 것: 특이값 분해.
특이값 분해. 모든 행렬에 대해
인 직교행렬 (), ()와 대각 ()가 언제나 존재합니다.
"언제나"가 핵심입니다. 정사각일 필요도, 대칭일 필요도, 가역일 필요도 없습니다.
지금까지의 분해와 비교합니다.
| 분해 | 조건 |
|---|---|
| 정사각 (교환 허용) | |
| 열이 독립 | |
| A=V\Lambda V^ | 대각화 가능 |
| A=Q\Lambda Q^ | 대칭 |
| A=U\Sigma V^ | 없음 |
존재의 근거는 86강의 스펙트럼 정리입니다. 으로 직교 대각화하고, 인 것에 대해
로 두면 가 정규직교임을 보일 수 있습니다. 심화 1에서 증명합니다.
크기의 두 형태가 있습니다.
| 형태 | |||
|---|---|---|---|
| 완전형 | |||
| 축소형 |
여기서 입니다. 81강 문제 2의 QR과 같은 구별입니다.
np.linalg.svd는 기본이 완전형이고 full_matrices=False로 축소형을 얻습니다. 이 크면 축소형을 써야 메모리가 감당됩니다.
바로 확인 2.
확인 2-1. 특이값 분해의 형태를 쓰세요.
답. 이며 가 직교이고 가 대각입니다.
확인 2-2. 존재 조건을 쓰세요.
답. 없습니다. 모든 행렬에 존재합니다.
확인 2-3. 의 크기를 쓰세요.
답. 와 같은 입니다.
문제. 의 열을 , 의 열을 라 합니다.
(1) 과 을 비교하세요.
(2) 은 어떻습니까?
(3) 전체 구조를 서술하세요.
생각의 실마리. 를 열별로 읽습니다. 84강의 와 비슷한데 왼쪽과 오른쪽 기저가 다릅니다.
풀이. (1) 검산에서 둘 다 입니다.
(2) 입니다. 셋째 특이값이 없기 때문입니다.
(3) 정리합니다.
이 문제에서 배우는 것: 특이벡터의 뜻.
핵심 관계.
고유값 방정식과 비교합니다.
| 고유 | 특이 | |
|---|---|---|
| 관계 | A\mathbf{v}=\lambda\mathbf | A\mathbf{v}_{i}=\sigma_{i}\mathbf{u}_ |
| 방향 | 그대로 | 바뀝니다 |
| 기저 | 하나 | 둘 |
| 존재 | 조건부 | 언제나 |
"방향이 바뀌어도 좋다"고 양보한 대가로 언제나 성립합니다. 84강에서 방향이 안 바뀌는 벡터를 찾았는데, 여기서는 입력 쪽 정규직교기저가 출력 쪽 정규직교기저로 옮겨 가기만 하면 됩니다.
기하로 읽으면 단위구가 타원체로 갑니다. 반축의 방향이 이고 길이가 입니다.
87강 문제 4의 등고선 타원과 관련되지만 다릅니다. 거기서는 반축이 였고 여기서는 입니다.
계수도 즉시 나옵니다. 검산에서 이고 이 아닌 특이값이 개입니다.
**72강 심화 4와 78강 심화 3에서 "계수 판정에 특이값을 쓴다"**고 한 근거가 이것입니다. 소거의 피벗보다 안정합니다.
바로 확인 3.
확인 3-1. 핵심 관계식을 쓰세요.
답. 입니다.
확인 3-2. 고유값 방정식과의 차이를 쓰세요.
답. 방향이 바뀌며 입력과 출력의 기저가 다릅니다.
확인 3-3. 계수를 특이값으로 쓰세요.
답. 이 아닌 특이값의 개수입니다.
문제. 같은 에 대해
(1) 의 앞 개와 나머지가 무엇을 생성합니까?
(2) 는 어떻습니까?
(3) 확인하세요.
생각의 실마리. 74강 심화 3에서 예고한 내용입니다. 문제 3의 관계를 보면 어느 열이 어디로 가는지 드러납니다.
풀이. (1) 검산에서 의 앞 두 열이
이고 셋째 열이 입니다. 셋째 열이 에 의해 으로 갑니다.
(2) 의 두 열이 이고, 이 예에서는 이라 나머지가 없습니다. 검산에서 크기가 입니다.
(3) 이 확인됩니다.
이 문제에서 배우는 것: 네 부분공간의 정규직교기저.
대응.
공간 기저 차원 (행공간) 의 앞 개 열 (영공간) 의 나머지 열 (열공간) 의 앞 개 열 (좌영공간) 의 나머지 열
74강의 그림이 완전히 계산 가능해졌습니다.
그때는 소거로 기저를 구했는데 직교가 아니었습니다. 여기서는 가 직교행렬이므로 정규직교기저를 얻습니다.
74강 문제 4의 "기본 정리"도 정확히 표현됩니다.
그 동형사상이 무엇인지를 SVD가 알려 줍니다. 를 로 보내며, 방향마다 늘어나는 비율이 다릅니다.
정사영도 즉시 나옵니다. 80강의 에서
83강의 모자행렬을 SVD로 계산하는 방법입니다.
바로 확인 4.
확인 4-1. 행공간의 기저를 어디서 읽습니까?
답. 의 앞 개 열입니다.
확인 4-2. 좌영공간의 기저를 어디서 읽습니까?
답. 의 나머지 열입니다.
확인 4-3. 소거로 구한 기저와의 차이를 쓰세요.
답. SVD의 기저는 정규직교입니다.
문제. 같은 에 대해
(1) 외적의 합으로 쓰세요.
(2) 두 노름을 특이값으로 나타내세요.
(3) 조건수를 구하세요.
생각의 실마리. 66강 심화 1의 다섯째 관점입니다. 을 펼치면 계수 짜리 조각들의 합이 됩니다.
풀이. (1) 검산에서
이 확인됩니다.
(2) 검산에서
| 노름 | 값 | 특이값으로 |
|---|---|---|
| 스펙트럼 노름 | \sigma_ | |
| 프로베니우스 노름 |
(3) 조건수가 이고 과 같습니다.
이 문제에서 배우는 것: 특이값이 재는 것들.
정리.
양 특이값으로 계수 스펙트럼 노름 \sigma_ 프로베니우스 노름 조건수 \sigma_{1}/\sigma_ $ \det A
둘째 줄이 스펙트럼 노름의 정의입니다. 90강에서 정식으로 다루지만 미리 말하면
문제 3에서 단위구가 타원체로 간다고 했으므로, 가장 긴 반축이 최대 늘임입니다.
넷째 줄이 91강의 주제입니다. 67강 심화 6에서 조건수를 언급하고 미뤘는데, 이제 정의가 나옵니다.
79강 심화 4에서 행렬식과 조건수가 다르다고 했는데, 여기서 그 차이가 분명합니다.
곱이 작아도 비가 좋을 수 있고, 반대도 가능합니다. 는 곱이 인데 비가 입니다.
**81강 문제 5의 **도 이제 설명됩니다. 의 고유값이 이므로
정규방정식이 조건수를 제곱하는 이유입니다.
바로 확인 5.
확인 5-1. 외적의 합 형태를 쓰세요.
답. 입니다.
확인 5-2. 두 노름을 특이값으로 쓰세요.
답. 과 입니다.
확인 5-3. 조건수를 특이값으로 쓰세요.
답. 입니다.
| 개념 | 내용 |
|---|---|
| 특이값 | 고유값의 제곱근 |
| 분해 | , 언제나 존재 |
| 핵심 관계 | A\mathbf{v}_{i}=\sigma_{i}\mathbf{u}_ |
| 외적의 합 | A=\sum\sigma_{i}\mathbf{u}_{i}\mathbf{v}_{i}^ |
| 기하 | 단위구가 반축 인 타원체로 |
| 부분공간 | 기저 |
|---|---|
| 행공간 | 앞 개 |
| 영공간 | 나머지 |
| 열공간 | 앞 개 |
| 좌영공간 | 나머지 |
| 양 | 특이값으로 |
|---|---|
| 계수 | 의 개수 |
| \lVert A\rVert_ | \sigma_ |
| \lVert A\rVert_ | |
| \sigma_{1}/\sigma_ | |
| A^ | V\Sigma^{+}U^ |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 를 정사각으로 만듭니다 | 와 같은 크기입니다 |
| 특이값과 고유값을 섞습니다 | 대칭이라도 부호가 다릅니다 |
| 완전형을 기본으로 씁니다 | 큰 에서는 축소형입니다 |
| 계수 판정에 소거를 씁니다 | 특이값이 안정합니다 |
문제 6. 특이값의 정의를 쓰세요.
답. 고유값의 음이 아닌 제곱근입니다.
문제 7. 특이값이 실수인 근거를 쓰세요.
답. 가 양반정치이기 때문입니다.
문제 8. SVD의 존재 조건을 쓰세요.
답. 없습니다. 모든 행렬에 존재합니다.
문제 9. 의 크기를 쓰세요.
답. 와 같은 입니다.
문제 10. 핵심 관계식을 쓰세요.
답. 입니다.
문제 11. 고유값 방정식과의 차이를 쓰세요.
답. 방향이 바뀌며 기저가 둘입니다.
문제 12. 계수를 특이값으로 쓰세요.
답. 이 아닌 특이값의 개수입니다.
문제 13. 네 부분공간의 기저를 어디서 읽습니까?
답. 와 의 앞뒤 열에서 읽습니다.
문제 14. 외적의 합 형태를 쓰세요.
답. 입니다.
문제 15. 스펙트럼 노름을 특이값으로 쓰세요.
답. 입니다.
문제 16. 조건수를 특이값으로 쓰세요.
답. 입니다.
문제 17. 를 로 쓰세요.
답. 입니다.
문제 18. 단위구가 무엇으로 갑니까?
답. 반축이 인 타원체입니다.
심화 1. 특이값 분해의 존재를 증명하세요.
풀이. 86강의 스펙트럼 정리에서 구성합니다.
1단계. 가 대칭 양반정치이므로 직교 대각화됩니다.
으로 내림차순 정렬하고, 이며 나머지가 이라 합니다.
2단계. 에 대해
로 둡니다. 정규직교임을 확인합니다.
3단계. 이면 이므로
나머지 가 영공간에 있습니다.
4단계. 을 의 정규직교기저로 확장합니다(80강의 그람슈미트). 그러면
증명이 스펙트럼 정리 하나에 의존합니다. 86강이 06단원의 중심이라 한 이유입니다.
유일성도 봅니다. 특이값은 유일하지만 는 그렇지 않습니다.
| 상황 | 자유도 |
|---|---|
| 특이값이 모두 다르고 양수 | 부호만 (쌍으로) |
| 중복 특이값 | 그 부분공간 안에서 회전 |
| 영공간 안에서 자유 |
85강 심화 5의 이야기와 같습니다. 개별 특이벡터가 아니라 부분공간이 안정합니다.
심화 2. 에카르트-영 정리를 진술하고 확인하세요.
풀이. SVD의 가장 유명한 응용입니다.
에카르트-영 정리. 계수가 이하인 행렬 중 에 가장 가까운 것은
이며 오차가
입니다.
큰 것부터 개만 남기면 최선입니다.
검산에서 무작위 행렬로 확인합니다.
| 실제 오차 | 설명 비율 | ||
|---|---|---|---|
오차 공식이 정확히 맞습니다.
무작위 행렬이라 특이값이 고르게 퍼져 있어 에서도 뿐입니다. 실제 데이터는 훨씬 빨리 떨어집니다.
왜 최선인가. 직관은 이렇습니다. 계수 인 행렬은 차원 부분공간으로 사영한 것과 같고, 가장 큰 방향들을 남기는 것이 손실이 적습니다. 엄밀한 증명은 86강 심화 1의 최대최소 원리를 씁니다.
응용이 많습니다.
| 응용 | 무엇을 근사 |
|---|---|
| 이미지 압축 | 화소 행렬 |
| 잠재의미분석 | 문서-단어 행렬 |
| 추천 시스템 | 사용자-항목 행렬 |
| 잡음 제거 | 신호 행렬 |
| LoRA (342강) | 가중치 변화량 |
73강 심화 5에서 계산한 저장 비용이 여기서 값을 합니다.
에 이면 였습니다.
잡음 제거의 원리도 봅니다. 신호가 저계수이고 잡음이 모든 방향에 고르게 퍼져 있으면, 큰 특이값에 신호가 몰리고 작은 것에 잡음이 남습니다. 자르면 잡음이 걸러집니다.
스크리 그림을 그려 눈으로 찾는 것이 실무의 방법입니다.
심화 3. 의사역행렬을 SVD로 계산하세요.
풀이. 83강 문제 3에서 네 조건으로 정의하고 계산법을 미뤘습니다. 여기서 답합니다.
여기서 은 를 전치하고 이 아닌 성분을 역수로 바꾼 것입니다.
**은 그대로 **입니다. 역수로 만들지 않습니다.
검산에서 이 pinv와 일치하고, 무어-펜로즈 조건을 만족합니다.
네 조건을 확인해 봅니다.
열공간으로의 정사영이며 대칭이고 멱등입니다. 83강 문제 3의 결과가 확인됩니다.
83강 심화 4의 불연속성도 여기서 보입니다. 이면 인데, 이면 입니다.
pinv의 rcond 인자가 그 문턱이며, 기본값이 입니다.
정칙화와의 비교를 정리합니다.
| 방법 | 를 어떻게 |
|---|---|
| 절단 SVD | 면 , 아니면 |
| 능형 (82강 심화 2) |
둘째 줄을 유도해 봅니다. 에 SVD를 넣으면
이고 대각 성분이 입니다.
**큰 에서는 에 가깝고 작은 에서는 **입니다. 절단이 급격한 데 비해 부드럽게 줄입니다.
심화 4. SVD와 고유분해의 관계를 정리하세요.
풀이. 두 분해가 어떻게 다르고 언제 같은지 봅니다.
일반적으로 다릅니다.
| 고유분해 | SVD | |
|---|---|---|
| 대상 | 정사각 | 모든 행렬 |
| 존재 | 조건부 | 언제나 |
| 기저 | 하나 | 둘 |
| 직교 | 대칭일 때만 | 언제나 |
| 값 | 복소수 가능 | 음이 아닌 실수 |
대칭이면 관계가 생깁니다. 이면
특이값이 고유값의 절댓값입니다.
검산에서 의 고유값이 와 인데, 특이값이 와 입니다. 부호가 사라졌습니다.
대칭 양반정치이면 완전히 같습니다.
87강의 양정치 조건이 여기서 의미를 얻습니다.
정사각인데 대칭이 아니면 둘이 크게 다릅니다.
고유값이 인데 특이값이 입니다. 고유값은 대각화 실패를 반영하지만 특이값은 "크기"를 정직하게 잽니다.
스펙트럼 반지름과 노름이 다릅니다. 대칭이면 같지만 일반적으로는
입니다. 90강에서 다시 봅니다.
계산에서도 SVD가 낫습니다.
| 목적 | 고유분해 | SVD |
|---|---|---|
| 계수 판정 | 위험 | 안전 |
| 조건수 | 부정확 | 정확 |
| 근사 | 없음 | 에카르트-영 |
85강 심화 5에서 대각화가 수치적으로 위험하다고 했는데, SVD는 그 문제가 없습니다. 언제나 직교 변환만 쓰기 때문입니다.
심화 5. SVD의 계산 방법과 비용을 논하세요.
풀이. 를 만들어 고유분해하면 안 됩니다.
이유는 81강 문제 5와 같습니다. 조건수가 제곱됩니다.
이 작으면 이 반올림에 묻힙니다. 이면 이라 배정밀도에서 사라집니다.
골럽-라인시 알고리즘이 표준입니다.
| 단계 | 내용 | 비용 |
|---|---|---|
| 1 | 하우스홀더로 이중대각화 | |
| 2 | 반복으로 대각화 | 정도 |
1단계가 대칭의 삼중대각화에 대응합니다. 위쪽 하나만 남기고 나머지를 으로 만듭니다.
2단계는 QR 알고리즘의 변형이며, 암묵적으로 에 적용하되 실제로는 만들지 않습니다.
비용을 정리합니다.
| 필요한 것 | 비용 |
|---|---|
| 특이값만 | |
| \sim4mn^ | |
| 전부 (축소형) | \sim6mn^ |
| 전부 (완전형) |
필요한 것만 계산하도록 지정해야 합니다. full_matrices=False와 compute_uv=False가 그 역할입니다.
대규모 문제에서는 상위 몇 개만 구합니다.
| 방법 | 상황 |
|---|---|
| 란초스 | 희소, 상위 개 |
| 무작위 SVD | 큰 밀집 행렬, 상위 개 |
| 블록 거듭제곱 | 곱셈만 가능 |
둘째 줄이 최근의 표준입니다. 무작위 행렬을 곱해 차원을 줄인 뒤 작은 문제로 푸는 방식이며, 73강 심화 4의 "고차원에서 무작위 방향이 거의 직교"라는 성질을 씁니다.
심화 6. SVD가 실무에서 어떻게 쓰이는지 정리하세요.
풀이. 이 분해가 선형대수의 스위스 군용칼이라 불리는 이유를 봅니다.
진단.
| 묻는 것 | 보는 것 |
|---|---|
| 계수 | 의 개수 |
| 조건수 | \sigma_{1}/\sigma_ |
| 특이에 얼마나 가까운가 | \sigma_ |
| 유효 차원 | 특이값의 감쇠 |
넷째 줄이 데이터 분석의 첫 단계입니다. 데이터 행렬의 특이값을 보면 실제 차원이 몇인지 감이 옵니다.
계산.
| 문제 | SVD로 |
|---|---|
| 최소제곱 | \hat{\mathbf{x}}=V\Sigma^{+}U^{\top}\mathbf |
| 의사역행렬 | 심화 3 |
| 최소 노름 해 | 자동으로 나옵니다 |
| 정사영 | U_{r}U_{r}^ |
82강과 83강의 모든 계산이 SVD 하나로 됩니다. 느리지만 가장 안전합니다.
근사.
| 응용 | 내용 |
|---|---|
| 주성분분석 | 89강 |
| 이미지 압축 | 저계수 근사 |
| 잠재의미 | 문서-단어 분해 |
| 행렬 완성 | 결측치 채우기 |
| 잡음 제거 | 작은 특이값 절단 |
기하.
| 응용 | 내용 |
|---|---|
| 최적 회전 (프로크루스테스) | 점군 정합 |
| 극분해 | 회전과 늘임으로 분해 |
| 기본행렬 추정 | 컴퓨터 비전 |
둘째 줄의 극분해를 봅니다.
직교행렬 곱하기 대칭 양반정치로 갈립니다. 물리적으로 회전과 변형의 분리이며, 연속체역학에서 변형 기울기를 이렇게 나눕니다.
66강 문제 5에서 나열한 기본 변환들이 이 분해로 통합됩니다. 어떤 선형변환도 "돌리고 늘이고 다시 돌리는" 것입니다.
으로 돌리고, 로 축마다 늘이고, 로 다시 돌립니다. 이것이 문제 3에서 단위구가 타원체로 가는 그림의 정확한 내용입니다.
이 강의에서는 numpy만 씁니다. 특이값이 의 고유값에서 나옴을 확인하고, 분해와 핵심 관계를 검산하며, 저계수 근사의 오차 공식을 맞춥니다.
import numpy as np
A = np.array([[3.,1.,1.],[-1.,3.,1.]]) # 2x3
# --- 문제 1: A^T A 와 A A^T 의 고유값 -----------------------------------
w1 = np.linalg.eigvalsh(A.T@A); w2 = np.linalg.eigvalsh(A@A.T)
print((np.round(np.sort(w1)[::-1],8)+0.0).tolist()) # [12.0, 10.0, 0.0]
print(np.round(np.sort(w2)[::-1],8).tolist()) # [12.0, 10.0]
print(np.round(np.sqrt(np.sort(w2)[::-1]),8).tolist())
# [3.46410162, 3.16227766]
# --- 문제 2: SVD --------------------------------------------------------
U, s, Vt = np.linalg.svd(A)
print(U.shape, s.shape, Vt.shape) # (2, 2) (2,) (3, 3)
print(np.round(s,8).tolist()) # [3.46410162, 3.16227766]
Sig = np.zeros((2,3)); Sig[:2,:2] = np.diag(s)
print(bool(np.allclose(U@Sig@Vt, A))) # True
print((np.round(U.T@U,10)+0.0).tolist()) # [[1.0, 0.0], [0.0, 1.0]]
print(bool(np.allclose(Vt@Vt.T, np.eye(3)))) # True
# --- 문제 3: A v = sigma u ----------------------------------------------
V = Vt.T
for i in range(2):
print(i, np.round(A@V[:,i],8).tolist(), np.round(s[i]*U[:,i],8).tolist())
# 0 [-2.44948974, -2.44948974] [-2.44948974, -2.44948974]
# 1 [-2.23606798, 2.23606798] [-2.23606798, 2.23606798]
print(np.round(A@V[:,2],10).tolist()) # [0.0, 0.0] (영공간)
print(int(np.linalg.matrix_rank(A)), int(np.sum(s>1e-10))) # 2 2
# --- 문제 4: 네 부분공간의 정규직교기저 ---------------------------------
r = int(np.sum(s>1e-10))
print(np.round(V[:,:r],8).tolist()) # 행공간
# [[-0.40824829, -0.89442719], [-0.81649658, 0.4472136], [-0.40824829, 0.0]]
print(np.round(V[:,r:],8).tolist()) # 영공간
# [[-0.18257419], [-0.36514837], [0.91287093]]
print(np.round(U[:,:r],8).tolist()) # 열공간
# [[-0.70710678, -0.70710678], [-0.70710678, 0.70710678]]
print(U[:,r:].shape) # (2, 0) 좌영공간이 없습니다
print(np.round(A@V[:,r:],10).tolist()) # [[0.0], [0.0]]
# --- 문제 5: 외적의 합, 노름, 조건수 ------------------------------------
acc = np.zeros((2,3))
for i in range(r): acc = acc + s[i]*np.outer(U[:,i], V[:,i])
print(bool(np.allclose(acc, A))) # True
print("%.8f %.8f" % (np.linalg.norm(A,2), s[0]))
# 3.46410162 3.46410162
print("%.8f %.8f" % (np.linalg.norm(A,'fro'), np.sqrt(np.sum(s**2))))
# 4.69041576 4.69041576
print("%.8f %.8f" % (np.linalg.cond(A), s[0]/s[-1]))
# 1.09544512 1.09544512
# --- 심화 3: 의사역행렬 -------------------------------------------------
Ap = np.linalg.pinv(A)
sp = np.zeros((3,2)); sp[:2,:2] = np.diag(1/s)
print(bool(np.allclose(V@sp@U.T, Ap))) # True
print(bool(np.allclose(A@Ap@A, A)), bool(np.allclose((A@Ap).T, A@Ap)))
# True True
# --- 심화 2: 저계수 근사의 오차 공식 ------------------------------------
rng = np.random.default_rng(61)
M = rng.standard_normal((60,40))
Um, sm, Vtm = np.linalg.svd(M, full_matrices=False)
tot = np.sum(sm**2)
for k in [1,5,10,20,40]:
Mk = (Um[:,:k]*sm[:k]) @ Vtm[:k]
print(k, "%.6f %.6f" % (np.linalg.norm(M-Mk,'fro'),
np.sqrt(np.sum(sm[k:]**2))),
"%.4f" % (np.sum(sm[:k]**2)/tot))
# 1 47.288846 47.288846 0.0809
# 5 40.308724 40.308724 0.3322
# 10 32.626134 32.626134 0.5625
# 20 19.900246 19.900246 0.8372
# 40 0.000000 0.000000 1.0000
# --- 심화 4: 대칭이면 특이값이 고유값의 절댓값 --------------------------
S = np.array([[4.,1.],[1.,-3.]])
ws = np.linalg.eigvalsh(S)
ss = np.linalg.svd(S, compute_uv=False)
print(np.round(np.sort(np.abs(ws))[::-1],8).tolist(), np.round(ss,8).tolist())
# [4.14005494, 3.14005494] [4.14005494, 3.14005494]
실행하면 주석과 같은 값이 나옵니다. 다섯 곳을 짚어 둡니다.
첫째, 의 고유값이 이고 이 입니다. 이 아닌 것이 같고 크기 차이만큼 이 더 붙습니다. 제곱근이 특이값입니다.
둘째, 이고 가 입니다. 정사각이 아니라는 점을 놓치기 쉽습니다.
셋째, 와 가 정확히 같고, 셋째 열은 으로 갑니다. 의 뒤쪽 열이 영공간입니다.
넷째, 네 부분공간의 기저가 에서 바로 읽힙니다. 이 예에서 이라 좌영공간이 비어 있고 크기가 으로 나옵니다.
다섯째가 심화의 핵심입니다. 에카르트-영의 오차 공식이 소수 여섯 자리까지 정확합니다. 실제 근사 오차와 가 다섯 경우 모두 일치합니다. 무작위 행렬이라 특이값이 고르게 퍼져 에서도 뿐인데, 실제 데이터는 훨씬 빨리 떨어집니다.
대칭행렬의 비교도 눈여겨보십시오. 고유값이 와 인데 특이값은 와 입니다. 부호가 사라집니다.
코드로 할 수 없는 일도 분명히 해 둡니다. SVD의 존재는 예로 증명되지 않습니다. 심화 1의 구성이 그 자리를 맡습니다. 그리고 svd는 를 만들지 않고 에 직접 작업하므로, 문제 1의 고유값 계산과 문제 2의 특이값이 일치한 것은 서로 다른 경로의 확인입니다. 심화 5에서 본 대로 실제 계산에서 를 만들면 조건수가 제곱되어 작은 특이값을 잃습니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| \sigma_ | 특이값 | 고유값의 제곱근입니다 |
| \mathbf{u}_ | 좌특이벡터 | 의 열입니다 |
| \mathbf{v}_ | 우특이벡터 | 의 열입니다 |
| A=U\Sigma V^ | 특이값 분해 | 언제나 존재합니다 |
| \lVert A\rVert_ | 스펙트럼 노름 | 입니다 |
| \lVert A\rVert_ | 프로베니우스 노름 | 입니다 |
| A_ | 절단 SVD | 최선의 계수 근사입니다 |
| 에카르트-영 | Eckart-Young | 저계수 근사의 최적성입니다 |
| 극분해 | polar decomposition | 회전 곱하기 늘임입니다 |
다음 89강에서는 저계수 근사를 데이터에 적용합니다. 심화 2에서 무작위 행렬로 확인했는데, 실제 데이터는 특이값이 빠르게 떨어져 몇 개만으로 대부분을 설명합니다. 그것이 주성분분석이며, 86강 심화 1의 최대최소 원리가 "분산이 큰 방향 찾기"로 나타납니다. 06단원의 마지막 강의입니다.