수학

MATH / 중급 12번

고윳값과 고유벡터: 방향이 변하지 않는 축

Av = λv를 정의하고 2×2 특성방정식 λ² − (tr A)λ + det A = 0을 전개합니다. 근과 계수의 관계를 그대로 읽어 고윳값의 합이 대각합, 곱이 행렬식이라는 것을 얻고, 고윳값을 풀지 않고 스펙트럼의 갈래를 읽습니다. 대각화 A = PΛP⁻¹와 대각화가 안 되는 두 경우까지 봅니다.

PALDYN Team38 MIN READ

같은 행렬을 여러 번 곱하는 자리가 딥러닝에는 많습니다. 순환망이 시간 축을 따라 같은 가중치를 반복해 곱하고, 깊은 층의 역전파도 층마다의 야코비안을 줄줄이 곱합니다. 그런데 그렇게 반복해 곱해 보면 이상한 일이 벌어집니다 — 어떤 입력은 몇 배씩 커지고 어떤 입력은 0으로 죽는데, 크기가 아니라 방향이 그 운명을 가릅니다.

논문의 문장들도 그 사실을 전제하고 쓰여 있습니다. "스펙트럼 반지름이 1을 넘으면", "헤세 행렬의 가장 큰 고윳값이 곧 곡률이고", "공분산의 주축을 따라" 같은 표현들은 전부 행렬마다 특별한 방향이 있다는 이야기입니다.

이 글은 그 방향을 정의하고, 그것을 찾는 방정식을 세우고, 마지막에는 방정식을 풀지 않고도 갈래를 읽는 법까지 갑니다.

방향이 변하지 않는 축

정의

지난 글에서 회전은 모든 방향을 돌리고 스케일은 축 방향을 그대로 둔다는 것을 봤습니다. 그 "그대로 둔다"를 정의로 만듭니다.

정의. v≠0\mathbf{v} \ne \mathbf{0} 이고 Av=λvA\mathbf{v} = \lambda\mathbf{v} 를 만족하는 스칼라 λ\lambda 가 있으면, v\mathbf{v} 를 AA 의 고유벡터, λ\lambda 를 그에 딸린 고윳값이라고 한다.

오른쪽의 λv\lambda\mathbf{v} 는 v\mathbf{v} 의 스칼라배이므로 같은 직선 위에 있습니다. 행렬을 먹였는데 방향이 안 바뀌고 길이만 λ\lambda 배가 된 것입니다. λ\lambda 가 음수면 반대쪽을 향하지만 직선은 같습니다.

v≠0\mathbf{v} \ne \mathbf{0} 이라는 조건이 붙은 이유는 간단합니다. A0=0=λ0A\mathbf{0} = \mathbf{0} = \lambda\mathbf{0} 은 어떤 λ\lambda 로도 참이라 아무것도 말해 주지 않기 때문입니다.

보통 벡터는 방향이 달라지고 고유벡터 (1,1)은 같은 직선 위에서 3배가 된다

λ가 0일 때와 1일 때

배율 λ\lambda 의 값에 따라 그 방향이 겪는 일이 다릅니다. 두 자리를 먼저 못 박아 두면 나중에 읽기가 쉬워집니다.

λ=0\lambda = 0 이면 Av=0A\mathbf{v} = \mathbf{0} 입니다. 0이 아닌 벡터가 통째로 0으로 뭉개졌다는 뜻이고, 그러면 AA 는 되돌릴 수 없습니다. 어느 입력에서 왔는지 알 길이 없기 때문입니다. 그래서 0이 고윳값이라는 말과 det⁡A=0\det A = 0 이라는 말은 같은 말입니다. 어느 쪽이 먼저인지 따질 것 없이 같은 사실의 두 표현입니다.

λ=1\lambda = 1 이면 Av=vA\mathbf{v} = \mathbf{v} 라 그 방향이 손도 안 대진 채 남습니다. 무엇을 몇 번 곱해도 그 방향은 그대로이니 Akv=vA^k\mathbf{v} = \mathbf{v} 입니다. 반복해 곱하는 상황에서 이런 방향은 폭발하지도 사라지지도 않는 자리입니다.

∣λ∣|\lambda| 가 1보다 크면 곱할 때마다 그 방향이 길어지고 1보다 작으면 짧아집니다. 첫머리의 "어떤 입력은 커지고 어떤 입력은 죽는다"가 이미 여기 다 들어 있습니다.

길이와 부호를 정하는 관례

고유벡터는 하나로 정해지지 않습니다. Av=λvA\mathbf{v} = \lambda\mathbf{v} 의 양변에 2를 곱하면 A(2v)=λ(2v)A(2\mathbf{v}) = \lambda(2\mathbf{v}) 라 2v2\mathbf{v} 도 같은 고윳값의 고유벡터이고, −v-\mathbf{v} 도 마찬가지입니다.

그래서 관례로 길이를 1로 맞춰 둡니다. 계산 라이브러리가 돌려주는 고유벡터는 전부 노름이 1입니다. 그래도 부호는 남습니다 — 길이가 1인 후보가 한 직선에 둘이라, 어느 쪽을 돌려줄지는 구현이 정합니다. 같은 행렬을 다른 라이브러리에 넣어 부호가 뒤집힌 답이 나와도 틀린 것이 아닙니다.

부호가 바뀌면 곤란한 계산을 하고 있다면 — 예를 들어 주성분의 방향을 그림으로 그려 비교한다면 — 첫 성분이 양수가 되도록 맞추는 식으로 직접 고정해야 합니다. 라이브러리는 그것까지 보장해 주지 않습니다.

특성방정식

det(A − λI) = 0

v\mathbf{v} 와 λ\lambda 를 한꺼번에 찾기는 어렵습니다. 정의를 한쪽으로 몰면 길이 열립니다.

Av=λv⟺(A−λI)v=0A\mathbf{v} = \lambda\mathbf{v} \quad \Longleftrightarrow \quad (A - \lambda I)\mathbf{v} = \mathbf{0}

λI\lambda I 를 쓰는 이유는 A−λA - \lambda 라는 뺄셈이 정의되지 않기 때문입니다 — 행렬에서 스칼라를 뺄 수는 없고, 대각에만 λ\lambda 를 놓은 행렬을 빼야 합니다.

이제 조건은 "(A−λI)v=0(A-\lambda I)\mathbf{v} = \mathbf{0} 을 만족하는 0이 아닌 v\mathbf{v} 가 있는가"입니다. 그런 v\mathbf{v} 가 있다는 것은 그 행렬이 0이 아닌 벡터를 0으로 뭉갠다는 뜻이고, 9번 글의 그림으로 말하면 단위 정사각형이 납작해졌다는 뜻입니다. 넓이 배율이 0이므로

det⁡(A−λI)=0\det(A - \lambda I) = 0

이것을 AA 의 특성방정식이라고 합니다. 행렬식의 정의와 "0이면 되돌릴 수 없다"는 성질은 초급 44번의 것이고, 여기서는 가져다 쓰기만 합니다. 앞 절에서 본 "0이 고윳값이면 det⁡A=0\det A = 0"은 이 식에 λ=0\lambda=0 을 넣은 것과 같습니다.

2×22\times2 에서 왼쪽을 실제로 전개합니다. A=(abcd)A = \begin{pmatrix} a & b \\ c & d\end{pmatrix} 이면

det⁡(a−λbcd−λ)=(a−λ)(d−λ)−bc=λ2−(a+d)λ+(ad−bc)\det\begin{pmatrix} a-\lambda & b \\ c & d-\lambda\end{pmatrix} = (a-\lambda)(d-\lambda) - bc = \lambda^2 - (a+d)\lambda + (ad - bc)

여기서 a+da+d 는 대각 성분의 합, 즉 대각합 tr⁡A\operatorname{tr}A 이고 ad−bcad-bc 는 행렬식입니다. 대각합이라는 이름은 초급 42번에서 이름만 지나갔는데, 그것이 쓰이는 첫 자리가 여기입니다.

 λ2−(tr⁡A)λ+det⁡A=0 \boxed{\ \lambda^2 - (\operatorname{tr}A)\lambda + \det A = 0\ }

2×22\times2 행렬의 고윳값은 이 이차방정식의 두 근입니다.

손으로 두 개

A=(2112)A = \begin{pmatrix} 2 & 1 \\ 1 & 2\end{pmatrix} 이면 tr⁡A=4\operatorname{tr}A = 4, det⁡A=3\det A = 3 이므로

λ2−4λ+3=0⟹(λ−1)(λ−3)=0⟹λ=1, 3\lambda^2 - 4\lambda + 3 = 0 \quad \Longrightarrow \quad (\lambda-1)(\lambda-3) = 0 \quad \Longrightarrow \quad \lambda = 1,\ 3

고윳값을 알았으니 각각에 대해 (A−λI)v=0(A-\lambda I)\mathbf{v} = \mathbf{0} 을 풉니다. λ=3\lambda = 3 이면

A−3I=(−111−1),−v1+v2=0 ⟹ v1=v2A - 3I = \begin{pmatrix} -1 & 1 \\ 1 & -1\end{pmatrix}, \qquad -v_1 + v_2 = 0 \ \Longrightarrow\ v_1 = v_2

두 식이 같은 말이라 해가 하나로 안 정해지고 직선 전체가 나옵니다. v=(1,1)\mathbf{v} = (1,1) 을 대표로 잡습니다. 검산하면 A(1,1)=(3,3)=3(1,1)A(1,1) = (3,3) = 3(1,1) 로 맞습니다.

λ=1\lambda = 1 이면 A−I=(1111)A - I = \begin{pmatrix} 1 & 1 \\ 1 & 1\end{pmatrix} 이라 v1+v2=0v_1 + v_2 = 0, 즉 v=(1,−1)\mathbf{v} = (1,-1) 입니다. A(1,−1)=(1,−1)A(1,-1) = (1,-1) 로 길이도 방향도 그대로입니다.

두 식이 같은 말이 되는 것이 우연이 아니라는 점을 짚어 둡니다. λ\lambda 를 특성방정식의 근으로 골랐으니 det⁡(A−λI)=0\det(A-\lambda I)=0 이고, 그러면 그 행렬의 두 행은 서로의 상수배입니다. 만약 연립식을 풀다가 v1=v2=0v_1 = v_2 = 0 만 나왔다면 그 λ\lambda 가 근이 아니거나 계산이 틀린 것입니다. 풀이가 직선으로 안 나오면 되짚어 봐야 합니다.

고유공간

해가 직선으로 나오는 것은 오류가 아니라 구조입니다. v\mathbf{v} 가 고유벡터면 2v2\mathbf{v} 도 고유벡터이기 때문입니다. 그래서 고윳값 λ\lambda 에 딸린 해 전체 — (A−λI)v=0(A-\lambda I)\mathbf{v} = \mathbf{0} 의 해집합 — 를 고유공간이라고 부르고, 8번 글의 말로 하면 그것은 부분공간입니다. 고유벡터를 하나 고르는 것은 그 부분공간의 기저를 하나 잡는 일입니다.

부분공간이라는 말을 여기서 한 번 더 짚으면, 고유공간의 두 벡터를 더해도 그 안에 있고 상수배해도 그 안에 있다는 뜻입니다. 확인은 한 줄입니다. Au=λuA\mathbf{u} = \lambda\mathbf{u} 이고 Aw=λwA\mathbf{w} = \lambda\mathbf{w} 이면

A(u+w)=λu+λw=λ(u+w)A(\mathbf{u}+\mathbf{w}) = \lambda\mathbf{u} + \lambda\mathbf{w} = \lambda(\mathbf{u}+\mathbf{w})

이라 합도 같은 고윳값의 고유벡터입니다. 여기서 두 벡터의 고윳값이 같아야 한다는 것이 중요합니다. λ\lambda 가 다른 둘을 더하면 A(u+w)=λ1u+λ2wA(\mathbf{u}+\mathbf{w}) = \lambda_1\mathbf{u}+\lambda_2\mathbf{w} 이고 이것은 어느 한 수의 배가 아닙니다.

그리고 그 사실이 곧 다음 성질로 이어집니다. 고윳값이 서로 다르면 고유벡터는 저절로 일차독립입니다. 만약 w=c u\mathbf{w} = c\,\mathbf{u} 였다면 w\mathbf{w} 가 λ1\lambda_1 의 고유벡터이기도 해서 λ1=λ2\lambda_1 = \lambda_2 가 되어야 하는데 다르다고 했으니 모순입니다. 대각화의 조건을 확인할 때 이 성질이 절반을 그냥 처리해 줍니다 — 고윳값이 전부 다르면 독립성은 따로 볼 것이 없습니다.

남는 것은 중근인 경우이고, 그때는 고유공간의 차원이 1일 수도 2일 수도 있습니다. 단위행렬 II 는 λ=1\lambda=1 이 중근인데 모든 벡터가 고유벡터라 고유공간이 평면 전체입니다. 전단은 같은 중근인데 직선 하나뿐입니다. 둘을 가르는 것은 근의 개수가 아니라 (A−λI)(A-\lambda I) 가 얼마나 납작해졌는가입니다.

n차 다항식과 수치 계산

n×nn \times n 으로 올라가면 det⁡(A−λI)\det(A-\lambda I) 가 λ\lambda 에 대한 nn 차 다항식이 됩니다. 중복을 세면 근이 정확히 nn 개이므로 고윳값도 중복을 세어 nn 개 입니다. 다만 실수 범위에서 그렇다는 말은 아닙니다. 아래에서 볼 회전처럼 실근이 하나도 없을 수 있습니다.

바로 답이 나오는 자리가 하나 있습니다. 위삼각행렬이나 아래삼각행렬이면 det⁡(A−λI)\det(A-\lambda I) 가 대각 성분의 곱이라 ∏i(aii−λ)\prod_i (a_{ii}-\lambda) 이고, 대각 성분이 그대로 고윳값 입니다. 손으로 확인할 예를 만들 때 이 사실이 편합니다.

그런데 실제 수치 계산은 이 다항식을 풀지 않습니다. 다항식의 계수에서 근을 찾는 문제는 입력이 조금만 달라져도 답이 크게 흔들리는 종류라, 계수를 만들어 근을 구하는 순간 정확도를 잃습니다. nn 이 100만 되어도 계수의 자릿수가 감당이 안 됩니다. 라이브러리는 대신 행렬을 반복해서 삼각행렬에 가까운 모양으로 몰아가는 알고리즘을 씁니다. 특성방정식은 정의를 세우고 손으로 2×22\times2 를 푸는 도구이지 계산 절차가 아닙니다.

대각합과 행렬식으로 읽기

합은 대각합, 곱은 행렬식

특성방정식이 이차방정식이므로 초급 23번의 근과 계수의 관계를 그대로 읽을 수 있습니다. λ2−(tr⁡A)λ+det⁡A=0\lambda^2 - (\operatorname{tr}A)\lambda + \det A = 0 의 두 근을 λ1,λ2\lambda_1, \lambda_2 라 하면

λ1+λ2=tr⁡A,λ1λ2=det⁡A\lambda_1 + \lambda_2 = \operatorname{tr}A, \qquad \lambda_1\lambda_2 = \det A

고윳값을 구하지 않고도 그 합과 곱은 눈으로 읽힙니다. 대각 성분을 더하고, 대각선끼리 곱해 빼면 끝입니다. 위의 예에서 합은 1+3=4=tr⁡A1+3 = 4 = \operatorname{tr}A, 곱은 1×3=3=det⁡A1\times3 = 3 = \det A 로 맞습니다.

n×nn\times n 에서도 그대로입니다. 고윳값을 전부 더하면 대각합이고 전부 곱하면 행렬식입니다. 크기가 커져도 두 수는 여전히 한눈에 읽히므로, 100차 행렬이라도 "고윳값의 평균은 대각합을 100으로 나눈 값"이라는 정보는 공짜로 얻습니다.

판별식이 가르는 갈래

이 두 줄이 생각보다 멀리 갑니다. 판별식이 (tr⁡A)2−4det⁡A(\operatorname{tr}A)^2 - 4\det A 이므로 두 수만으로 고윳값의 갈래가 정해지기 때문입니다.

대각합을 가로축, 행렬식을 세로축에 놓고 판별식의 부호로 갈래를 나눈 지도

행렬 tr⁡A\operatorname{tr}A det⁡A\det A 읽는 방법 결론
열 (2,1),(1,2)(2,1),(1,2) 4 3 합 4, 곱 3 λ=1,3\lambda = 1, 3
열 (4,2),(1,3)(4,2),(1,3) 7 10 합 7, 곱 10 λ=2,5\lambda = 2, 5
열 (1,3),(2,4)(1,3),(2,4) 5 −2-2 곱이 음수 부호가 다른 두 실근
전단 열 (1,0),(1,1)(1,0),(1,1) 2 1 판별식 4−4=04-4=0 λ=1\lambda = 1 중근
90도 회전 열 (0,1),(−1,0)(0,1),(-1,0) 0 1 합 0인데 곱이 양수 실수로는 불가능

마지막 줄이 흥미롭습니다. 합이 0인 두 실수는 tt 와 −t-t 꼴이라 곱이 −t2≤0-t^2 \le 0 입니다. 곱이 +1+1 이려면 실수여서는 안 됩니다. 판별식도 0−4=−4<00 - 4 = -4 < 0 으로 같은 말을 합니다.

기하로 보면 당연한 결론입니다. 90도 회전은 모든 방향을 돌려 버리므로 제자리에 남는 실수 방향이 있을 수 없습니다. 일반적인 회전 R(θ)R(\theta) 도 tr⁡=2cos⁡θ\operatorname{tr} = 2\cos\theta, det⁡=1\det = 1 이라 판별식이 4cos⁡2θ−4=−4sin⁡2θ≤04\cos^2\theta - 4 = -4\sin^2\theta \le 0 이고, θ\theta 가 0도나 180도가 아닌 한 음수입니다. 복소 고윳값이 나오면 그 행렬 안에 회전이 들어 있다는 신호이고, 이 대응은 「중급 15번 · 특잇값 분해」에서 다시 만납니다.

좌표계와 무관한 두 수

갈래 읽기가 쓸모 있는 더 깊은 이유가 있습니다. 대각합과 행렬식은 기저를 바꿔도 변하지 않는 수 입니다.

행렬식 쪽은 곱의 성질에서 바로 나옵니다.

det⁡(B−1AB)=det⁡(B−1)det⁡(A)det⁡(B)=det⁡(A)\det(B^{-1}AB) = \det(B^{-1})\det(A)\det(B) = \det(A)

대각합 쪽은 tr⁡(XY)=tr⁡(YX)\operatorname{tr}(XY) = \operatorname{tr}(YX) 라는 성질을 쓰면 됩니다. X=B−1AX = B^{-1}A, Y=BY = B 로 놓으면 tr⁡(B−1AB)=tr⁡(ABB−1)=tr⁡(A)\operatorname{tr}(B^{-1}AB) = \operatorname{tr}(ABB^{-1}) = \operatorname{tr}(A) 입니다.

같은 변환을 다른 축에서 보면 행렬의 아홉 개 성분은 전부 달라지는데 이 두 수만은 그대로입니다. 그러니 고윳값도 좌표계와 무관합니다 — 애초에 고윳값이 좌표계와 무관하기 때문에 그것으로 만든 합과 곱이 안 변하는 것이고, 순서를 바꿔 읽어도 같은 말입니다. 어떤 축에서 적었든 행렬의 갈래는 하나로 정해져 있습니다.

고윳값이 있는 자리 가두기

합과 곱만으로는 고윳값이 정확히 어디쯤인지까지는 안 나옵니다. 그런데 행 하나하나를 보면 대략의 자리를 가둘 수 있습니다. 대각 성분 aiia_{ii} 를 가운데로 놓고, 그 행의 나머지 성분들의 절댓값을 더한 만큼을 반지름으로 잡은 구간을 그립니다. 모든 고윳값은 그 구간들의 합집합 안에 있습니다.

A=(4112)A = \begin{pmatrix} 4 & 1 \\ 1 & 2\end{pmatrix} 로 해 봅니다. 첫 행은 가운데 4, 반지름 1이라 [3,5][3, 5] 이고 둘째 행은 가운데 2, 반지름 1이라 [1,3][1, 3] 입니다. 실제 고윳값은 tr⁡=6\operatorname{tr}=6, det⁡=7\det=7 이므로

λ=6±36−282=3±2≈1.586, 4.414\lambda = \frac{6 \pm \sqrt{36-28}}{2} = 3 \pm \sqrt{2} \approx 1.586,\ 4.414

둘 다 각각의 구간 안에 들어 있습니다.

행마다 대각 성분을 가운데로, 나머지 합을 반지름으로 잡은 구간 안에 고윳값이 든다

이 눈어림이 특히 쓸모 있는 것은 대각이 크고 나머지가 작은 행렬 에서입니다. 반지름이 작으면 구간이 좁아져 고윳값이 대각 성분 가까이에 있다는 것이 바로 읽히고, 모든 구간이 0보다 오른쪽에 있으면 그 행렬은 고윳값이 전부 양수라 되돌릴 수 있습니다. 여기서는 대칭 행렬만 다루므로 구간으로 적었는데, 대칭이 아니면 고윳값이 실수가 아닐 수 있어 수직선이 아니라 평면 위의 원판이 됩니다.

대각화

세 단계

고유벡터가 좋은 이유는 거기서는 행렬이 곱셈 하나로 줄기 때문입니다. 8번 글에서 축을 바꾸는 조작을 B−1ABB^{-1}AB 로 적었는데, 그 BB 자리에 고유벡터를 세우면 어떻게 되는지 봅니다.

고유벡터들을 열로 세운 행렬을 PP, 고윳값을 대각에 놓은 행렬을 Λ\Lambda 라고 합니다. 열 시선으로 곱을 보면 APAP 의 ii 열은 Avi=λiviA\mathbf{v}_i = \lambda_i\mathbf{v}_i 이고, 그것은 PΛP\Lambda 의 ii 열과 같습니다. 즉

AP=PΛ⟹A=PΛP−1AP = P\Lambda \quad \Longrightarrow \quad A = P\Lambda P^{-1}

이것을 대각화라고 합니다. PP 가 가역이어야 하므로 조건은 일차독립인 고유벡터가 nn 개 있는 것입니다 — 8번 글의 기저 조건 그대로입니다.

x를 P⁻¹로 고유기저 좌표로 옮기고 Λ로 축마다 늘인 뒤 P로 되돌리는 세 단계

AxA\mathbf{x} 를 계산하는 일이 세 걸음으로 갈린 것으로 읽으면 뜻이 분명해집니다. P−1P^{-1} 이 x\mathbf{x} 를 고유기저의 좌표로 옮기고, Λ\Lambda 가 축마다 제 배율로 늘이고, PP 가 원래 좌표로 되돌립니다. 가운데 걸음만 실제 계산이고 양옆은 읽는 자리를 옮기는 일입니다.

A=(2112)A = \begin{pmatrix} 2 & 1 \\ 1 & 2\end{pmatrix} 로 확인합니다.

P=(111−1),Λ=(3001),P−1=(0.50.50.5−0.5)P = \begin{pmatrix} 1 & 1 \\ 1 & -1\end{pmatrix}, \qquad \Lambda = \begin{pmatrix} 3 & 0 \\ 0 & 1\end{pmatrix}, \qquad P^{-1} = \begin{pmatrix} 0.5 & 0.5 \\ 0.5 & -0.5\end{pmatrix}

PΛ=(313−1),PΛP−1=(1.5+0.51.5−0.51.5−0.51.5+0.5)=(2112)P\Lambda = \begin{pmatrix} 3 & 1 \\ 3 & -1\end{pmatrix}, \qquad P\Lambda P^{-1} = \begin{pmatrix} 1.5+0.5 & 1.5-0.5 \\ 1.5-0.5 & 1.5+0.5\end{pmatrix} = \begin{pmatrix} 2 & 1 \\ 1 & 2\end{pmatrix}

PP 가 8번 글에서 좌표를 다시 읽어 볼 때 쓴 바로 그 기저입니다. 그때는 임의로 고른 축이었는데, 이 행렬에 대해서는 그것이 특별한 축이었던 것입니다.

거듭제곱

대각화가 값을 발휘하는 자리는 거듭제곱입니다. 가운데의 P−1PP^{-1}P 가 차례로 지워지므로

Ak=PΛP−1PΛP−1⋯=PΛkP−1A^k = P\Lambda P^{-1}P\Lambda P^{-1}\cdots = P\Lambda^k P^{-1}

그리고 Λk\Lambda^k 는 대각 성분을 각각 kk 제곱한 것뿐입니다. 행렬을 kk 번 곱하는 일이 수를 kk 제곱하는 일로 바뀌었고, 첫머리의 "어떤 방향은 커지고 어떤 방향은 죽는다"가 여기서 설명됩니다 — ∣λ∣>1|\lambda| > 1 인 방향은 폭발하고 ∣λ∣<1|\lambda| < 1 인 방향은 사라집니다.

kk 가 커질수록 Λk\Lambda^k 안에서 가장 큰 ∣λ∣|\lambda| 를 가진 성분이 나머지를 압도합니다. λ1=3\lambda_1 = 3, λ2=1\lambda_2 = 1 인 위 예에서 k=10k=10 이면 310=590493^{10} = 59049 와 11 이라 사실상 한 방향만 남습니다. 이 가장 큰 절댓값에 스펙트럼 반지름 이라는 이름이 붙고, 그 이야기를 끝까지 끌고 가는 것이 다음 글입니다.

대각에 먹이는 다른 계산

거듭제곱만 되는 것이 아닙니다. AA 에 무엇을 하든 그것이 "곱하고 더하는 일"로 적히면 대각에서도 같은 일을 하면 됩니다.

f(A)=P f(Λ) P−1,f(Λ)=diag⁡(f(λ1),…,f(λn))f(A) = P\,f(\Lambda)\,P^{-1}, \qquad f(\Lambda) = \operatorname{diag}\big(f(\lambda_1), \ldots, f(\lambda_n)\big)

제곱근이 그 예입니다. 고윳값이 전부 0 이상인 대칭 행렬에서 각 λi\lambda_i 의 제곱근을 대각에 놓고 PP 로 감싸면, 그것을 두 번 곱해 AA 가 되는 행렬이 나옵니다. 지수도 마찬가지로 eλie^{\lambda_i} 를 대각에 놓으면 됩니다. 역행렬조차 1/λi1/\lambda_i 를 대각에 놓은 것이고, 그래서 고윳값 중 하나가 0이면 역행렬이 없다는 앞 절의 말이 여기서 다시 나옵니다 — 0으로 나눌 수 없기 때문입니다.

정규직교 기저일 때

PP 의 열들이 서로 직교하고 길이가 1이면 계산이 통째로 가벼워집니다. 그런 행렬은 P⊤P=IP^\top P = I 이므로 P−1=P⊤P^{-1} = P^\top 이고, 역행렬을 구할 필요가 아예 없습니다.

A=PΛP⊤A = P\Lambda P^{\top}

역행렬을 구하는 일은 nn 이 커지면 비싸고 수치적으로도 불안한데, 전치는 성분의 자리를 바꾸는 것뿐이라 공짜이고 오차도 없습니다. 이 좋은 일이 언제 일어나는지는 다음 절에서 봅니다.

대각화가 안 되는 두 경우

조건이 "독립인 고유벡터 nn 개"였으니 그 수를 못 채우는 행렬이 있습니다. 두 가지 방식으로 모자랍니다.

전단은 고유 방향이 하나뿐이고 회전은 실수 고유 방향이 아예 없다

방향이 모자랄 때

중근인데 방향이 하나뿐인 경우입니다. 전단 N=(1101)N = \begin{pmatrix} 1 & 1 \\ 0 & 1\end{pmatrix} 은 tr⁡=2\operatorname{tr} = 2, det⁡=1\det = 1 이라 λ2−2λ+1=(λ−1)2=0\lambda^2 - 2\lambda + 1 = (\lambda-1)^2 = 0 으로 λ=1\lambda = 1 이 중근입니다. 고유공간을 구하면

N−I=(0100),v2=0N - I = \begin{pmatrix} 0 & 1 \\ 0 & 0\end{pmatrix}, \qquad v_2 = 0

v1v_1 은 자유이므로 해는 (1,0)(1,0) 방향 직선 하나입니다. 근은 둘인데 방향은 하나라 PP 의 열을 채울 수 없습니다.

중근이면 늘 이렇게 되는 것은 아닙니다. 단위행렬 II 도 λ=1\lambda=1 이 중근인데 I−1⋅I=OI - 1\cdot I = O 이라 모든 벡터가 해이고, 고유공간이 평면 전체입니다. 독립인 방향을 둘 잡을 수 있으니 대각화가 됩니다 — 사실 이미 대각입니다. 중근은 위험 신호일 뿐 판정이 아니고, 판정은 고유공간의 차원이 합니다.

실수 방향이 없을 때

회전이 여기 해당합니다. 실수 범위에서는 대각화되지 않고, 복소수까지 허용하면 대각화됩니다 — 다만 이 커리큘럼은 복소수 없이 진행하므로 "회전은 실수로 대각화되지 않는다"까지만 들고 갑니다.

앞 절의 지도에서 판별식이 음수인 영역 전체가 이 경우입니다. 그 영역은 포물선 det⁡=(tr⁡)2/4\det = (\operatorname{tr})^2/4 의 위쪽이라 좁은 예외가 아니라 넓은 구역이고, 대각합이 작은데 행렬식이 큰 행렬은 대체로 여기에 듭니다.

대칭 행렬은 이런 사고가 절대 나지 않습니다. A⊤=AA^\top = A 이면 언제나 실수 고윳값이 나오고 고유벡터를 서로 직교하게 잡을 수 있다는 결과가 있습니다. 직교하게 잡을 수 있다는 것은 앞 절의 P−1=P⊤P^{-1}=P^\top 이 성립한다는 말이기도 합니다. AI에서 만나는 행렬 — 공분산·헤세·그람 — 이 대부분 대칭이라 실전에서는 이 좋은 경우가 기본값입니다. 그 증명과 활용은 「중급 14번 · 대칭 행렬」의 몫입니다.

다만 대칭은 충분조건이지 필요조건이 아닙니다. 대칭이 아니어도 독립인 고유벡터가 nn 개이기만 하면 대각화됩니다. 위 지도에서 판별식이 양수인 자리의 행렬들이 전부 그렇습니다 — 서로 다른 두 실근이면 고유벡터가 저절로 독립이라는 성질을 앞에서 봤습니다.

거의 평행할 때

수치 계산에서는 되느냐 안 되느냐보다 얼마나 아슬아슬한가가 더 중요합니다. 고유벡터 둘이 독립이기는 한데 거의 평행하면 PP 를 되돌리는 일이 불안정해집니다.

P=(110ε)P = \begin{pmatrix} 1 & 1 \\ 0 & \varepsilon\end{pmatrix} 을 생각해 보면 두 열의 사잇각이 ε\varepsilon 이 작을수록 좁아지고 det⁡P=ε\det P = \varepsilon 이라 역행렬의 성분이 1/ε1/\varepsilon 만큼 커집니다. PΛP−1P\Lambda P^{-1} 을 계산하는 도중에 큰 수와 작은 수가 섞여 유효숫자가 깎입니다.

두 고유 방향이 나란해지는 것은 두 고윳값이 서로 가까워질 때 자주 일어납니다. 앞 절에서 "중근이면 방향이 모자랄 수 있다"고 했는데, 중근에 가까운 자리는 그 사고의 문턱에 앉아 있는 셈입니다. 대각화가 되는가는 예 아니오로 갈리지만 얼마나 믿을 만한가는 연속적으로 나빠집니다.

코드로 확인하기

eig 와 eigh

import numpy as np

A = np.array([[2., 1], [1, 2]])
w, V = np.linalg.eig(A)

print(w)                       # [3. 1.]
print(V)                       # 열이 고유벡터 (부호와 크기는 정규화되어 있다)
print(np.trace(A), np.linalg.det(A))          # 4.0 3.0
print(w.sum(), w.prod())                      # 4.0 3.0  — 합은 대각합, 곱은 행렬식

대칭 행렬에는 eig 대신 eigh 를 씁니다. 이름 끝의 h는 대칭인 경우를 가리키고, 그 구조를 쓰는 알고리즘이라 빠를 뿐 아니라 실수 고윳값과 직교하는 고유벡터를 보장 합니다. eig 로 대칭 행렬을 풀면 이론상 실수인 값에 10−1710^{-17} 짜리 허수부가 붙어 돌아오는 일이 있는데, eigh 는 그럴 일이 없습니다. 고윳값도 오름차순으로 정렬해 돌려줍니다.

w2, V2 = np.linalg.eigh(A)
print(w2)                                     # [1. 3.]  — 오름차순
print(np.allclose(V2.T @ V2, np.eye(2)))      # True — 열이 정규직교

부호와 순서

같은 코드를 다른 환경에서 돌리면 고유벡터의 부호가 뒤집혀 나올 수 있고, eig 는 고윳값의 순서도 보장하지 않습니다. 값을 눈으로 비교하다 "결과가 다르다"고 놀라기 쉬운 자리입니다.

print(np.allclose(A @ V[:, 0], w[0] * V[:, 0]))   # True — 정의로 확인한다

비교는 값이 아니라 정의로 합니다. Av=λvA\mathbf{v} = \lambda\mathbf{v} 를 직접 확인하거나, 고윳값을 정렬한 뒤 견주거나, 부호를 손으로 고정하고 나서 비교합니다.

대각화와 거듭제곱도 한 줄씩입니다.

P, L = V, np.diag(w)
print(np.allclose(P @ L @ np.linalg.inv(P), A))          # True
print(np.allclose(P @ (L ** 5) @ np.linalg.inv(P),
                  np.linalg.matrix_power(A, 5)))         # True

대각화가 안 되는 행렬에서

대각화되지 않는 두 경우도 그대로 보입니다.

N = np.array([[1., 1], [0, 1]])               # 전단
print(np.linalg.eig(N).eigenvalues)           # [1. 1.]
print(np.linalg.matrix_rank(np.linalg.eig(N).eigenvectors))   # 1 — 방향이 하나뿐

R = np.array([[0., -1], [1, 0]])              # 90도 회전
print(np.linalg.eigvals(R))                   # [0.+1.j 0.-1.j]  실수가 아니다

전단 쪽에서 눈여겨볼 것은 오류가 나지 않는다는 점입니다. eig 는 고윳값을 둘 돌려주고 고유벡터도 두 열을 돌려주는데, 두 열이 사실상 같은 방향이라 계수가 1입니다. 그대로 PP 로 써서 PΛP−1P\Lambda P^{-1} 을 계산하면 역행렬 자리에서 값이 터지거나 엉뚱한 수가 나옵니다. 대각화가 되는지는 라이브러리가 알려 주지 않으므로 고유벡터 행렬의 계수를 직접 봐야 합니다.

정리

  • 고유벡터는 방향이 변하지 않는 벡터이고, 그때의 배율이 고윳값입니다. Av=λvA\mathbf{v} = \lambda\mathbf{v}, 단 v≠0\mathbf{v} \ne \mathbf{0} 입니다. λ=0\lambda=0 은 그 방향이 뭉개진다는 뜻이라 det⁡A=0\det A = 0 과 같은 말이고, λ=1\lambda=1 은 그 방향이 그대로 남는다는 뜻입니다.
  • 고유벡터는 길이와 부호가 안 정해집니다. 라이브러리는 길이를 1로 맞춰 주지만 부호는 구현이 정합니다.
  • 특성방정식은 det⁡(A−λI)=0\det(A-\lambda I) = 0 이고, 2×22\times2 에서 전개하면 λ2−(tr⁡A)λ+det⁡A=0\lambda^2 - (\operatorname{tr}A)\lambda + \det A = 0 입니다. 삼각행렬이면 대각 성분이 그대로 고윳값입니다.
  • 수치 계산은 이 다항식을 풀지 않습니다. 계수에서 근을 찾는 문제가 불안정해서, 라이브러리는 행렬을 삼각형에 가깝게 몰아가는 다른 알고리즘을 씁니다.
  • 근과 계수의 관계를 읽으면 합이 대각합, 곱이 행렬식입니다. 두 수만으로 판별식의 부호가 정해지므로 고윳값을 풀지 않고 갈래를 읽을 수 있고, 두 수는 기저를 바꿔도 변하지 않습니다.
  • 합이 0인데 곱이 양수 같은 조합은 실수로 불가능하고, 그런 자리가 회전입니다.
  • 행마다 대각 성분을 가운데, 나머지 합을 반지름으로 잡은 구간의 합집합 안에 고윳값이 전부 들어갑니다. 대각이 크고 나머지가 작을수록 좁게 가둡니다.
  • 고유공간은 부분공간이라 고유벡터는 직선(또는 그 이상)으로 나옵니다. 고윳값이 서로 다르면 고유벡터는 저절로 일차독립이고, 중근이면 고유공간의 차원을 직접 봐야 합니다.
  • 대각화 A=PΛP−1A = P\Lambda P^{-1} 은 독립인 고유벡터가 nn 개일 때 가능하고, Ak=PΛkP−1A^k = P\Lambda^kP^{-1} 로 거듭제곱이 수의 거듭제곱이 됩니다. 제곱근·지수·역행렬도 같은 방식으로 대각에 먹입니다.
  • PP 의 열이 정규직교이면 P−1=P⊤P^{-1} = P^\top 이라 역행렬을 구할 일이 없습니다.
  • 전단은 방향이 모자라고 회전은 실수 방향이 없어 대각화되지 않습니다. 대칭 행렬에서는 이런 일이 없지만, 대칭은 충분조건일 뿐입니다. 그리고 두 고유 방향이 거의 평행하면 대각화는 되어도 수치적으로 무너집니다.

다음 글은 AkA^k 를 끝까지 밀어붙입니다 — 반복해 곱할 때 가장 큰 고윳값 하나가 나머지를 어떻게 압도하는지, 그리고 그 성질을 거꾸로 이용해 곱셈만으로 최대 고윳값을 찾아내는 방법입니다.


읽어주셔서 감사합니다. 😊

LATEST

수학의 최신 글

수학2026.09.07

양자화 오차: 격자 사상, 오차 분산, 이상치 채널

실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.

중급18 MIN
수학2026.09.07

수치적으로 안정한 계산 패턴 모음

최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.

중급22 MIN
수학2026.09.07

부동소수점은 어디서 새는가: 반올림, 상쇄, 더하는 순서

0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.

중급23 MIN