AI공부 · 선형대수
행렬식
6장. 행렬식
이 장을 마치면 행렬식을 “변환이 넓이(부피)를 몇 배로 바꾸는가”로 읽고, 0과 음수가 무엇을 뜻하는지 그림으로 설명하며, 2×2 행렬식을 계산할 수 있습니다. 계산보다 뜻이 훨씬 중요합니다.
6.1 변환이 넓이를 몇 배로 바꾸는가
지금까지 본 선형 변환들을 떠올려보면, 어떤 것은 공간을 늘리고 어떤 것은 줄입니다. 변환을 이해하는 데 아주 쓸모 있는 질문이 있습니다. 어떤 영역의 넓이가 정확히 몇 배가 되는가?
예 1 — 가로 3배, 세로 2배. 열이 [3, 0], [0, 2]인 행렬은 î를 3배, ĵ를 2배로 늘립니다. î와 ĵ를 두 변으로 하는 1×1 정사각형(단위 정사각형)은 변환 후 3×2 직사각형이 됩니다. 넓이가 1에서 6이 됐으니 “이 변환은 넓이를 6배로 만든다”고 말합니다.
예 2 — 전단. 열이 [1, 0], [1, 1]인 행렬은 î를 그대로 두고 ĵ를 [1, 1]로 밀어냅니다. 단위 정사각형은 비스듬한 평행사변형이 되지만, 밑변도 1이고 높이도 1이라 넓이는 여전히 1입니다. 모양은 찌그러뜨렸는데 넓이는 그대로입니다.
현장 비유. 같은 바닥 타일을 비스듬히 밀어서 마름모꼴로 만들어도, 밑변과 높이가 같으면 시공 면적(㎡)은 똑같습니다. 행렬식은 모양이 아니라 면적만 봅니다.
6.2 단위 정사각형 하나면 충분한 이유
놀랍게도 단위 정사각형 하나의 넓이가 몇 배가 되는지만 알면, 공간의 어떤 영역이든 넓이 변화를 알 수 있습니다. 두 단계로 생각합니다.
- 격자의 모든 칸은 똑같이 변합니다. 선형 변환은 격자선을 평행하고 간격이 균일하게 유지합니다. 그래서 한 칸에 일어난 일은 크기가 얼마든 다른 모든 칸에도 똑같이 일어납니다. 모든 칸이 같은 모양의 평행사변형이 되고 넓이도 같은 배수로 변합니다.
- 어떤 모양이든 작은 격자 칸으로 채울 수 있습니다. 원이나 구불한 도형도 아주 작은 칸으로 촘촘히 채우면 거의 정확하게 덮습니다. 칸을 작게 할수록 오차는 얼마든지 작아집니다.
모든 작은 칸의 넓이가 같은 하나의 배수로 변하니, 그 칸들로 채운 도형 전체의 넓이도 같은 배수로 변합니다.
현장 비유. 평면도를 모눈종이에 그리고 칸 수를 세어 면적을 구하는 방법과 같습니다. 모눈종이 전체를 1.5배 확대 복사하면 칸 하나의 면적이 2.25배가 되고, 도면 위 어떤 방의 면적도 2.25배가 됩니다.
6.3 행렬식의 정의와 0의 의미
선형 변환이 모든 넓이를 바꾸는 그 하나의 배수를 그 변환의 행렬식(determinant)이라고 합니다. 기호로는 det(A)라고 씁니다.
| 행렬식 | 뜻 |
|---|---|
| 3 | 모든 넓이가 3배가 된다 |
| 1 | 넓이가 그대로다 (회전, 전단) |
| 1/2 | 모든 넓이가 절반으로 줄어든다 |
| 0 | 공간 전체가 직선이나 점으로 눌려 모든 넓이가 0이 된다 |
계산법은 6.6에서 다룹니다. 그보다 “행렬식이 무엇을 나타내는가”를 이해하는 것이 훨씬 중요합니다.
행렬식 0은 특별합니다. 행렬식이 0인지 확인하면 그 변환이 공간을 더 낮은 차원으로 눌러버리는지 알 수 있습니다. 3장 예 4에서 î와 ĵ의 도착점이 선형 종속이면 평면이 직선으로 눌린다고 했습니다. 그 상황을 숫자 하나(0)로 판별하는 방법이 행렬식입니다. 이것이 왜 쓸모 있는지는 다음 장(연립방정식, 역행렬)에서 분명해집니다.
6.4 음수 행렬식과 방향 뒤집기
지금까지의 설명은 사실 조금 부족합니다. 행렬식은 음수가 될 수도 있습니다. 넓이를 “음수 배”한다는 건 무슨 뜻일까요? 답은 방향(orientation)입니다.
종이를 뒤집는 변환. 2차원 공간을 종이 한 장이라고 생각합시다. 어떤 변환은 종이를 뒤집어 뒷면이 보이게 만듭니다. 이런 변환을 공간의 방향을 뒤집는다고 합니다.
î와 ĵ로 판별하기. 처음에는 ĵ가 î의 왼쪽(반시계 방향)에 있습니다. 변환 후 ĵ가 î의 오른쪽에 있으면 방향이 뒤집힌 것입니다. 이때 행렬식은 음수입니다.
행렬식의 부호 = 방향이 유지되는가(+) 뒤집히는가(−). 행렬식의 절댓값 = 넓이가 몇 배가 되는가.
예제. 열이 [1, 1], [2, −1]인 행렬의 행렬식은 −3입니다. î는 오른쪽 위 [1, 1]로, ĵ는 오른쪽 아래 [2, −1]로 가서 ĵ가 î의 오른쪽(시계 방향)에 놓입니다. 공간이 뒤집히고, 넓이는 3배가 됩니다.
왜 음수가 자연스러운가. î를 ĵ 쪽으로 조금씩 돌려가는 변환들을 연속으로 상상해봅시다.
- î가 ĵ에 가까워질수록 두 변이 만드는 평행사변형이 납작해져 행렬식이 0에 가까워집니다.
- î가 ĵ와 정확히 겹치면 행렬식은 0입니다.
- î가 같은 방향으로 계속 가서 ĵ를 넘어가면, 행렬식이 계속 줄어들어 음수가 되는 것이 자연스럽습니다.
온도계가 0도를 지나 영하로 내려가는 것처럼, 행렬식도 0을 지나 끊김 없이 음수로 이어집니다.
6.5 3차원: 부피, 평행육면체, 오른손 법칙
3차원에서 행렬식은 부피가 몇 배가 되는가를 알려줍니다.
단위 정육면체에 집중하기. 2차원에서 단위 정사각형 하나만 봤듯이, 3차원에서는 î, ĵ, k̂를 세 모서리로 하는 1×1×1 정육면체 하나만 봅니다. 변환 후 이 정육면체는 비스듬히 기울어진 상자가 됩니다. 이 모양을 평행육면체(parallelepiped)라고 합니다. 마주 보는 면끼리 평행한 상자입니다. 정육면체의 처음 부피가 1이므로, 행렬식 = 그 평행육면체의 부피라고 생각하면 됩니다.
3차원 행렬식이 0이면. 공간 전체가 부피가 0인 것, 즉 평면·직선·점 중 하나로 눌립니다. 2장을 본 사람은 이것이 행렬의 열들이 선형 종속이라는 뜻임을 알 수 있습니다. 열은 î, ĵ, k̂의 도착점이고, 열들의 스팬이 공간 전체가 아니라 평면이나 직선이면 상자가 납작해져 부피가 0이 됩니다. 5장 연습문제 6번이 바로 이 경우입니다.
3차원의 방향: 오른손 법칙.
- 오른손 검지를 î 방향으로 폅니다.
- 가운뎃손가락을 ĵ 방향으로 굽힙니다.
- 엄지를 세우면 k̂ 방향을 가리킵니다.
변환 후에도 오른손으로 이 자세가 되면 방향이 유지된 것이고 행렬식은 양수입니다. 왼손으로만 이 자세가 나오면 방향이 뒤집힌 것이고 행렬식은 음수입니다. 거울에 비친 물체(오른손 장갑이 왼손 장갑이 되는 것)를 떠올리면 됩니다.
| 차원 | 행렬식의 크기(절댓값) | 행렬식의 부호 |
|---|---|---|
| 2차원 | 넓이가 몇 배인가 | ĵ가 î의 왼쪽에 남는가 |
| 3차원 | 부피가 몇 배인가 | 오른손 법칙이 유지되는가 |
6.6 계산법: ad − bc가 나오는 이유
2×2 행렬의 행렬식 공식은 이렇습니다.
열을 떠올립시다. î는 [a, c]로, ĵ는 [b, d]로 갑니다. 이 두 벡터가 만드는 평행사변형의 넓이가 왜 ad − bc인지 단계별로 봅니다.
- b = c = 0일 때. î는 x축 방향으로 a배, ĵ는 y축 방향으로 d배만 늘어납니다. 단위 정사각형이 a × d 직사각형이 되니 넓이는 ad입니다. (6.1의 [3, 0], [0, 2] 예와 같습니다.)
- b나 c 중 하나만 0일 때. 예를 들어 c = 0이면 î는 x축 위 [a, 0]에 있고 ĵ는 [b, d]로 비스듬히 눕습니다. 밑변 a, 높이 d인 평행사변형이라 넓이는 여전히 ad입니다. (전단 예와 같습니다.)
- 둘 다 0이 아닐 때. 대략 말하면 bc는 평행사변형이 대각선 방향으로 얼마나 눌렸는지를 나타냅니다.
3번을 정확하게 보기 (모든 수가 양수일 때). 평행사변형을 감싸는 큰 직사각형을 그립니다. 가로는 a + b, 세로는 c + d입니다. 평행사변형 바깥의 남는 조각을 빼면 됩니다.
| 조각 | 개수 | 넓이 합 |
|---|---|---|
| 큰 직사각형 | 1 | (a + b)(c + d) = ac + ad + bc + bd |
| 밑변 a·높이 c 직각삼각형 | 2 | ac |
| 밑변 b·높이 d 직각삼각형 | 2 | bd |
| 가로 b·세로 c 직사각형 | 2 | 2bc |
종이에 a = 3, b = 1, c = 1, d = 2로 직접 그려보면 조각이 눈에 보입니다. 넓이 = 3·2 − 1·1 = 5.
| 행렬 (행 단위) | ad − bc | 해석 |
|---|---|---|
| [[3, 0], [0, 2]] | 6 − 0 = 6 | 넓이 6배 |
| [[1, 1], [0, 1]] (전단) | 1 − 0 = 1 | 넓이 그대로 |
| [[0, −1], [1, 0]] (90° 회전) | 0 + 1 = 1 | 넓이 그대로 |
| [[1, 2], [1, −1]] | −1 − 2 = −3 | 뒤집히고 3배 |
| [[2, −2], [1, −1]] | −2 + 2 = 0 | 직선으로 눌림 |
3×3 행렬식. 공식은 있지만 깁니다. 필요하면 몇 번 손으로 연습해두면 됩니다.
예: 대각 행렬 [[2, 0, 0], [0, 3, 0], [0, 0, 4]]는 2·(12 − 0) = 24. 부피가 2 × 3 × 4 = 24배가 된다는 뜻입니다. 5장의 Ry는 c(dh − eg) = 1·(0 − 1·(−1)) = 1로, 회전은 부피를 바꾸지 않습니다.
솔직히 말해 이런 손계산은 선형대수의 핵심이 아닙니다. 실제로는 컴퓨터가 계산합니다. 하지만 행렬식이 무엇을 나타내는가는 분명히 핵심입니다.
6.7 det(AB) = det(A) · det(B)를 한 문장으로
영상은 퍼즐을 남깁니다. 두 행렬을 곱한 행렬의 행렬식은 각 행렬식의 곱과 같습니다. 숫자로 증명하면 오래 걸리지만, 한 문장으로 설명할 수 있습니다. 직접 생각해본 뒤 아래를 읽으세요.
B를 먼저 하면 넓이가 det(B)배가 되고, 이어서 A를 하면 그 넓이가 다시 det(A)배가 되므로, 합쳐서 det(A) · det(B)배가 된다.
확인: 4장의 M₁ = [[1, −2], [1, 0]](det = 2), M₂ = [[0, 2], [1, 0]](det = −2), M₂M₁ = [[2, 0], [1, −2]](det = −4). 2 × (−2) = −4로 맞습니다.
- det(AB) = det(BA). 4장에서 AB와 BA는 대개 다르다고 했습니다. 하지만 넓이 배수는 숫자끼리의 곱이라 순서와 상관없이 같습니다. 변환은 다르지만 넓이를 바꾸는 정도는 같습니다.
- 한 번 눌리면 되돌릴 수 없습니다. det(A) = 0이면 어떤 B와 곱해도 det(AB) = 0입니다. 납작하게 눌린 공간은 어떤 선형 변환을 더해도 다시 부풀어 오르지 않습니다. 다음 장의 역행렬이 바로 이 이야기입니다.
6.8 AI와의 연결
- 행렬식 0 = 정보 손실. 공간이 눌리면 서로 다른 입력이 같은 출력으로 합쳐져 원래 값을 되살릴 수 없습니다. 설비 센서 데이터에서 한 센서가 다른 센서의 합으로 계산되면(다중공선성), 선형회귀에서 푸는 행렬 XᵀX의 행렬식이 0에 가까워져 계수가 마구 흔들립니다. 회귀 모델이 불안정해지는 대표적인 원인입니다.
- 데이터가 퍼진 “부피”. 데이터의 공분산 행렬의 행렬식은 데이터 구름이 차지하는 부피에 해당합니다. 정규분포 기반 이상 탐지나 가우시안 모델의 수식에 log det가 등장하는 이유입니다.
- 생성모델과 밀도. 넓이가 k배로 늘면 같은 양의 확률이 넓게 퍼져 밀도는 1/k가 됩니다. Normalizing Flow 같은 생성모델은 이 관계를 행렬식으로 계산합니다(연세대 “이미지생성모델” 과목).
- 3D 비전의 거울상 검사. 두 포인트 클라우드를 맞추는 알고리즘은 구한 회전 행렬의 행렬식이 +1인지 확인합니다. −1이면 회전이 아니라 거울 반사(방향 뒤집기)가 섞인 것이라 바로잡습니다.
- 실무 팁. 차원이 큰 행렬은 행렬식 값이 엄청나게 커지거나 0에 가까워져 컴퓨터 숫자 범위를 벗어납니다. 그래서 실제로는 log det(
np.linalg.slogdet)를 쓰고, “눌렸는가”를 판단할 때는 행렬식보다 랭크나 조건수를 봅니다(뒤의 장에서 다룸).
6.9 코드 실습
실습 1 — 본문 예제의 행렬식 확인
import numpy as np
examples = {
'가로 3·세로 2': [[3, 0], [0, 2]],
'전단': [[1, 1], [0, 1]],
'뒤집기+3배': [[1, 2], [1, -1]],
'직선으로 눌림': [[2, -2], [1, -1]],
}
for name, M in examples.items():
print(name, round(np.linalg.det(np.array(M)), 3)) # 6.0, 1.0, -3.0, 0.0
실습 2 — 어떤 모양이든 넓이가 |det|배가 되는지 확인
오각형 하나를 변환하고 넓이 비율을 잽니다. 넓이는 신발끈 공식(꼭짓점 좌표로 다각형 넓이를 구하는 공식)으로 구합니다.
def area(P): # P: 꼭짓점 n개의 (x, y) 좌표
x, y = P[:, 0], P[:, 1]
return 0.5 * abs(np.dot(x, np.roll(y, -1)) - np.dot(y, np.roll(x, -1)))
shape = np.array([[0, 0], [2, 0], [3, 1], [1, 3], [-1, 1]], dtype=float)
M = np.array([[1, 2], [1, -1]])
new = shape @ M.T # 각 꼭짓점에 M을 곱한다
print(area(shape)) # 7.0
print(area(new) / area(shape)) # 3.0
print(abs(np.linalg.det(M))) # 3.0 같다!
실습 3 — î를 ĵ 쪽으로 돌리며 부호 변화 보기 (6.4)
for deg in [0, 45, 90, 135, 180]:
t = np.deg2rad(deg)
M = np.array([[np.cos(t), 0],
[np.sin(t), 1]]) # î를 각도 t로 돌리고 ĵ는 그대로
print(deg, round(np.linalg.det(M), 3))
# 0°: 1.0 → 45°: 0.707 → 90°(ĵ와 겹침): 0.0 → 135°: -0.707 → 180°: -1.0
실습 4 — det(AB) = det(A)·det(B)
rng = np.random.default_rng(0)
A = rng.standard_normal((3, 3))
B = rng.standard_normal((3, 3))
print(np.linalg.det(A @ B), np.linalg.det(A) * np.linalg.det(B)) # 같은 값
print(np.linalg.det(A @ B), np.linalg.det(B @ A)) # 이것도 같다
실습 5 — 단위 정사각형이 어떻게 변하는지 그리기
행렬식이 음수면 빨간색으로 칠합니다.
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'AppleGothic'
def show(M, title):
M = np.array(M)
sq = np.array([[0, 1, 1, 0], [0, 0, 1, 1]]) # 단위 정사각형 꼭짓점(열 단위)
d = np.linalg.det(M)
fig, ax = plt.subplots(figsize=(5, 5))
ax.fill(*sq, color='gray', alpha=0.2, label='단위 정사각형')
ax.fill(*(M @ sq), color='tab:red' if d < 0 else 'tab:blue', alpha=0.4,
label=f'변환 후 (det = {d:.2f})')
ax.axhline(0, color='gray'); ax.axvline(0, color='gray')
ax.set_xlim(-3, 4); ax.set_ylim(-3, 4); ax.set_aspect('equal'); ax.grid(True)
ax.set_title(title); ax.legend(); plt.show()
show([[3, 0], [0, 2]], '넓이 6배')
show([[1, 2], [1, -1]], '뒤집히고 3배')
show([[2, -2], [1, -1]], '직선으로 눌림')
6.10 용어 정리
| 한국어 | 영어 | 뜻 |
|---|---|---|
| 행렬식 | determinant, det | 선형 변환이 넓이(부피)를 바꾸는 배수. 부호는 방향 |
| 단위 정사각형 | unit square | î와 ĵ를 두 변으로 하는 넓이 1인 정사각형 |
| 방향 | orientation | ĵ가 î의 왼쪽에 있는지(2D), 오른손 법칙이 유지되는지(3D) |
| 방향 뒤집기 | inverting orientation | 종이를 뒤집듯 공간을 거울상으로 만드는 것. 행렬식이 음수 |
| 평행육면체 | parallelepiped | 단위 정육면체가 변환된 기운 상자 |
| 오른손 법칙 | right-hand rule | 검지 î, 가운뎃손가락 ĵ, 엄지 k̂ |
6.11 연습문제
기본
- [[2, 1], [−1, 3]]의 행렬식을 구하고 뜻을 말하라.
- [[4, 2], [2, 1]]의 행렬식을 구하라. 열을 보고 왜 그런지 설명하라.
- [[0, 1], [1, 0]]의 행렬식을 구하고, î와 ĵ가 어디로 가는지로 부호를 설명하라.
- 넓이가 5인 영역을 [[1, 2], [1, −1]]로 변환하면 넓이는 얼마가 되고, 모양에는 무슨 일이 생기는가?
응용
- det(A) = 2, det(B) = −3일 때 det(AB), det(BA), det(AA)를 구하라.
- 회전 행렬의 행렬식은 왜 항상 1인가? 모든 방향으로 2배 키우는 변환의 행렬식은 2차원과 3차원에서 각각 얼마인가?
- 열이 [1, 0, 0], [0, 1, 0], [1, 1, 0]인 행렬의 행렬식을 3×3 공식으로 구하고, 그림으로 결과를 설명하라.
- det(A) = 0이면 어떤 B를 골라도 det(AB) = 0인 이유를 한 문장으로 설명하라.
해설 펼치기
- 2·3 − 1·(−1) = 7. 넓이를 7배로 만들고 방향은 유지합니다.
- 4·1 − 2·2 = 0. 열은 [4, 2]와 [2, 1]이고 [4, 2] = 2 × [2, 1]이라 선형 종속입니다. 평면이 [2, 1] 방향 직선으로 눌립니다.
- 0·0 − 1·1 = −1. î는 [0, 1](위)로, ĵ는 [1, 0](오른쪽)으로 갑니다. ĵ가 î의 오른쪽에 놓이니 방향이 뒤집혔고 넓이는 그대로입니다. 대각선 y = x를 거울로 삼은 반사입니다.
- |−3| = 3이므로 넓이는 15. 행렬식이 음수라 모양이 거울상으로 뒤집힙니다.
- det(AB) = 2 × (−3) = −6, det(BA) = −6, det(AA) = 2 × 2 = 4.
- 회전은 모양을 돌릴 뿐 넓이를 바꾸지 않고 종이를 뒤집지도 않습니다. 그래서 1입니다. 2배 확대는 2차원에서 넓이가 2 × 2 = 4배, 3차원에서 부피가 2 × 2 × 2 = 8배입니다.
- 행 단위로 [[1, 0, 1], [0, 1, 1], [0, 0, 0]]. 1·(1·0 − 1·0) − 0 + 1·(0·0 − 1·0) = 0. 세 번째 열이 앞의 두 열의 합이라 정육면체가 xy 평면으로 납작해져 부피가 0이 됩니다.
- AB는 B를 한 뒤 A를 하는데, 마지막에 A가 모든 넓이를 0으로 만들기 때문입니다. (det(AB) = 0 × det(B) = 0)
다음 장 예고: 7장 “역행렬, 열공간, 랭크, 영공간”. 지금까지 배운 선형 변환을 연립방정식 풀기와 연결합니다. 행렬식이 0이냐 아니냐가 왜 중요한지 여기서 분명해집니다.