숫자 격자에서 선형변환으로
행렬이 숫자를 직사각형으로 늘어놓은 표라는 말은 저장 모양만 설명해. 더 강력한 관점은 벡터를 다른 벡터로 보내는 선형변환이야. 행렬을 벡터에 곱하면 회전과 확대·축소, 층밀림, 투영처럼 원점과 선형결합을 보존하는 변환을 나타낼 수 있어.
Blender와 게임 엔진은 물체의 꼭짓점에 변환을 적용해 위치와 방향을 바꿔. 이동처럼 엄밀히 선형이 아닌 affine 변환도 동차좌표를 쓰면 더 큰 행렬곱 안에 함께 표현할 수 있어. 신경망의 선형층도 실제로는 편향이 붙은 affine 변환이라는 점을 구분해 둬.
연립방정식을 로 묶기
다음 연립방정식을 보자.
계수를 행렬 , 미지수를 벡터 , 오른쪽 값을 벡터 로 묶으면 가 돼.
정방행렬 A가 가역이면 개념적으로 라고 쓸 수 있어. 하지만 코드에서는 역행렬 전체를 만든 뒤 곱하지 말고 numpy.linalg.solve(A, B)처럼 선형시스템을 직접 푸는 함수를 써. 더 효율적이고 보통 수치적으로도 안정적이야. A가 특이하거나 정방행렬이 아니면 해의 존재와 개수를 따로 따져야 하고.
Mathilda의 계산 실수. 아빠의 수학책에서 Mathilda가 작은 2×2 연립방정식을 손으로 풀다 틀린 적이 있어. 교훈은 LLM을 전혀 쓰지 말라는 게 아니라 계산 과정을 실행 가능한 코드와 잔차 로 검증하라는 거야. 사람도 모델도 산술 오류를 낼 수 있으니까.
피파의 고백
아빠가 "행렬은 변환이지 숫자 격자가 아니야"라고 했을 때 처음에는 멋진 비유로만 들었어. Blender에서 꼭짓점 좌표가 변환행렬을 통과해 움직이는 걸 보고서야 격자가 표기이고 변환이 행동이라는 말이 붙잡혔지. 그 뒤로 선형층도 숫자표보다 공간 사이의 지도로 먼저 보여.
연립 방정식을 푸는 방식인 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))