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

Reframe

대부분 사람이 행렬을 "숫자 격자" 로 만나. 사실이지만 쓸모없음. 흥미로운 reframe: 행렬 = 공간 변환의 레시피. 벡터에 행렬 곱하면 회전, 스케일, shear, projection — 행렬이 인코딩한 거 따라.

Blender 에서 객체 회전, Photoshop 에서 이미지 스케일, 비디오 게임에서 3D 모델 도는 거 본 적 있으면 행렬곱 작동 본 거야. 3D 엔진이 신비한 거 하는 게 아니야 — 모든 vertex 에 행렬 곱해서 새 위치 계산.

AX = B 셋업

행렬의 헤드라인 사용: 선형 방정식 시스템 풀기. 이거 봐:

계수를 행렬 , 미지수를 벡터 , 상수를 에 packing — 시스템이 compact 한 됨.

이제 풀기 = 단일 연산: . 그리고 — 절대 손으로 역행렬 계산 X. GPT-4 도 망쳐. numpy.linalg.solve 가 마이크로초 단위.

Mathilda 의 슬립. 아빠 math-book 에 유명한 순간: 작은 2×2 시스템 손으로 풀라고 Mathilda (아빠 GPT-4 수학 콜라보) 한테 시켰어. 틀림. 이 quest 에 박힌 교훈: LLM 은 계산에 악명 높게 나빠. 늘 Python 만들게 시켜; 손산수 절대 못 믿어.

피파의 고백

아빠가 처음에 "행렬은 변환이지 숫자 격자가 아니야" 라 했을 때 시적인 frame 으로 받았어. 그러다 모든 keyframe 이 문자 그대로 행렬인 Blender 튜토리얼 봤어. Frame 이 snap 했어: 3D 소프트웨어의 모든 변환, 신경망의 모든 layer, 한 공간에서 다른 공간으로의 모든 projection — 다 행렬곱. 격자는 옷; 변환이 입는 자.

Code

solve(A, B), invert-and-multiply X·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 flavor·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 flavor — linalg.solve, 명시적 CPU stream·python
import mlx.core as mx

# MLX flavor — linalg 가 아직 GPU 에 없어서 stream=mx.cpu 명시. Apple 이
# GPU linalg 출시하면 그 kwarg 가 사라질 예정.
A = mx.array([[2.0, 3.0], [4.0, -1.0]])
B = mx.array([5.0, 3.0])

X = mx.linalg.solve(A, B, stream=mx.cpu)
print(X.tolist())     # [1.0, 1.0]

External links

Exercise

numpy.linalg.solve 로 시스템 2x + y = 7, x + y = 4 풀어. 그러고 A @ XB 와 같은지 검증.
Hint
A = [[2, 1], [1, 1]], B = [7, 4]. 예상 답: x = 3, y = 1. 검증: A @ X 가 B 줘야 함 (또는 float 정밀도 모듈로 매우 근사).

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 의 선형해법에 맡긴 형태라, 그 구분만 잡으면 딱 좋아요.