고급 선형 대수 Lecture 2: 행렬곱의 네 가지 관점과 다섯 가지 분해

전체 목차 · 이전: Lecture 1 · 다음: Lecture 3

책과 강의

구분 출처와 범위
교재 Gilbert Strang, Linear Algebra and Learning from Data, 2019. Part I — Highlights of Linear Algebra, I.2 — Matrix-Matrix Multiplication AB, pp. 9–13
강의 MIT 18.065, Spring 2018. Lecture 2 — Multiplying and Factoring Matrices
연결 읽기 강의의 네 부분공간과 소거법에 대응하는 I.3 — The Four Fundamental Subspaces, pp. 14–20; I.4 — Elimination and A = LU, pp. 21–28. 두 절의 독립적인 보완 글은 전체 목차에 별도로 남겨 둡니다.
지정 문제 I.2의 2, 6번, p. 13. 강의 페이지와 전체 문제집 참조

이 글의 기본 범위는 I.2이며, 강의 후반의 소거법과 네 부분공간도 연결해서 다룹니다. 쪽수는 인쇄쪽수입니다. I.2는 제공된 스캔본의 PDF 12–14번째 페이지에 있습니다. 별도로 지정 문제라고 표시한 부분 외의 수치 예제는 설명을 위해 구성했습니다.

Lecture 1에서는 AxAx를 열의 선형결합으로 보았습니다. 이번에는 입력 벡터를 여러 개 나란히 놓은 ABAB를 생각합니다. 같은 곱셈을 어떤 묶음으로 읽느냐에 따라 계산, 공간, 분해가 서로 연결됩니다.

1. 먼저 크기와 순서를 확인한다

A∈Rm×n,B∈Rn×p⟹AB∈Rm×p.A\in\mathbb R^{m\times n},\qquad B\in\mathbb R^{n\times p} \quad\Longrightarrow\quad AB\in\mathbb R^{m\times p}.

BB가 Rp\mathbb R^p에서 Rn\mathbb R^n으로, AA가 다시 Rm\mathbb R^m으로 보냅니다. ABx=A(Bx)ABx=A(Bx)이므로 오른쪽 변환을 먼저 적용합니다.

곱셈의 순서는 바꿀 수 없습니다. BABA는 크기부터 맞지 않을 수 있고, 둘 다 정의되어도 보통 AB≠BAAB\ne BA입니다. 반면 크기가 맞으면 결합법칙 (AB)C=A(BC)(AB)C=A(BC)은 성립합니다. 전치에서는 순서가 뒤집힙니다.

(AB)T=BTAT.(AB)^T=B^TA^T.

아래 예제를 네 가지 방식으로 계산하겠습니다.

A=[120011],B=[100123].A=\begin{bmatrix}1&2&0\\0&1&1\end{bmatrix},\qquad B=\begin{bmatrix}1&0\\0&1\\2&3\end{bmatrix}.

2. 성분 하나: 행과 열의 내적

가장 익숙한 공식은

(AB)ij=∑k=1naikbkj(AB)_{ij}=\sum_{k=1}^{n}a_{ik}b_{kj}

입니다. AA의 ii번째 행과 BB의 jj번째 열을 내적합니다. 예제에서

AB=[1⋅1+2⋅0+0⋅21⋅0+2⋅1+0⋅30⋅1+1⋅0+1⋅20⋅0+1⋅1+1⋅3]=[1224].AB=\begin{bmatrix} 1\cdot1+2\cdot0+0\cdot2&1\cdot0+2\cdot1+0\cdot3\\ 0\cdot1+1\cdot0+1\cdot2&0\cdot0+1\cdot1+1\cdot3 \end{bmatrix} =\begin{bmatrix}1&2\\2&4\end{bmatrix}.

이 관점은 특정 성분을 확인할 때 좋습니다. 표준적인 직접 계산은 곱셈 mnpmnp번을 사용합니다. 합을 묶는 순서를 바꾸는 것만으로 이 곱셈 횟수가 줄어들지는 않습니다.

3. 열 전체: AB의 열은 A의 열공간 안에 있다

B=[b1 ⋯ bp]B=[b_1\ \cdots\ b_p]라 쓰면

AB=[Ab1 ⋯ Abp].AB=[Ab_1\ \cdots\ Ab_p].

각 결과 열은 AA의 열을 bjb_j의 성분으로 선형결합한 것입니다. 예제의 첫 번째 열과 두 번째 열은

Ab1=[10]+2[01]=[12],Ab2=[21]+3[01]=[24].Ab_1=\begin{bmatrix}1\\0\end{bmatrix} +2\begin{bmatrix}0\\1\end{bmatrix} =\begin{bmatrix}1\\2\end{bmatrix},\qquad Ab_2=\begin{bmatrix}2\\1\end{bmatrix} +3\begin{bmatrix}0\\1\end{bmatrix} =\begin{bmatrix}2\\4\end{bmatrix}.

따라서

C(AB)⊆C(A).\mathcal C(AB)\subseteq\mathcal C(A).

단, 포함관계가 항상 등호는 아닙니다. 이 예제에서 AA의 열공간은 R2\mathbb R^2 전체이지만 ABAB의 두 열은 같은 직선 위에 있습니다.

4. 행 전체: AB의 행은 B의 행공간 안에 있다

행도 같은 방식으로 읽을 수 있습니다.

(AB)i,:=∑k=1naikBk,:.(AB)_{i,:}=\sum_{k=1}^{n}a_{ik}B_{k,:}.

예제의 첫 행은 BB의 첫 행에 둘째 행의 두 배를 더한 (1,2)(1,2)이고, 둘째 행은 BB의 둘째 행과 셋째 행을 더한 (2,4)(2,4)입니다. 그러므로

C((AB)T)⊆C(BT),rank⁡(AB)≤min⁡{rank⁡(A),rank⁡(B)}.\mathcal C((AB)^T)\subseteq\mathcal C(B^T),\qquad \operatorname{rank}(AB)\leq \min\{\operatorname{rank}(A),\operatorname{rank}(B)\}.

곱셈 중 정보가 사라질 수 있습니다. 예제에서는 A,BA,B 모두 랭크 2지만 ABAB는 랭크 1입니다. BB가 만드는 어떤 방향을 AA가 영벡터로 보내기 때문입니다.

5. 행렬 전체: 열과 행의 외적을 더한다

이번에는 안쪽 인덱스 kk별로 묶습니다. ak=A:,ka_k=A_{:,k}를 AA의 열이라고 하면

AB=∑k=1nakBk,:.\boxed{AB=\sum_{k=1}^{n}a_kB_{k,:}}.

각 항의 크기는 (m×1)(1×p)=m×p(m\times1)(1\times p)=m\times p입니다. 내적이 숫자 하나를 만드는 것과 달리, 외적은 행렬 하나를 만듭니다. 예제에서는

AB=[10][10]+[21][01]+[01][23]AB= \begin{bmatrix}1\\0\end{bmatrix}\begin{bmatrix}1&0\end{bmatrix} +\begin{bmatrix}2\\1\end{bmatrix}\begin{bmatrix}0&1\end{bmatrix} +\begin{bmatrix}0\\1\end{bmatrix}\begin{bmatrix}2&3\end{bmatrix}

=[1000]+[0201]+[0023].=\begin{bmatrix}1&0\\0&0\end{bmatrix} +\begin{bmatrix}0&2\\0&1\end{bmatrix} +\begin{bmatrix}0&0\\2&3\end{bmatrix}.

uvTuv^T의 모든 열은 uu의 배수이고 모든 행은 vTv^T의 배수입니다. 따라서 u,vu,v가 모두 영벡터가 아니면 랭크 1, 어느 하나가 영벡터면 랭크 0입니다. 여러 랭크 1 행렬을 더할 때에는 방향이 중복되거나 상쇄될 수 있으므로, 합의 랭크가 항의 개수와 같다는 보장은 없습니다.

6. 다섯 가지 분해를 한 표로 읽기

교재 I.2는 행렬곱을 거꾸로 바라보게 합니다. 곱을 계산하는 대신, 주어진 행렬을 성질이 좋은 인수로 나눕니다.

분해 조건과 인수의 의미 무엇을 드러내는가
PA=LUPA=LU 정사각 가역행렬의 소거법. PP는 행 교환, L,UL,U는 아래·위 삼각행렬 연립방정식을 두 삼각계로 풀기
A=QRA=QR 열이 독립인 m×nm\times n 행렬에서는 QTQ=InQ^TQ=I_n, RR은 가역인 위 삼각행렬 직교기저와 그 기저에서의 좌표
S=QΛQTS=Q\Lambda Q^T 실수 대칭행렬. QQ는 정규직교 고유벡터, Λ\Lambda는 실수 고유값 서로 직교하는 방향별 작용
A=XΛX−1A=X\Lambda X^{-1} 정사각행렬에 독립인 고유벡터가 충분할 때. 경우에 따라 복소수 사용 같은 고유벡터 기저에서의 대각화
A=UΣVTA=U\Sigma V^T 모든 실수 직사각형 행렬. U,VU,V는 직교행렬, Σ\Sigma는 비음수 대각 성분을 갖는 직사각형 행렬 입력·출력의 두 직교기저와 늘어나는 정도

QR에는 랭크가 부족한 행렬을 위한 형태도 있지만, 위 표는 열이 독립인 경우의 간단한 형태를 적었습니다. 일반적인 대각화와 SVD를 혼동하지 않아야 합니다. 전자는 실패하는 행렬이 있지만 후자는 항상 존재합니다.

7. LU를 랭크 1 조각으로 이해하기

직접 구성한 행렬

M=[2165]M=\begin{bmatrix}2&1\\6&5\end{bmatrix}

의 둘째 행에서 첫째 행의 3배를 빼면 U=[2102]U=\begin{bmatrix}2&1\\0&2\end{bmatrix}입니다. 사용한 배수 3을 저장하면

M=[1031]⏟L[2102]⏟U=[13][21]+[01][02].M=\underbrace{\begin{bmatrix}1&0\\3&1\end{bmatrix}}_L \underbrace{\begin{bmatrix}2&1\\0&2\end{bmatrix}}_U =\begin{bmatrix}1\\3\end{bmatrix}\begin{bmatrix}2&1\end{bmatrix} +\begin{bmatrix}0\\1\end{bmatrix}\begin{bmatrix}0&2\end{bmatrix}.

첫 조각은 원래 행렬의 첫 행과 첫 열을 정확하게 재현합니다. 이것을 빼면 오른쪽 아래에 작은 문제가 남습니다.

M−[2163]=[0002].M-\begin{bmatrix}2&1\\6&3\end{bmatrix} =\begin{bmatrix}0&0\\0&2\end{bmatrix}.

일반적으로 첫 피벗 a≠0a\ne0인 블록 행렬은

[abTcD]=[1c/a][abT]+[000D−cbT/a].\begin{bmatrix}a&b^T\\c&D\end{bmatrix} =\begin{bmatrix}1\\c/a\end{bmatrix}\begin{bmatrix}a&b^T\end{bmatrix} +\begin{bmatrix}0&0\\0&D-cb^T/a\end{bmatrix}.

남는 D−cbT/aD-cb^T/a에 같은 과정을 반복하는 것이 소거법입니다. 이 블록을 Schur complement라고 부릅니다. 이 관점은 강의에서 소개하는 외적과 LU의 연결을 보여 줍니다.

가역이라고 해서 행 교환 없는 LULU가 항상 가능한 것은 아닙니다. 예를 들어 [0110]\begin{bmatrix}0&1\\1&0\end{bmatrix}는 가역이지만 첫 피벗이 0입니다. 이때에는 행을 교환한 PA=LUPA=LU를 사용합니다. 실제 계산에서는 0이 아닌 작은 피벗도 수치 오차를 키울 수 있어 피벗 선택이 중요합니다.

Mx=dMx=d를 풀 때에는 Ly=dLy=d를 먼저 풀고 Ux=yUx=y를 풉니다. 역행렬 전체를 구할 필요 없이 같은 분해를 여러 우변에 재사용할 수 있습니다.

8. 대칭행렬의 분해도 외적의 합이다

S=QΛQTS=Q\Lambda Q^T에서 Q=[q1 ⋯ qn]Q=[q_1\ \cdots\ q_n]이면 QΛQ\Lambda의 ii번째 열은 λiqi\lambda_iq_i입니다. 따라서

S=∑i=1nλiqiqiT.S=\sum_{i=1}^{n}\lambda_iq_iq_i^T.

정규직교성 qiTqj=δijq_i^Tq_j=\delta_{ij} 때문에

Sqj=∑iλiqi(qiTqj)=λjqj.Sq_j=\sum_i\lambda_iq_i(q_i^Tq_j)=\lambda_jq_j.

각 조각은 qiq_i 방향의 성분만 골라 λi\lambda_i배 합니다. 예를 들어

S=[3113],q1=12[11],q2=12[1−1]S=\begin{bmatrix}3&1\\1&3\end{bmatrix},\quad q_1=\frac1{\sqrt2}\begin{bmatrix}1\\1\end{bmatrix},\quad q_2=\frac1{\sqrt2}\begin{bmatrix}1\\-1\end{bmatrix}

이면 S=4q1q1T+2q2q2TS=4q_1q_1^T+2q_2q_2^T입니다. 같은 방향에서 반복해서 작용하므로 Sk=4kq1q1T+2kq2q2TS^k=4^kq_1q_1^T+2^kq_2q_2^T도 바로 얻습니다. 자세한 대각화는 Lecture 4에서 다룹니다.

SVD에서도 같은 외적 규칙을 사용하여 A=∑i=1rσiuiviTA=\sum_{i=1}^r\sigma_i u_i v_i^T로 씁니다. 다만 입력 방향 viv_i와 출력 방향 uiu_i가 서로 다를 수 있다는 차이가 있습니다.

9. 강의 후반: 네 기본 부분공간

A∈Rm×nA\in\mathbb R^{m\times n}, rank⁡(A)=r\operatorname{rank}(A)=r에 대해 네 공간을 구별합니다.

공간 정의 놓이는 공간 차원
열공간 C(A)\mathcal C(A) 가능한 모든 출력 AxAx Rm\mathbb R^m rr
행공간 C(AT)\mathcal C(A^T) 행들의 선형결합 Rn\mathbb R^n rr
영공간 N(A)\mathcal N(A) Ax=0Ax=0인 입력 Rn\mathbb R^n n−rn-r
왼쪽 영공간 N(AT)\mathcal N(A^T) ATy=0A^Ty=0인 벡터 Rm\mathbb R^m m−rm-r

영공간에 x,zx,z가 있으면 A(αx+βz)=0A(\alpha x+\beta z)=0이므로 선형결합도 그 공간에 남습니다. 자유변수의 개수가 n−rn-r라는 소거법의 결과가 영공간의 차원을 줍니다.

공간 사이의 관계는 차원뿐 아니라 직교성으로도 나타납니다.

N(A)=C(AT)⊥,N(AT)=C(A)⊥.\mathcal N(A)=\mathcal C(A^T)^\perp,\qquad \mathcal N(A^T)=\mathcal C(A)^\perp.

Ax=0Ax=0은 xx가 AA의 모든 행과 수직이라는 뜻이기 때문입니다. 따라서 입력은 유일하게

x=xrow+xnull,Ax=Axrowx=x_{\rm row}+x_{\rm null},\qquad Ax=Ax_{\rm row}

로 분해됩니다. 행공간에 제한한 AA는 열공간으로 가는 일대일 대응입니다. 행공간 안의 벡터가 영공간에도 속하려면 영벡터여야 하기 때문입니다. Lecture 3에서는 이 분해를 정사영으로 계산합니다.

10. 지정 문제 풀이 — I.2의 2, 6번

2번: 외적의 크기와 성분

a∈Rma\in\mathbb R^m, b∈Rpb\in\mathbb R^p이면 abTab^T는 m×pm\times p 행렬이고 (i,j)(i,j) 성분은 aibja_i b_j입니다. aaTaa^T는 m×mm\times m 대칭행렬입니다.

(aaT)T=aaT,xTaaTx=(aTx)2≥0.(aa^T)^T=aa^T,\qquad x^Taa^Tx=(a^Tx)^2\ge0.

즉 대칭일 뿐 아니라 양의 준정부호입니다. a≠0a\ne0일 때 랭크는 1입니다. m>1m>1이면 aa에 수직인 영이 아닌 xx가 있어 에너지가 0이 되므로 양의 정부호는 아닙니다. 준정부호와 정부호는 Lecture 5에서 구별합니다.

6번: B가 단위행렬일 때

A=[a1 a2 a3]A=[a_1\ a_2\ a_3], B=I3B=I_3라면

AI3=a1e1T+a2e2T+a3e3T.AI_3=a_1e_1^T+a_2e_2^T+a_3e_3^T.

a1e1T=[a1 0 0]a_1e_1^T=[a_1\ 0\ 0]이고 나머지 항도 각각 두 번째·세 번째 열만 채웁니다. 세 항을 더하면 정확히 AA가 됩니다. 이 예제는 외적 합에서 어떤 항이 어느 열을 만드는지 가장 쉽게 보여 줍니다.

11. NumPy로 확인하기

아래 코드는 외적의 합, 곱의 랭크 감소, LU와 대칭 분해를 함께 검증합니다.

import numpy as np

A = np.array([[1., 2., 0.], [0., 1., 1.]])
B = np.array([[1., 0.], [0., 1.], [2., 3.]])
pieces = [np.outer(A[:, k], B[k, :]) for k in range(3)]
assert np.allclose(sum(pieces), A @ B)
assert np.allclose(A @ B, [[1., 2.], [2., 4.]])
assert np.linalg.matrix_rank(A) == np.linalg.matrix_rank(B) == 2
assert np.linalg.matrix_rank(A @ B) == 1

M = np.array([[2., 1.], [6., 5.]])
L = np.array([[1., 0.], [3., 1.]])
U = np.array([[2., 1.], [0., 2.]])
assert np.allclose(M, L @ U)

Q = np.array([[1., 1.], [1., -1.]]) / np.sqrt(2)
S = np.array([[3., 1.], [1., 3.]])
assert np.allclose(Q.T @ Q, np.eye(2))
assert np.allclose(S, Q @ np.diag([4., 2.]) @ Q.T)
assert np.allclose(np.linalg.matrix_power(S, 3),
Q @ np.diag([4.**3, 2.**3]) @ Q.T)
print("Matrix multiplication and factorization checks passed.")

12. 복습 질문

  1. 내적과 외적은 각각 어떤 크기의 결과를 만드는가?
  2. C(AB)⊆C(A)\mathcal C(AB)\subseteq\mathcal C(A)가 등호가 되지 않는 예를 설명할 수 있는가?
  3. 소거법의 한 단계를 랭크 1 행렬을 떼어 내는 과정으로 쓸 수 있는가?
  4. A=XΛX−1A=X\Lambda X^{-1}와 A=UΣVTA=U\Sigma V^T의 존재 조건은 어떻게 다른가?
  5. 네 기본 부분공간의 차원과 서로 직교하는 두 쌍을 기억하는가?

참고 자료

이전: Lecture 1 · 전체 목차 · 다음: Lecture 3