고급 선형 대수 Lecture 1: 열공간과 랭크, A = CR 분해

시리즈 전체 목차 · 고급 선형 대수 글 목록

책과 강의

구분 출처와 범위
교재 Gilbert Strang, Linear Algebra and Learning from Data, 2019. Part I — Highlights of Linear Algebra, I.1 — Multiplication Ax Using Columns of A, pp. 2–8
강의 MIT 18.065, Spring 2018. Lecture 1 — The Column Space of A Contains All Vectors Ax
강의 후반의 연결 내용 I.2 — Matrix-Matrix Multiplication AB, p. 9의 외적 해석. 다음 강의에서 이어서 다룹니다.
과제 I.1의 1, 4, 9, 18번. Lecture 1의 Problem Set과 전체 문제집에서 확인할 수 있습니다.

쪽수는 책에 인쇄된 번호입니다. 제공된 스캔본에서는 I.1이 PDF 뷰어의 9–12번째 페이지에 걸쳐 있습니다. 이 글의 주 예제는 계산 과정을 쉽게 따라갈 수 있도록 직접 구성했습니다.

행렬곱 AxAx를 계산할 줄 안다고 해서, 그 결과가 어떤 벡터가 될 수 있는지 바로 알 수 있는 것은 아닙니다. 이번 글에서는 입력 xx를 자유롭게 바꿀 때 출력 AxAx가 어디까지 움직일 수 있는가를 살펴봅니다. 이 질문을 따라가면 열공간, 기저, 랭크, 행렬 분해가 하나로 연결됩니다.

1. 행렬과 벡터의 곱은 열의 선형결합이다

실수 행렬 A∈Rm×nA\in\mathbb{R}^{m\times n}의 열을 a1,…,ana_1,\ldots,a_n이라고 쓰겠습니다. 각 aja_j는 mm개의 성분을 가진 벡터이고, 입력 x∈Rnx\in\mathbb{R}^n은 열마다 곱할 계수를 담습니다.

A=[a1a2⋯an],Ax=x1a1+x2a2+⋯+xnan.A=\begin{bmatrix}a_1&a_2&\cdots&a_n\end{bmatrix},\qquad Ax=x_1a_1+x_2a_2+\cdots+x_na_n.

오른쪽 식은 벡터의 선형결합입니다. 계수는 음수나 0이어도 되고, 합이 1일 필요도 없습니다. 행렬의 각 행과 xx를 내적해서 구하는 성분

(Ax)i=∑j=1naijxj(Ax)_i=\sum_{j=1}^{n}a_{ij}x_j

도 같은 계산입니다. 열의 관점은 여러 성분을 묶어 하나의 출력 벡터로 이해하게 해 줍니다. 교재 I.1, pp. 2–3의 출발점이 바로 이 해석입니다.

이 글에서는 다음 행렬을 계속 사용하겠습니다.

A=[102011113],a1=[101],a2=[011],a3=[213].A=\begin{bmatrix} 1&0&2\\ 0&1&1\\ 1&1&3 \end{bmatrix},\quad a_1=\begin{bmatrix}1\\0\\1\end{bmatrix},\quad a_2=\begin{bmatrix}0\\1\\1\end{bmatrix},\quad a_3=\begin{bmatrix}2\\1\\3\end{bmatrix}.

예를 들어 x=(2,−1,1)Tx=(2,-1,1)^T이면

Ax=2a1−a2+a3=[404].Ax=2a_1-a_2+a_3 =\begin{bmatrix}4\\0\\4\end{bmatrix}.

행렬의 크기도 확인할 수 있습니다. (3×3)(3×1)(3\times3)(3\times1)의 결과는 3×13\times1입니다. 일반적으로 AA는 Rn\mathbb{R}^n의 입력을 Rm\mathbb{R}^m의 출력으로 보냅니다.

2. 모든 출력이 모이면 열공간이 된다

입력을 하나로 고정하지 않고 모든 x∈Rnx\in\mathbb{R}^n을 넣어 봅시다. 얻을 수 있는 출력 전체가 AA의 열공간입니다.

Col⁡(A)={Ax:x∈Rn}=span⁡{a1,…,an}⊆Rm.\operatorname{Col}(A) =\{Ax:x\in\mathbb{R}^n\} =\operatorname{span}\{a_1,\ldots,a_n\} \subseteq\mathbb{R}^m.

Strang은 열공간을 C(A)C(A)라고도 씁니다. 이 글에서는 나중에 등장하는 행렬 CC와 구별하기 위해 Col⁡(A)\operatorname{Col}(A)를 사용합니다.

이 집합에는 원점이 들어 있습니다. A0=0A0=0이기 때문입니다. 두 출력 Ax,AyAx,Ay의 선형결합도

αAx+βAy=A(αx+βy)\alpha Ax+\beta Ay=A(\alpha x+\beta y)

처럼 다시 출력으로 나타낼 수 있습니다. 따라서 열공간은 Rm\mathbb{R}^m의 부분공간입니다.

주 예제에서는 a3=2a1+a2a_3=2a_1+a_2입니다. 이를 대입하면

Ax=(x1+2x3)a1+(x2+x3)a2.Ax=(x_1+2x_3)a_1+(x_2+x_3)a_2.

세 번째 열을 사용하더라도 처음 두 열의 선형결합 범위를 벗어나지 않습니다. s=x1+2x3s=x_1+2x_3, t=x2+x3t=x_2+x_3라고 두면

Col⁡(A)={[sts+t]:s,t∈R}.\operatorname{Col}(A) =\left\{\begin{bmatrix}s\\t\\s+t\end{bmatrix}:s,t\in\mathbb{R}\right\}.

이는 R3\mathbb{R}^3 전체가 아니라 b3=b1+b2b_3=b_1+b_2를 만족하는 원점 통과 평면입니다. 반대로 이 평면의 임의의 점은 x=(s,t,0)Tx=(s,t,0)^T를 넣어 얻을 수 있으므로, 포함 관계뿐 아니라 집합의 일치까지 확인한 셈입니다.

3. Ax = b의 해가 존재한다는 뜻

열공간의 정의를 방정식의 언어로 읽으면 다음과 같습니다.

Ax=b의 해가 존재한다⟺b∈Col⁡(A).Ax=b\text{의 해가 존재한다} \quad\Longleftrightarrow\quad b\in\operatorname{Col}(A).

주 예제에서 b=(4,3,7)Tb=(4,3,7)^T는 평면 위에 있습니다. 해를 구하면

x1+2x3=4,x2+x3=3x_1+2x_3=4,\qquad x_2+x_3=3

이므로, x3=tx_3=t를 자유롭게 정할 수 있습니다.

x=[430]t[−2−11],t∈R.x=\begin{bmatrix}4\\3\\0\end{bmatrix} t\begin{bmatrix}-2\\-1\\1\end{bmatrix},\qquad t\in\mathbb{R}.

반면 b=(0,0,1)Tb=(0,0,1)^T는 b3=b1+b2b_3=b_1+b_2를 만족하지 않으므로 해가 없습니다. 이 경우에는 계산을 시작하기 전에 해가 없다는 것을 판단할 수 있습니다.

여기서 해의 존재와 유일성은 별개의 문제입니다. 열공간은 만들 수 있는 출력의 범위를 말합니다. 서로 다른 입력이 같은 출력으로 가는지는 열 사이의 선형관계와 연결됩니다. 위에서 자유롭게 더한 (−2,−1,1)T(-2,-1,1)^T는 Az=0Az=0을 만족하는 영공간의 벡터입니다. 영공간과 네 가지 기본 부분공간은 교재 I.3에서 더 자세히 다룹니다.

4. 선형독립, 기저, 랭크

벡터 c1,…,crc_1,\ldots,c_r가 선형독립이라는 말은

α1c1+⋯+αrcr=0⟹α1=⋯=αr=0\alpha_1c_1+\cdots+\alpha_rc_r=0 \quad\Longrightarrow\quad \alpha_1=\cdots=\alpha_r=0

이라는 뜻입니다. 한 벡터를 나머지 벡터의 선형결합으로 표현할 수 있다면 선형종속입니다. 벡터가 서로 다르다는 사실만으로 선형독립을 결론 낼 수는 없습니다.

어떤 공간의 기저가 되려면 두 조건을 함께 만족해야 합니다.

  1. 선택한 벡터들이 선형독립이다.
  2. 그 벡터들의 선형결합으로 공간의 모든 벡터를 만들 수 있다.

주 예제의 a1,a2a_1,a_2는 첫째·둘째 성분을 보면 선형독립임을 알 수 있습니다. 두 열이 전체 열공간을 생성하므로 열공간의 기저입니다. 기저에 포함되는 벡터 수가 공간의 차원이고, 열공간의 차원을 행렬의 랭크라고 합니다.

rank⁡(A)=dim⁡Col⁡(A)=r,0≤r≤min⁡(m,n).\operatorname{rank}(A)=\dim\operatorname{Col}(A)=r, \qquad 0\leq r\leq\min(m,n).

따라서 주 예제의 랭크는 2입니다. 기저를 다른 벡터들로 선택할 수는 있어도 그 개수는 변하지 않습니다. 교재 I.1, p. 4에서 강조하는 구별입니다.

랭크 R3\mathbb{R}^3 안에서 열공간의 모습
0 영벡터 하나
1 원점을 지나는 직선
2 원점을 지나는 평면
3 R3\mathbb{R}^3 전체

일반적인 m×nm\times n 행렬에서는 r=mr=m이면 모든 b∈Rmb\in\mathbb{R}^m에 대해 해가 존재하고, r=nr=n이면 해가 존재할 때 유일합니다. 정사각행렬에서는 두 조건이 합쳐져 가역성과 연결됩니다.

5. 독립인 열과 조합 계수를 분리하면 A = CR

랭크가 rr인 행렬에서 열공간의 기저가 되는 실제 열 rr개를 뽑아 CC에 모읍니다. 그러면 AA의 각 열은 CC의 열들의 선형결합으로 유일하게 표현됩니다. 그 계수들을 열별로 모은 행렬이 RR입니다.

A⏟m×n=C⏟m×rR⏟r×n.\underbrace{A}_{m\times n} =\underbrace{C}_{m\times r}\underbrace{R}_{r\times n}.

주 예제에서는

C=[100111],R=[102011].C=\begin{bmatrix}1&0\\0&1\\1&1\end{bmatrix},\qquad R=\begin{bmatrix}1&0&2\\0&1&1\end{bmatrix}.

RR의 첫째 열 (1,0)T(1,0)^T는 a1a_1을, 둘째 열 (0,1)T(0,1)^T는 a2a_2를, 셋째 열 (2,1)T(2,1)^T는 2a1+a22a_1+a_2를 만들라는 뜻입니다. 따라서 CR=ACR=A입니다.

Rn→ R Rr→ C Col⁡(A)⊆Rm.\mathbb{R}^n\xrightarrow{\ R\ }\mathbb{R}^r \xrightarrow{\ C\ }\operatorname{Col}(A)\subseteq\mathbb{R}^m.

이 그림에서 RR은 입력을 기저에 대한 좌표로 바꾸고, CC는 그 좌표를 실제 출력 벡터로 만듭니다. 주 예제에서는 Rx=(x1+2x3,x2+x3)TRx=(x_1+2x_3,x_2+x_3)^T입니다.

기저 열을 원래 순서대로 왼쪽부터 선택하면 RR은 AA의 기약 행 사다리꼴에서 영행을 제거한 행렬과 일치합니다. 다른 기저 열이나 순서를 택해도 A=CRA=CR은 가능하지만, 그때의 RR을 항상 같은 기약 행 사다리꼴이라고 부를 수는 없습니다.

교재 I.1, pp. 4–5와 Lecture 1의 핵심이 이 분해입니다.

6. 왜 행 랭크와 열 랭크가 같은가

행공간은 AA의 행들의 선형결합 전체입니다. 행을 열벡터로 세워서 보면

Row⁡(A)=Col⁡(AT)⊆Rn.\operatorname{Row}(A)=\operatorname{Col}(A^T)\subseteq\mathbb{R}^n.

열공간은 Rm\mathbb{R}^m에, 행공간은 Rn\mathbb{R}^n에 있습니다. 두 공간이 같다는 주장이 아니라 차원이 같다는 정리를 증명하려는 것입니다.

A=CRA=CR을 행의 관점으로 읽어 봅시다. AA의 ii번째 행은 RR의 행들을 CC의 ii번째 행에 적힌 계수로 조합한 결과입니다. RR에는 rr개의 행만 있으므로

Row⁡(A)⊆Row⁡(R),dim⁡Row⁡(A)≤r=dim⁡Col⁡(A).\operatorname{Row}(A)\subseteq\operatorname{Row}(R),\qquad \dim\operatorname{Row}(A)\leq r=\dim\operatorname{Col}(A).

이 논리는 모든 행렬에 적용됩니다. 이번에는 ATA^T에 똑같이 적용하면 반대 방향의 부등식을 얻습니다.

dim⁡Col⁡(A)=dim⁡Row⁡(AT)≤dim⁡Col⁡(AT)=dim⁡Row⁡(A).\dim\operatorname{Col}(A) =\dim\operatorname{Row}(A^T) \leq\dim\operatorname{Col}(A^T) =\dim\operatorname{Row}(A).

두 부등식을 합치면

dim⁡Row⁡(A)=dim⁡Col⁡(A).\boxed{\dim\operatorname{Row}(A)=\dim\operatorname{Col}(A)}.

주 예제에서 셋째 행은 첫째 행과 둘째 행의 합입니다. 따라서 독립인 행도 두 개입니다. 그러나 행공간의 벡터는 z3=2z1+z2z_3=2z_1+z_2를 만족하고, 열공간의 벡터는 b3=b1+b2b_3=b_1+b_2를 만족합니다. 차원이 같더라도 다른 평면일 수 있다는 것을 직접 확인할 수 있습니다.

7. 랭크 1 행렬이 행렬곱의 구성 요소가 된다

영벡터가 아닌 u∈Rmu\in\mathbb{R}^m, v∈Rpv\in\mathbb{R}^p에 대해 외적 uvTuv^T를 생각해 봅시다.

uvT=[v1uv2u⋯vpu].uv^T=\begin{bmatrix}v_1u&v_2u&\cdots&v_pu\end{bmatrix}.

모든 열이 uu의 배수이고 적어도 하나는 0이 아니므로 랭크는 1입니다. 둘 중 하나가 영벡터라면 결과는 영행렬이고 랭크는 0입니다.

주 예제의 CRCR도 두 외적의 합으로 쓸 수 있습니다.

A=[101][102]+[011][011].A= \begin{bmatrix}1\\0\\1\end{bmatrix}\begin{bmatrix}1&0&2\end{bmatrix} +\begin{bmatrix}0\\1\\1\end{bmatrix}\begin{bmatrix}0&1&1\end{bmatrix}.

일반적으로 A∈Rm×nA\in\mathbb{R}^{m\times n}, B∈Rn×pB\in\mathbb{R}^{n\times p}일 때

AB=∑k=1nA:,kBk,:.AB=\sum_{k=1}^{n}A_{:,k}B_{k,:}.

각 항은 AA의 열 하나와 BB의 행 하나를 곱한 m×pm\times p 행렬입니다. 이것이 강의 마지막의 행렬곱 해석이며, 교재 I.2, p. 9로 이어집니다. 표준적인 두 계산 방식 모두 스칼라 곱셈을 mnpmnp번 수행합니다. 외적 표현은 계산량을 저절로 줄이기보다는 결과를 작은 랭크의 구성 요소로 이해하게 해 줍니다.

8. 실제 행도 보존하고 싶다면 CMR 분해

A=CRA=CR의 CC는 원래 행렬에서 뽑은 열이지만, RR의 행은 일반적으로 원래 행렬에서 그대로 뽑은 행이 아닙니다. 교재 I.1, p. 8은 실제 행도 선택하는 분해를 소개합니다.

독립인 열을 모은 C∈Rm×rC\in\mathbb{R}^{m\times r}와 독립인 실제 행을 모은 R~∈Rr×n\widetilde R\in\mathbb{R}^{r\times n} 사이에 적절한 r×rr\times r 행렬 MM을 넣으면

A=CMR~.A=CM\widetilde R.

선택한 행과 열이 만나는 r×rr\times r 부분행렬을 WW라고 하면, 정확한 랭크가 rr이고 두 선택이 각각 기저를 이룰 때 WW는 가역이고 M=W−1M=W^{-1}입니다. 이를 확인하려면 A=CRA=CR에서 선택한 행만 남겨 R~=WR\widetilde R=WR를 얻고, R=W−1R~R=W^{-1}\widetilde R를 대입하면 됩니다.

주 예제에서 CC는 그대로 두고, 실제 행 중 첫째·셋째 행을 선택합시다.

R~=[102113],W=[1011],M=[10−11].\widetilde R=\begin{bmatrix}1&0&2\\1&1&3\end{bmatrix},\quad W=\begin{bmatrix}1&0\\1&1\end{bmatrix},\quad M=\begin{bmatrix}1&0\\-1&1\end{bmatrix}.

곱하면 MR~=RM\widetilde R=R이므로 다시 A=CMR~A=CM\widetilde R을 얻습니다. 강의에서는 가운데 행렬을 UU라고 쓰는 CUR 표기도 소개합니다. 임의로 일부 행과 열을 고르기만 하면 항상 정확히 복원되는 것은 아니며, 위 설명에서는 랭크와 독립성 조건이 중요합니다.

9. 데이터 분석으로 이어지는 두 가지 관찰

행렬의 열공간을 알고 싶다면 여러 입력을 한꺼번에 넣을 수도 있습니다. Ω∈Rn×k\Omega\in\mathbb{R}^{n\times k}를 임의의 입력들을 모은 행렬이라고 하면

Y=AΩ⟹Col⁡(Y)⊆Col⁡(A).Y=A\Omega\quad\Longrightarrow\quad \operatorname{Col}(Y)\subseteq\operatorname{Col}(A).

입력을 무작위로 고르는 생각은 이후 Lecture 13의 무작위화 선형대수로 연결됩니다. 여기서 바로 보장되는 것은 포함 관계입니다. 표본 수가 부족하거나 선택이 좋지 않으면 전체 열공간을 찾지 못할 수도 있습니다.

같은 이유로 크기가 맞는 B,D,xB,D,x에 대해 ABDx=A(BDx)ABDx=A(BDx)는 항상 Col⁡(A)\operatorname{Col}(A) 안에 있습니다. 가장 왼쪽 행렬이 허용하는 출력 공간을 곱셈 전체가 벗어날 수 없다는 뜻입니다.

10. Lecture 1 지정 연습문제 풀이

출처는 교재 Problem Set I.1, pp. 6–7의 1, 4, 9, 18번입니다. 문제 번호는 공식 강의 페이지에서도 확인할 수 있습니다. 아래에는 풀이에 필요한 상황만 간단히 적고 계산을 정리했습니다.

I.1의 1번 — 세 벡터의 선형종속

R4\mathbb{R}^4에서 영벡터가 아닌 세 벡터를 다음처럼 고르면 됩니다.

a1=[1000],a2=[0100],a3=[1100].a_1=\begin{bmatrix}1\\0\\0\\0\end{bmatrix},\quad a_2=\begin{bmatrix}0\\1\\0\\0\end{bmatrix},\quad a_3=\begin{bmatrix}1\\1\\0\\0\end{bmatrix}.

a1+a2−a3=0a_1+a_2-a_3=0이므로 A=[a1 a2 a3]A=[a_1\ a_2\ a_3], x=(1,1,−1)Tx=(1,1,-1)^T로 두면 Ax=0Ax=0입니다. 크기는 각각 A:4×3A:4\times3, x:3×1x:3\times1, 출력 영벡터: 4×14\times1입니다. 계수가 전부 0인 자명한 조합을 사용한 것이 아닙니다.

I.1의 4번 — 모든 성분이 1인 행렬의 영공간

JJ를 모든 성분이 1인 3×33\times3 행렬이라고 하면 Jx=0Jx=0은 x1+x2+x3=0x_1+x_2+x_3=0과 같습니다. 따라서

x=[1−10],y=[10−1]x=\begin{bmatrix}1\\-1\\0\end{bmatrix},\qquad y=\begin{bmatrix}1\\0\\-1\end{bmatrix}

가 독립인 두 해입니다. 첫 번째 식은 열벡터 1=(1,1,1)T\mathbf{1}=(1,1,1)^T를 써서 1−1+01=0\mathbf{1}-\mathbf{1}+0\mathbf{1}=0으로 읽을 수 있습니다.

모든 해는 (s,t,−s−t)T(s,t,-s-t)^T로 표현되므로 해 공간은 2차원입니다. 이 공간에서 세 번째 독립인 해를 추가할 수는 없습니다.

I.1의 9번 — 열공간이 R³ 전체라면

m×nm\times n 행렬의 열공간이 R3\mathbb{R}^3 그 자체라면 출력 벡터의 성분 수 때문에 m=3m=3입니다. 그 공간의 차원은 3이므로 r=3r=3이고, 세 개 이상의 열이 필요하므로 n≥3n\geq3입니다. n=3n=3일 필요는 없습니다.

I.1의 18번 — 블록 행렬의 CR 분해

A=CRA=CR일 때 다음 블록 행렬을 생각합니다.

B=[0A0A]=[CC]⏟CB[0R]⏟RB.B=\begin{bmatrix}0&A\\0&A\end{bmatrix} =\underbrace{\begin{bmatrix}C\\C\end{bmatrix}}_{C_B} \underbrace{\begin{bmatrix}0&R\end{bmatrix}}_{R_B}.

AA가 m×nm\times n이고 랭크가 rr이면, BB는 2m×2n2m\times2n, CBC_B는 2m×r2m\times r, RBR_B는 r×2nr\times2n입니다. 여기서 왼쪽 영블록은 원래 문제처럼 AA와 같은 크기로 둡니다. 열을 위아래로 반복해도 독립인 열의 수는 늘지 않으므로 rank⁡(B)=r\operatorname{rank}(B)=r입니다.

11. 계산으로 확인하기

다음 코드는 이 글에서 직접 구성한 주 예제와 분해를 확인합니다. matrix_rank는 부동소수점 허용오차를 사용하는 수치적 랭크이므로, 일반 데이터에서는 이론적인 랭크와의 차이를 주의해야 합니다.

import numpy as np

A = np.array([[1., 0., 2.],
[0., 1., 1.],
[1., 1., 3.]])
C = A[:, :2]
R = np.array([[1., 0., 2.], [0., 1., 1.]])

assert np.allclose(A, C @ R)
assert np.linalg.matrix_rank(A) == 2
assert np.allclose(A @ np.array([-2., -1., 1.]), 0)
assert np.allclose(A @ np.array([2., -1., 1.]), [4., 0., 4.])

b = np.array([4., 3., 7.])
for t in [-2., 0., 3.]:
x = np.array([4. - 2. * t, 3. - t, t])
assert np.allclose(A @ x, b)

selected_rows = A[[0, 2], :]
M = np.array([[1., 0.], [-1., 1.]])
assert np.allclose(A, C @ M @ selected_rows)

print("rank(A) =", np.linalg.matrix_rank(A))
print("CR, CMR, and solution checks passed.")

12. 복습 질문

  1. A∈Rm×nA\in\mathbb{R}^{m\times n}의 열공간과 행공간은 각각 어느 공간의 부분공간인가?
  2. Ax=bAx=b의 해가 존재하는 조건과, 존재하는 해가 유일한 조건을 구별할 수 있는가?
  3. 새로운 열을 하나 추가했을 때 랭크가 그대로인 경우와 1 증가하는 경우는 언제인가?
  4. A=CRA=CR에서 CC와 RR의 크기, 각 열의 의미를 설명할 수 있는가?
  5. 행 랭크와 열 랭크가 같다는 사실을 A=CRA=CR로 증명할 수 있는가?
  6. A=CRA=CR의 RR과 실제 행들을 뽑은 R~\widetilde R은 어떻게 다른가?

다음 Lecture 2에서는 교재 I.2, pp. 9–13을 중심으로 행렬곱을 열·행·외적의 관점에서 정리하고 행렬 분해로 연결합니다. Lecture 2 원강의를 먼저 볼 수 있습니다.

참고 자료

시리즈 전체 목차로 돌아가기