Rank와 행렬의 부분공간

행렬 하나에는 네 가지 부분공간이 숨어 있어요. Column Space, Row Space, Null Space, 그리고 Left Null Space. 이 글에서는 이 네 공간이 각각 무엇이고, Rank와 어떤 관계를 갖는지 정리해요.

Rank

행렬 $A$의 rank는 선형 독립인 열(또는 행)의 최대 개수예요.

$$ A = \begin{bmatrix} 1 & 2 \\ 2 & 4 \end{bmatrix} $$

두 번째 열은 첫 번째 열의 2배예요. 선형 독립인 열이 1개뿐이므로 $\text{rank}(A) = 1$이에요.

rank는 열 기준으로 세든 행 기준으로 세든 같아요. 이를 아래처럼 표현해요.

$$ \text{rank}(A) = \dim(\text{Col}(A)) = \dim(\text{Row}(A)) $$

rank가 중요한 이유는, 행렬이 실질적으로 다루는 차원의 수를 알려주기 때문이에요. $m \times n$ 행렬이라도 rank가 $r$이면, 이 행렬이 만들어내는 공간은 $r$차원이에요.

Column Space

Column Space $\text{Col}(A)$는 행렬 $A$의 열벡터들의 모든 선형 결합으로 이루어진 공간이에요.

$A$가 $m \times n$ 행렬일 때, 열벡터는 $\mathbb{R}^m$에 속해요. 따라서 Column Space는 $\mathbb{R}^m$의 부분공간이에요.

$$ A\mathbf{x} = \mathbf{b} $$

이 방정식이 해를 가지려면, $\mathbf{b}$가 Column Space 안에 있어야 해요. $A\mathbf{x}$는 결국 $A$의 열벡터들의 선형 결합이니까요.

예를 들어 볼게요.

$$ A = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 0 & 0 \end{bmatrix} $$

$A$의 Column Space는 $\mathbb{R}^3$에서 $xy$-평면이에요. $\mathbf{b} = [1, 2, 3]^T$이면 이 평면 위에 없으므로 $A\mathbf{x} = \mathbf{b}$는 해가 없어요.

Row Space

Column Space가 "행렬이 만들어낼 수 있는 출력의 범위"라면, Row Space는 "행렬이 실제로 구분할 수 있는 입력의 범위"예요.

$$ A = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix} $$

이 행렬은 3차원 입력을 받아 2차원 출력을 만들어요. 3차원 입력 중에서 행렬이 실제로 "감지"하는 방향이 Row Space예요. 나머지 방향의 차이는 행렬을 통과하면 사라져요.

수식으로 쓰면 $\text{Row}(A) = \text{Col}(A^T)$, 즉 $A^T$의 Column Space예요. 행벡터는 $\mathbb{R}^n$에 속하므로, Row Space는 $\mathbb{R}^n$의 부분공간이에요.

Column Space와 Row Space의 차원은 같지만, 서로 다른 공간에 존재한다는 점이 핵심이에요. Column Space는 $\mathbb{R}^m$(출력 쪽)에, Row Space는 $\mathbb{R}^n$(입력 쪽)에 속해요.

가우스 소거법(row reduction)을 수행하면 Row Space는 보존되지만 Column Space는 변할 수 있어요.

Null Space

Row Space가 "행렬이 구분하는 방향"이라면, Null Space는 그 반대예요. 행렬이 구분하지 못하는 방향, 즉 행렬을 통과하면 0이 되어 사라지는 입력의 집합이에요.

위의 Row Space 예시를 다시 볼게요.

$$ A = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix} $$

$\mathbf{x} = [1, 1, -1]^T$를 넣으면 $A\mathbf{x} = \mathbf{0}$이에요. 이 방향으로는 아무리 움직여도 출력이 바뀌지 않아요. 이 방향이 Null Space예요.

수식으로 쓰면 이래요.

$$ \text{Null}(A) = { \mathbf{x} \in \mathbb{R}^n \mid A\mathbf{x} = \mathbf{0} } $$

$\mathbf{x}$는 $\mathbb{R}^n$에 속하므로, Null Space는 $\mathbb{R}^n$의 부분공간이에요.

Null Space의 차원을 nullity라고 해요. Rank-Nullity Theorem에 의해 다음이 성립해요.

$$ \text{rank}(A) + \text{nullity}(A) = n $$

$n$은 열의 수예요. 입력 공간 $\mathbb{R}^n$이 "행렬이 감지하는 방향(Row Space)"과 "행렬이 무시하는 방향(Null Space)"으로 나뉘는 거예요. 둘을 합치면 정확히 $n$이에요.

예를 들어, 위 행렬은 $2 \times 3$이고 rank가 2예요. nullity는 $3 - 2 = 1$이에요. 실제로 Null Space의 기저가 $[1, 1, -1]^T$ 하나뿐인 것과 맞아요.

Null Space가 알려주는 것

앞에서 쓴 행렬을 다시 가져올게요.

$A = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix}, \quad \text{Null Space의 기저: } [1, 1, -1]^T$

$A\mathbf{x} = [3, 5]^T$의 해를 하나 찾으면, 예를 들어 $\mathbf{x}_p = [3, 5, 0]^T$이에요.

그런데 Null Space 방향으로 움직여도 출력은 바뀌지 않아요. 그래서 $[3, 5, 0]^T + t[1, 1, -1]^T$도 전부 해가 돼요. $t = 1$이면 $[4, 6, -1]^T$, $t = -1$이면 $[2, 4, 1]^T$. 전부 $A$에 넣으면 $[3, 5]^T$이 나와요.

$A(\mathbf{x}_p + \mathbf{x}_n) = A\mathbf{x}_p + A\mathbf{x}_n = \mathbf{b} + \mathbf{0} = \mathbf{b}$

이것이 일반해의 구조예요. 특수해 $\mathbf{x}_p$ 하나를 찾고, 거기에 Null Space의 원소를 더하면 모든 해를 얻어요. 반대로 Null Space가 $\{\mathbf{0}\}$이면 (영벡터뿐이면), 더할 수 있는 게 없으니 해가 존재할 경우 그 해는 유일해요.

네 공간의 관계

$m \times n$ 행렬 $A$의 rank가 $r$일 때, 네 부분공간을 정리하면 이래요.

부분공간 정의 속하는 공간 차원

Column Space $A$의 열의 선형 결합 $\mathbb{R}^m$ $r$
Row Space $A$의 행의 선형 결합 $\mathbb{R}^n$ $r$
Null Space $A\mathbf{x} = \mathbf{0}$의 해 $\mathbb{R}^n$ $n - r$
Left Null Space $A^T\mathbf{y} = \mathbf{0}$의 해 $\mathbb{R}^m$ $m - r$

여기서 직교 관계가 성립해요.

  • Row Space $\perp$ Null Space (둘 다 $\mathbb{R}^n$, 차원의 합 $= n$)
  • Column Space $\perp$ Left Null Space (둘 다 $\mathbb{R}^m$, 차원의 합 $= m$)

같은 공간 안에서 서로 직교하는 두 부분공간이 전체를 빈틈없이 채우는 거예요. $\mathbb{R}^n$의 모든 벡터는 Row Space 성분과 Null Space 성분으로 분해할 수 있어요.