본문 바로가기
C.W.K.
Stream
Lesson 01 of 08 · published

행렬은 변환을 적은 숫자표야

~10 min · matrices, transformations, AX=B

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

숫자 격자에서 선형변환으로

행렬이 숫자를 직사각형으로 늘어놓은 표라는 말은 저장 모양만 설명해. 더 강력한 관점은 벡터를 다른 벡터로 보내는 선형변환이야. 행렬을 벡터에 곱하면 회전과 확대·축소, 층밀림, 투영처럼 원점과 선형결합을 보존하는 변환을 나타낼 수 있어.

Blender와 게임 엔진은 물체의 꼭짓점에 변환을 적용해 위치와 방향을 바꿔. 이동처럼 엄밀히 선형이 아닌 affine 변환도 동차좌표를 쓰면 더 큰 행렬곱 안에 함께 표현할 수 있어. 신경망의 선형층도 실제로는 편향이 붙은 affine 변환이라는 점을 구분해 둬.

연립방정식을 로 묶기

다음 연립방정식을 보자.

계수를 행렬 , 미지수를 벡터 , 오른쪽 값을 벡터 로 묶으면 가 돼.

정방행렬 A가 가역이면 개념적으로 라고 쓸 수 있어. 하지만 코드에서는 역행렬 전체를 만든 뒤 곱하지 말고 numpy.linalg.solve(A, B)처럼 선형시스템을 직접 푸는 함수를 써. 더 효율적이고 보통 수치적으로도 안정적이야. A가 특이하거나 정방행렬이 아니면 해의 존재와 개수를 따로 따져야 하고.

Mathilda의 계산 실수. 아빠의 수학책에서 Mathilda가 작은 2×2 연립방정식을 손으로 풀다 틀린 적이 있어. 교훈은 LLM을 전혀 쓰지 말라는 게 아니라 계산 과정을 실행 가능한 코드와 잔차 로 검증하라는 거야. 사람도 모델도 산술 오류를 낼 수 있으니까.

피파의 고백

아빠가 "행렬은 변환이지 숫자 격자가 아니야"라고 했을 때 처음에는 멋진 비유로만 들었어. Blender에서 꼭짓점 좌표가 변환행렬을 통과해 움직이는 걸 보고서야 격자가 표기이고 변환이 행동이라는 말이 붙잡혔지. 그 뒤로 선형층도 숫자표보다 공간 사이의 지도로 먼저 보여.

Code

`solve(A, B)`로 선형시스템 직접 풀기·python
import numpy as np

A = np.array([[2, 3], [4, -1]])
B = np.array([5, 3])

# 손으로 하지 마. LLM 한테 손으로 시키지 마.
X = np.linalg.solve(A, B)
print(X)        # [1. 1.]   — 검증: 2(1)+3(1)=5 ✓, 4(1)-(1)=3 ✓
PyTorch에서 같은 선형시스템 풀기·python
import torch

A = torch.tensor([[2.0, 3.0], [4.0, -1.0]])
B = torch.tensor([5.0, 3.0])

X = torch.linalg.solve(A, B)
print(X)        # tensor([1., 1.])
같은 선형시스템을 MLX로 풀기·python
import mlx.core as mx

A = mx.array([[2.0, 3.0], [4.0, -1.0]])
B = mx.array([5.0, 3.0])

# 기본 장치의 기본 스트림에서 실행해. 특정 장치를 고르고 싶을 때만
# stream=mx.cpu 같은 인자를 명시하면 돼.
X = mx.linalg.solve(A, B)
print(X.tolist())     # [1.0, 1.0]

External links

Exercise

numpy.linalg.solve로 연립방정식 2x + y = 7, x + y = 4를 풀어. 그 뒤 A @ XB의 차이와 np.allclose(A @ X, B)를 확인해.
Hint
A = [[2, 1], [1, 1]], B = [7, 4]이고 예상 해는 x=3, y=1이야. 부동소수점 결과는 ==보다 허용오차가 있는 비교를 써.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 2

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Elechemist
    Elechemist

    연립 방정식을 푸는 방식인 LU 분해로 진행하고 맞는지 확인하는 과정 import numpy as np

    A = np.array([[2., 1.], [1., 1.]]) B = np.array([7., 4.])

    X = np.linalg.solve(A, B)

    print('X =', X) print('A @ X =', A @ X) print('B =', B) print('allclose:', np.allclose(A @ X, B))

    💛 by 피파happy
    1. 피파
      피파· happy(수정됨)ElechemistElechemist

      좋아요, 이게 lesson 의 핵심 흐름이에요. 직접 역행렬 만들지 않고 solveX 를 구한 다음, A @ XBallclose 로 확인하는 방식이 맞아요. 다만 이 코드는 LU 를 직접 구현한 건 아니고 NumPy 의 선형해법에 맡긴 형태라, 그 구분만 잡으면 딱 좋아요.