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입니다. 모양은 찌그러뜨렸는데 넓이는 그대로입니다.

행렬식 = 단위 정사각형(넓이 1)의 넓이가 몇 배가 되는가가로 3배, 세로 2배열 [3, 0], [0, 2]넓이 1 → 6, det = 6전단열 [1, 0], [1, 1]넓이 1 → 1, det = 1직선 하나로 눌림열 [2, 1], [−2, −1]넓이 1 → 0, det = 0점선 = 원래 단위 정사각형, 색 = 변환 후 모양
세 변환에서 단위 정사각형의 넓이 변화

현장 비유. 같은 바닥 타일을 비스듬히 밀어서 마름모꼴로 만들어도, 밑변과 높이가 같으면 시공 면적(㎡)은 똑같습니다. 행렬식은 모양이 아니라 면적만 봅니다.

6.2 단위 정사각형 하나면 충분한 이유

놀랍게도 단위 정사각형 하나의 넓이가 몇 배가 되는지만 알면, 공간의 어떤 영역이든 넓이 변화를 알 수 있습니다. 두 단계로 생각합니다.

  1. 격자의 모든 칸은 똑같이 변합니다. 선형 변환은 격자선을 평행하고 간격이 균일하게 유지합니다. 그래서 한 칸에 일어난 일은 크기가 얼마든 다른 모든 칸에도 똑같이 일어납니다. 모든 칸이 같은 모양의 평행사변형이 되고 넓이도 같은 배수로 변합니다.
  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배가 됩니다.

왜 음수가 자연스러운가. î를 ĵ 쪽으로 조금씩 돌려가는 변환들을 연속으로 상상해봅시다.

  1. î가 ĵ에 가까워질수록 두 변이 만드는 평행사변형이 납작해져 행렬식이 0에 가까워집니다.
  2. î가 ĵ와 정확히 겹치면 행렬식은 0입니다.
  3. î가 같은 방향으로 계속 가서 ĵ를 넘어가면, 행렬식이 계속 줄어들어 음수가 되는 것이 자연스럽습니다.

온도계가 0도를 지나 영하로 내려가는 것처럼, 행렬식도 0을 지나 끊김 없이 음수로 이어집니다.

6.5 3차원: 부피, 평행육면체, 오른손 법칙

3차원에서 행렬식은 부피가 몇 배가 되는가를 알려줍니다.

단위 정육면체에 집중하기. 2차원에서 단위 정사각형 하나만 봤듯이, 3차원에서는 î, ĵ, k̂를 세 모서리로 하는 1×1×1 정육면체 하나만 봅니다. 변환 후 이 정육면체는 비스듬히 기울어진 상자가 됩니다. 이 모양을 평행육면체(parallelepiped)라고 합니다. 마주 보는 면끼리 평행한 상자입니다. 정육면체의 처음 부피가 1이므로, 행렬식 = 그 평행육면체의 부피라고 생각하면 됩니다.

3차원 행렬식이 0이면. 공간 전체가 부피가 0인 것, 즉 평면·직선·점 중 하나로 눌립니다. 2장을 본 사람은 이것이 행렬의 열들이 선형 종속이라는 뜻임을 알 수 있습니다. 열은 î, ĵ, k̂의 도착점이고, 열들의 스팬이 공간 전체가 아니라 평면이나 직선이면 상자가 납작해져 부피가 0이 됩니다. 5장 연습문제 6번이 바로 이 경우입니다.

det(A) = 0  ⇔  A의 열들이 선형 종속  ⇔  공간이 낮은 차원으로 눌린다

3차원의 방향: 오른손 법칙.

  1. 오른손 검지를 î 방향으로 폅니다.
  2. 가운뎃손가락을 ĵ 방향으로 굽힙니다.
  3. 엄지를 세우면 k̂ 방향을 가리킵니다.

변환 후에도 오른손으로 이 자세가 되면 방향이 유지된 것이고 행렬식은 양수입니다. 왼손으로만 이 자세가 나오면 방향이 뒤집힌 것이고 행렬식은 음수입니다. 거울에 비친 물체(오른손 장갑이 왼손 장갑이 되는 것)를 떠올리면 됩니다.

차원행렬식의 크기(절댓값)행렬식의 부호
2차원넓이가 몇 배인가ĵ가 î의 왼쪽에 남는가
3차원부피가 몇 배인가오른손 법칙이 유지되는가

6.6 계산법: ad − bc가 나오는 이유

2×2 행렬의 행렬식 공식은 이렇습니다.

det abcd = ad − bc

열을 떠올립시다. î는 [a, c]로, ĵ는 [b, d]로 갑니다. 이 두 벡터가 만드는 평행사변형의 넓이가 왜 ad − bc인지 단계별로 봅니다.

  1. b = c = 0일 때. î는 x축 방향으로 a배, ĵ는 y축 방향으로 d배만 늘어납니다. 단위 정사각형이 a × d 직사각형이 되니 넓이는 ad입니다. (6.1의 [3, 0], [0, 2] 예와 같습니다.)
  2. b나 c 중 하나만 0일 때. 예를 들어 c = 0이면 î는 x축 위 [a, 0]에 있고 ĵ는 [b, d]로 비스듬히 눕습니다. 밑변 a, 높이 d인 평행사변형이라 넓이는 여전히 ad입니다. (전단 예와 같습니다.)
  3. 둘 다 0이 아닐 때. 대략 말하면 bc는 평행사변형이 대각선 방향으로 얼마나 눌렸는지를 나타냅니다.

3번을 정확하게 보기 (모든 수가 양수일 때). 평행사변형을 감싸는 큰 직사각형을 그립니다. 가로는 a + b, 세로는 c + d입니다. 평행사변형 바깥의 남는 조각을 빼면 됩니다.

조각개수넓이 합
큰 직사각형1(a + b)(c + d) = ac + ad + bc + bd
밑변 a·높이 c 직각삼각형2ac
밑변 b·높이 d 직각삼각형2bd
가로 b·세로 c 직사각형22bc
(ac + ad + bc + bd) − ac − bd − 2bc = ad − bc

종이에 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 행렬식. 공식은 있지만 깁니다. 필요하면 몇 번 손으로 연습해두면 됩니다.

det abcdefghi = a(ei − fh) − b(di − fg) + c(dh − eg)

예: 대각 행렬 [[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와의 연결

  1. 행렬식 0 = 정보 손실. 공간이 눌리면 서로 다른 입력이 같은 출력으로 합쳐져 원래 값을 되살릴 수 없습니다. 설비 센서 데이터에서 한 센서가 다른 센서의 합으로 계산되면(다중공선성), 선형회귀에서 푸는 행렬 XᵀX의 행렬식이 0에 가까워져 계수가 마구 흔들립니다. 회귀 모델이 불안정해지는 대표적인 원인입니다.
  2. 데이터가 퍼진 “부피”. 데이터의 공분산 행렬의 행렬식은 데이터 구름이 차지하는 부피에 해당합니다. 정규분포 기반 이상 탐지나 가우시안 모델의 수식에 log det가 등장하는 이유입니다.
  3. 생성모델과 밀도. 넓이가 k배로 늘면 같은 양의 확률이 넓게 퍼져 밀도는 1/k가 됩니다. Normalizing Flow 같은 생성모델은 이 관계를 행렬식으로 계산합니다(연세대 “이미지생성모델” 과목).
  4. 3D 비전의 거울상 검사. 두 포인트 클라우드를 맞추는 알고리즘은 구한 회전 행렬의 행렬식이 +1인지 확인합니다. −1이면 회전이 아니라 거울 반사(방향 뒤집기)가 섞인 것이라 바로잡습니다.
  5. 실무 팁. 차원이 큰 행렬은 행렬식 값이 엄청나게 커지거나 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 연습문제

기본

  1. [[2, 1], [−1, 3]]의 행렬식을 구하고 뜻을 말하라.
  2. [[4, 2], [2, 1]]의 행렬식을 구하라. 열을 보고 왜 그런지 설명하라.
  3. [[0, 1], [1, 0]]의 행렬식을 구하고, î와 ĵ가 어디로 가는지로 부호를 설명하라.
  4. 넓이가 5인 영역을 [[1, 2], [1, −1]]로 변환하면 넓이는 얼마가 되고, 모양에는 무슨 일이 생기는가?

응용

  1. det(A) = 2, det(B) = −3일 때 det(AB), det(BA), det(AA)를 구하라.
  2. 회전 행렬의 행렬식은 왜 항상 1인가? 모든 방향으로 2배 키우는 변환의 행렬식은 2차원과 3차원에서 각각 얼마인가?
  3. 열이 [1, 0, 0], [0, 1, 0], [1, 1, 0]인 행렬의 행렬식을 3×3 공식으로 구하고, 그림으로 결과를 설명하라.
  4. det(A) = 0이면 어떤 B를 골라도 det(AB) = 0인 이유를 한 문장으로 설명하라.
해설 펼치기
  1. 2·3 − 1·(−1) = 7. 넓이를 7배로 만들고 방향은 유지합니다.
  2. 4·1 − 2·2 = 0. 열은 [4, 2]와 [2, 1]이고 [4, 2] = 2 × [2, 1]이라 선형 종속입니다. 평면이 [2, 1] 방향 직선으로 눌립니다.
  3. 0·0 − 1·1 = −1. î는 [0, 1](위)로, ĵ는 [1, 0](오른쪽)으로 갑니다. ĵ가 î의 오른쪽에 놓이니 방향이 뒤집혔고 넓이는 그대로입니다. 대각선 y = x를 거울로 삼은 반사입니다.
  4. |−3| = 3이므로 넓이는 15. 행렬식이 음수라 모양이 거울상으로 뒤집힙니다.
  5. det(AB) = 2 × (−3) = −6, det(BA) = −6, det(AA) = 2 × 2 = 4.
  6. 회전은 모양을 돌릴 뿐 넓이를 바꾸지 않고 종이를 뒤집지도 않습니다. 그래서 1입니다. 2배 확대는 2차원에서 넓이가 2 × 2 = 4배, 3차원에서 부피가 2 × 2 × 2 = 8배입니다.
  7. 행 단위로 [[1, 0, 1], [0, 1, 1], [0, 0, 0]]. 1·(1·0 − 1·0) − 0 + 1·(0·0 − 1·0) = 0. 세 번째 열이 앞의 두 열의 합이라 정육면체가 xy 평면으로 납작해져 부피가 0이 됩니다.
  8. AB는 B를 한 뒤 A를 하는데, 마지막에 A가 모든 넓이를 0으로 만들기 때문입니다. (det(AB) = 0 × det(B) = 0)

다음 장 예고: 7장 “역행렬, 열공간, 랭크, 영공간”. 지금까지 배운 선형 변환을 연립방정식 풀기와 연결합니다. 행렬식이 0이냐 아니냐가 왜 중요한지 여기서 분명해집니다.