연립방정식, 역행렬, 행렬식

연립방정식을 행렬 방정식 Ax = b로 쓰고, 가우스 소거법으로 푸는 원리, 해가 하나, 없음, 무수히 많음으로 갈리는 이유, 계수와 역행렬과 행렬식의 관계를 익혀요. 해가 없는 방정식을 가장 그럴듯하게 푸는 최소 제곱법이 곧 선형 회귀라는 것까지 연결해요.

중급강의 4 / 6약 8분

"사과 2개와 배 3개가 8천 원, 사과 1개와 배 1개가 3천 원이면 각각 얼마일까?" 중학교 때 풀던 연립방정식이에요. 이 평범한 문제가 행렬로 바뀌면, 데이터에 가장 잘 맞는 직선을 찾는 머신러닝의 선형 회귀와 같은 문제가 돼요. 이번 강의에서는 지난 강의의 "공간을 움직이는 행렬" 그림을 가지고 연립방정식, 역행렬, 행렬식을 한 줄로 꿰어요.

연립방정식을 행렬로 쓰기

{2x+3y=8x+y=3⟺[2311][xy]=[83]\begin{cases} 2x + 3y = 8 \\ x + y = 3 \end{cases} \quad \Longleftrightarrow \quad \begin{bmatrix} 2 & 3 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} 8 \\ 3 \end{bmatrix}

간단히 Ax=bA\mathbf{x} = \mathbf{b}로 써요. 변수가 1000개, 식이 1000개여도 모양은 똑같아요.

변환으로 읽기

지난 강의의 관점으로 보면 질문이 이렇게 바뀌어요. "변환 A가 어떤 벡터 x를 b로 보냈는가?" 즉 도착점 b를 보고 출발점 x를 거꾸로 찾는 문제예요. 변환을 되돌릴 수 있으면 답이 하나로 정해지고, 되돌릴 수 없으면(공간이 찌그러지면) 답이 없거나 너무 많아요.

가우스 소거법

손으로 풀 때 하던 "한 식에 몇 배 해서 다른 식에서 빼기"를 체계화한 것이 가우스 소거법이에요. 계수와 우변을 한 행렬에 나란히 적고(첨가 행렬), 세 가지 조작만 해요.

  1. 두 행을 맞바꾸기
  2. 한 행에 0이 아닌 수를 곱하기
  3. 한 행에 다른 행의 몇 배를 더하기

이 조작들은 해를 바꾸지 않아요. 목표는 계단 모양(위 삼각 모양)을 만드는 거예요.

[238113]→R2−12R1[2380−12−1]\left[\begin{array}{cc|c} 2 & 3 & 8 \\ 1 & 1 & 3 \end{array}\right] \xrightarrow{R_2 - \frac{1}{2}R_1} \left[\begin{array}{cc|c} 2 & 3 & 8 \\ 0 & -\frac{1}{2} & -1 \end{array}\right]

둘째 줄에서 −12y=−1-\frac{1}{2}y = -1이니 y=2y = 2, 첫 줄에 넣으면 2x+6=82x + 6 = 8이라 x=1x = 1이에요. 사과 천 원, 배 2천 원이에요. 아래에서부터 거꾸로 대입하는 이 과정을 후진 대입이라고 해요.

변수가 nn개면 소거법의 계산량은 대략 n3n^3에 비례해요. 1000개면 약 10억 번이라 컴퓨터에게는 순식간이지만, 100만 개면 사람이 기다릴 수 없는 수준이 돼요. 그래서 거대한 문제에는 근사적으로 반복해서 푸는 방법을 써요(경사 하강법도 그중 하나예요).

해가 갈리는 세 가지 경우

변수 2개짜리 식 하나는 평면 위의 직선이에요. 연립방정식의 해는 두 직선이 만나는 점이에요.

경우그림행렬 관점
해가 하나두 직선이 한 점에서 만남변환이 공간을 찌그러뜨리지 않음
해가 없음두 직선이 평행b가 찌그러진 공간 밖에 있음
해가 무수히 많음두 직선이 겹침b가 찌그러진 공간 안에 있고 여러 점이 b로 모임
{x+y=22x+2y=5\begin{cases} x + y = 2 \\ 2x + 2y = 5 \end{cases}

이 식은 해가 없어요. 둘째 식을 2로 나누면 x+y=2.5x + y = 2.5인데, 첫 식은 x+y=2x + y = 2라고 하니 모순이죠. 행렬 [1122]\begin{bmatrix} 1 & 1 \\ 2 & 2 \end{bmatrix}의 두 열 (1,2)(1, 2)와 (1,2)(1, 2)가 같은 방향이라서, 이 변환은 평면 전체를 한 직선 위로 찌그러뜨려요. 그 직선 위에 없는 b\mathbf{b}로는 갈 수가 없어요.

계수: 변환 후 남는 차원

변환 후 공간이 몇 차원으로 남는지를 계수(rank)라고 해요.

  • 2×22 \times 2 행렬의 계수가 2: 평면이 평면으로. 찌그러지지 않음.
  • 계수가 1: 평면이 직선으로 찌그러짐.
  • 계수가 0: 모든 점이 원점으로.

계수는 "열 벡터들 중 진짜로 새로운 방향을 가진 것이 몇 개인가"와 같아요. 열 두 개가 같은 방향이면 하나는 다른 하나의 배수일 뿐이라 정보를 더 주지 못해요. 이런 상태를 선형 종속이라고 해요.

데이터에서의 계수

데이터 행렬에서 어떤 특징이 다른 특징들로 계산된다면(예: "총점" 열이 "국어 + 수학" 열과 같다면) 그 열은 선형 종속이에요. 새 정보가 없는 데다, 회귀 분석에서 계산을 불안정하게 만들어요(다중 공선성). 머신러닝 트랙에서 특징을 고를 때 다시 만나요.

역행렬: 변환 되돌리기

변환 AA를 정확히 되돌리는 변환이 역행렬 A−1A^{-1}이에요.

A−1A=AA−1=IA^{-1}A = AA^{-1} = I

역행렬이 있으면 방정식이 단번에 풀려요.

Ax=b⟹x=A−1bA\mathbf{x} = \mathbf{b} \quad \Longrightarrow \quad \mathbf{x} = A^{-1}\mathbf{b}

2×22 \times 2 행렬의 역행렬은 공식이 있어요.

[abcd]−1=1ad−bc[d−b−ca]\begin{bmatrix} a & b \\ c & d \end{bmatrix}^{-1} = \frac{1}{ad - bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix}

분모의 ad−bcad - bc가 보이나요? 지난 강의의 행렬식이에요. 행렬식이 0이면 0으로 나눠야 하니 역행렬이 없어요.

모든 것이 하나로 이어진다

정사각 행렬 AA에 대해 아래는 모두 같은 말이에요.

  1. AA의 역행렬이 있다.
  2. det⁡A≠0\det A \neq 0이다.
  3. Ax=bA\mathbf{x} = \mathbf{b}의 해가 모든 b\mathbf{b}에 대해 정확히 하나다.
  4. AA의 계수가 꽉 찼다(n×n이면 n).
  5. AA의 열들이 선형 독립이다.
  6. 변환 AA가 공간을 찌그러뜨리지 않는다.

선형대수 교과서에서 "가역 행렬 정리"라고 부르는 내용인데, 지금까지의 그림으로 보면 당연한 이야기예요. 공간을 찌그러뜨리지 않으면 되돌릴 수 있고, 되돌릴 수 있으면 답이 하나로 정해져요.

행렬식 더 알아보기

2×22 \times 2에서 행렬식은 넓이의 배율이었어요. 3×33 \times 3에서는 부피의 배율이에요. 단위 정육면체가 변환 후 몇 배의 부피가 되는지예요. 성질 몇 가지를 알아 두세요.

det⁡(AB)=det⁡(A)det⁡(B),det⁡(A−1)=1det⁡(A),det⁡(AT)=det⁡(A)\det(AB) = \det(A)\det(B), \qquad \det(A^{-1}) = \frac{1}{\det(A)}, \qquad \det(A^T) = \det(A)

첫 성질은 그림으로 보면 당연해요. 넓이를 2배 늘리고 다시 3배 늘리면 6배가 되죠.

넘파이로 풀기

import numpy as np

A = np.array([[2, 3], [1, 1]])
b = np.array([8, 3])

print(np.linalg.solve(A, b))   # [1. 2.]
print(np.linalg.det(A))        # -1.0 (0이 아니니 해가 하나)
print(np.linalg.inv(A))        # 역행렬
print(np.linalg.matrix_rank(np.array([[1, 1], [2, 2]])))   # 1

실무 팁 방정식을 풀 때 inv(A) @ b보다 solve(A, b)를 쓰세요. 역행렬을 통째로 구하는 건 계산도 많고 오차도 커요. 수치 계산의 세계에서는 "역행렬은 거의 구하지 않는다"가 상식이에요.

거의 찌그러진 행렬

행렬식이 0은 아니지만 0에 아주 가까우면 문제가 생겨요.

A = np.array([[1, 1], [1, 1.0001]])
print(np.linalg.solve(A, [2, 2.0001]))   # [1. 1.]
print(np.linalg.solve(A, [2, 2.0002]))   # [0. 2.]  b가 조금 변했는데 답이 크게 변함

입력이 아주 조금 바뀌었는데 답이 확 달라져요. 이런 행렬을 "조건이 나쁘다"(ill-conditioned)고 해요. 측정값에는 늘 작은 오차가 있으니, 이런 문제의 답은 믿기 어려워요. np.linalg.cond(A)로 조건수를 재 볼 수 있어요. 값이 클수록 위험해요.

해가 없을 때: 최소 제곱법

현실의 데이터는 오차가 있어서, 식이 변수보다 훨씬 많고 모든 식을 정확히 만족하는 해는 없어요. 예를 들어 집 100채의 데이터로 "가격 = a×a \times 면적 + bb"를 맞추려 하면, 식은 100개인데 변수는 aa, bb 두 개뿐이고, 모든 점을 지나는 직선은 없어요.

그럴 땐 오차의 제곱합이 가장 작은 해를 찾아요.

min⁡x∥Ax−b∥2\min_{\mathbf{x}} \|A\mathbf{x} - \mathbf{b}\|^2

그림으로 보면, b\mathbf{b}가 AA의 열들이 만드는 공간 밖에 있을 때 그 공간 위의 가장 가까운 점으로 투영하는 거예요. 그 해는 이 방정식(정규 방정식)을 풀면 나와요.

ATA x=ATbA^T A\,\mathbf{x} = A^T \mathbf{b}
area = np.array([59, 84, 112, 76, 95])
price = np.array([5.1, 7.0, 9.4, 6.3, 8.1])          # 억 원 (예시 값)
A = np.column_stack([area, np.ones_like(area)])      # [면적, 1] 열로 만든 행렬
(a, b), *_ = np.linalg.lstsq(A, price, rcond=None)
print(f"가격 ≈ {a:.4f} × 면적 + {b:.3f}")

이게 바로 선형 회귀예요. 통계 트랙과 머신러닝 트랙에서 다시 만나는데, 그때 이 강의의 "투영" 그림을 떠올리면 공식이 외울 대상이 아니라 당연한 결과로 보일 거예요.

실습

  1. 아래 연립방정식을 가우스 소거법으로 손으로 풀고, np.linalg.solve로 확인하세요.
{x+2y+z=92x−y+3z=123x+y−z=1\begin{cases} x + 2y + z = 9 \\ 2x - y + 3z = 12 \\ 3x + y - z = 1 \end{cases}

(답: x=1x = 1, y=2y = 2, z=4z = 4)

  1. 행렬식이 0이 되도록 [2k46]\begin{bmatrix} 2 & k \\ 4 & 6 \end{bmatrix}의 kk를 정하세요.
  2. 최소 제곱 예제에 집 데이터를 몇 개 더 넣고, 직선이 어떻게 바뀌는지 보세요.

자주 하는 실수

  • 역행렬로 방정식 풀기. solve나 lstsq를 쓰세요.
  • 행렬식이 0이 아니면 안전하다고 믿기. 0에 가까우면 답을 믿기 어려워요. 조건수를 확인하세요.
  • 해가 없으면 포기하기. 데이터 문제에서는 최소 제곱 해가 답이에요.
  • 정사각이 아닌 행렬의 역행렬 구하기. 역행렬은 정사각 행렬에만 정의돼요.

점검 문제

  1. [3162]\begin{bmatrix} 3 & 1 \\ 6 & 2 \end{bmatrix}의 행렬식과 계수는?
  2. [2111]\begin{bmatrix} 2 & 1 \\ 1 & 1 \end{bmatrix}의 역행렬은?
  3. 행렬식이 0인 행렬에 대해 Ax=bA\mathbf{x} = \mathbf{b}의 해는 어떤 경우들이 있나요?
  4. 최소 제곱법은 그림으로 보면 무엇을 하는 건가요?

정답

  1. 6−6=06 - 6 = 0이고, 둘째 열이 첫째 열의 1/3배라 계수는 1이에요.
  2. 행렬식이 2−1=12 - 1 = 1이니 [1−1−12]\begin{bmatrix} 1 & -1 \\ -1 & 2 \end{bmatrix}예요.
  3. b가 찌그러진 공간 위에 있으면 해가 무수히 많고, 밖에 있으면 해가 없어요. 하나로 정해지는 경우는 없어요.
  4. b를 A의 열들이 만드는 공간 위의 가장 가까운 점으로 투영해서, 그 점에 도달하는 x를 찾는 거예요.

다음 강의

다음 강의에서는 고유값과 고유벡터를 배워요. 변환을 해도 방향이 바뀌지 않는 특별한 화살표들이 있는데, 이게 변환의 뼈대예요. 구글 검색 순위, 데이터의 주성분, 시스템의 안정성이 모두 이 화살표로 설명돼요.