[인공지능 수학] 행렬과 가우스-조던 소거법 완전 정복 (feat. SageMath 실습)
📌 오늘의 학습 목표
어렵고 복잡한 수식이 가득한 연립방정식을 컴퓨터(인공지능)는 어떻게 순식간에 풀어낼까? 그 비밀은 바로 행렬(Matrix) 과 가우스-조던 소거법에 있음.
- 행렬의 기본 연산과 선형 연립방정식의 첨가행렬(Augmented Matrix) 표현법을 이해함.
- 가우스 소거법의 핵심인 REF(행사다리꼴) 와 RREF(기약행사다리꼴) 의 차이를 파악함.
- 오픈소스 수학 소프트웨어인 SageMath를 사용하여 복잡한 행렬 계산 4가지 예제를 파이썬 코드로 자동화해 봄.
1. 행렬(Matrix)의 기본 연산과 선형 연립방정식
인공지능이나 컴퓨터는 사람처럼 복잡한 식을 하나하나 들여다보지 않음. 딥러닝 같은 분야에서는 수천, 수만 개의 숫자들을 아주 빠르고 효율적으로 한 번에 처리해야만 함. 이때 숫자들을 마치 엑셀 스프레드시트처럼 가로세로 딱 맞춰 네모난 묶음(표)으로 싹 모아둔 것을 행렬(Matrix) 이라고 부름.
- 왜 행렬을 쓸까?: 각각 따로 흩어져 있는 데이터(예: 100명의 키, 몸무게 정보 등)를 하나의 거대한 엑셀 표(행렬)로 묶어놓으면, 컴퓨터가 이 표구조 하나만 통째로 지지고 볶아서(덧셈, 뺄셈, 곱셈) 수만 번의 계산을 단 1초 만에 “병렬 연산”으로 끝낼 수 있기 때문임.
🧮 [예제1] 행렬의 연산 실습 (in SageMath)
두 개의 행렬 $A$와 $B$가 있을 때, 이를 더하고 스칼라(숫자)를 곱하는 실습임.
# SageMath 환경에서 실행
# 1. 행렬 A와 B를 정의함 (2x2 크기의 표를 만듦)
A = matrix(QQ, [[1, 2], [3, 4]])
B = matrix(QQ, [[5, -1], [0, 2]])
print("--- 행렬 A ---")
print(A)
print("\n--- 행렬 B ---")
print(B)
# 2. 행렬의 덧셈 (같은 위치의 칸끼리 더함)
C = A + B
print("\n--- A + B ---")
print(C)
# 3. 스칼라 곱 (행렬 A의 모든 칸에 3을 곱함)
D = 3 * A
print("\n--- 3 * A ---")
print(D)
💡 계산 결과 해설
- 덧셈
A + B: 1행 1열 끼리1+5=6, 1행 2열 끼리2+(-1)=1… 이런 식으로 네 칸을 각각 더해서 새로운 행렬을 만듦. - 스칼라 곱
3 * A: 행렬 A의 모든 숫자(1, 2, 3, 4)를 각각 3배로 뻥튀기함.[[3, 6], [9, 12]]가 됨.
🧮 [예제1-2] 선형연립방정식과 첨가행렬(Augmented Matrix)의 개념
중학교 수학 시간에 배웠던 연립방정식을 떠올려봄. 우리가 풀어야 할 선형방정식 두 개가 아래처럼 주어짐.
$2x + 3y = 8$
$x - y = 1$
우리가 손으로 이 식을 풀 때는 계속해서 $x, y$ 같은 영어 철자와 $+$, $-$, = 기호들을 반복해서 적어야 함. 만약 식의 개수가 10개로 늘어난다면 $x, y, z, w, \dots$ 등 쓸 문자가 너무 많아져서 손이 아프고 눈이 핑핑 돎.
이 귀찮음을 해결하려고 수학자들이 만든 천재적인 치트키가 바로 첨가행렬(Augmented Matrix) 임.
- “어차피 연립방정식 풀 때 중요한 건 문자 앞에 달린 숫자(계수와 비율)랑, 기호 오른쪽에 있는 결과값 뿐이잖아?”
- 그래서 거추장스러운 $x, y$, 연산 기호들을 전부 싹 다 버리고, 숫자들만 원래 자리에 맞춰서 네모난 표(행렬)로 꽉꽉 압축해버린 것이 바로 첨가행렬임! 컴퓨터 시스템이나 가우스 소거법을 편하게 써먹기 위한 일종의 ‘방정식 압축팩’이라고 보면 됨.
# SageMath 환경에서 실행
# 연립방정식을 첨가행렬 형태로 만들기
# 세로줄(augment) 표시는 보기 좋게 '|'를 추가하는 기능임
# 왼쪽의 x, y 계수들만 모은 행렬
coef_matrix = matrix(QQ, [[2, 3], [1, -1]])
# 오른쪽의 결과(정답) 값들만 모은 벡터 (세로로 세움)
result_vector = vector(QQ, [8, 1])
# 두 행렬을 하나로 합쳐서(첨가해서) 보여줌
augmented_matrix = coef_matrix.augment(result_vector, subdivide=True)
print("--- 연립방정식의 첨가행렬 ---")
print(augmented_matrix)
💡 결과 직관적 이해
출력된 표를 보면 [ 2 3 | 8 ] 과 [ 1 -1 | 1 ] 처럼 생겼음.
세로선(|)을 기준으로 왼쪽은 식의 변수 비율을, 오른쪽은 = 너머의 결과를 의미하므로 아주 직관적이고 깔끔해짐!
(아래는 두 선형 방정식의 교점을 2D 그래프로 시각화한 결과임. 이 교점이 곧 연립방정식의 해임!)

2. 가우스-조던 소거법과 REF / RREF
앞서 우리는 귀찮은 변수 문자를 다 버리고 오직 숫자로만 구성하여 압축한 표(첨가행렬)를 얻었음. 그러면 이제 컴퓨터가 이 표를 어떻게 혼자 이리저리 조작해서 정답 $x, y, z$를 뿅 하고 찾아낼까?
아주 놀랍게도 딥러닝 인공지능이 내부적으로 푸는 방법조차, 우리가 중학교 필수 수학에서 배웠던 “가감법”(위 식과 아래 식을 더하고 빼서 미지수 $y$ 같은 거 하나씩 날려버리던 방법)과 소름 돋게 똑같음. 컴퓨터는 그냥 그 가감법을 로봇처럼 엄청 빠르고 체계적으로 반복해서 숫자를 0으로 청소해 나갈 뿐임.
이처럼 위아래 행(가로줄)끼리 더하고 빼고, 혹은 어떤 상수(숫자)를 곱해서, 연립방정식의 미지수들을 하나하나 소거해 나가는 체계적인 알고리즘 절차를 가우스-조던 소거법(Gauss-Jordan Elimination) 이라고 부름. 이 덧셈 뺄셈 과정을 끈기 있게 계속하다 보면, 지저분하고 얽혀있던 행렬표 숫자들이 점차 깔끔한 “계단(사다리꼴)” 형태로 예쁘게 청소되는데, 청소 진행 상황에 따라 우리가 REF 와 RREF 로 이름을 나누어 부름.
🧹 1단계 청소: REF (Row Echelon Form, 행사다리꼴)
- 컴퓨터의 첫 번째 목표: “최소한 위 칸에서 아래 칸으로 내려갈수록 빈 공간(
0)이 넓어지게 방정식을 정리하자!” - 위쪽 줄에서 아래쪽 줄로 한 줄씩 내려갈 때, 맨 처음 등장하는 영이 아닌 숫자의 위치가 점점 오른쪽으로 밀려남. 비유하자면, 표 모양이 비탈진 계단식 다랭이논처럼 한쪽 모서리가 깎여 나간 모양이 됨.
- 이렇게 절반의 청소만 만들어 놔도 대단한 것이, 제일 밑바닥 줄은 불필요한 문자가 소거되어 딱 하나만 살아남아서(예:
1 * z = 3) 방정식 끄트머리인 $z$ 의 정답이 바로 들통남. $z$를 알았으니 그걸 윗 줄 식에 다시 위로 치고 올라가며 대입해서 $y$를 찾고, 또 더 윗 줄로 거슬러 올라가며 $x$를 찾는 “역대입 수비전”이 가능해짐.
✨ 최종 완성 청소: RREF (Reduced Row Echelon Form, 기약행사다리꼴)
- 컴퓨터의 최종 목표: “REF에서 한 술 더 떠서, 위쪽에 남은 쓸데없는 숫자들까지 싹 다 치워버려서 한눈에 정답이 나오게 하자!”
- 가우스-조던 소거법의 완전체, 연립방정식의 궁극의 진화 형태임.
- 표의 가운데 대각선에는 오직
1만 꼿꼿이 세워두고, 그 대각선의 위쪽과 아래쪽에 자리 잡은 나머지 칸들은 전부 먼지 한 톨 없이0으로 청소해버린(기약된) 완벽한 상태임. - 이렇게 결벽증처럼 행렬을 청소해 버리고 나면 제일 대박인 점은? 아까 REF처럼 귀찮게 밑에서 위로 되돌아가며 대입할 필요조차 없음. 첫 번째 가로줄을 읽는 순간 수직선(
|) 너머의 남은 결과판 숫자가 그냥 $x$의 100% 확정 정답, 두 번째 줄은 $y$의 100% 정답이 직관적으로 바로 튀어나와 버림!
🧮 [예제2] REF와 RREF 비교 실습 (in SageMath)
# SageMath 환경에서 실행
# 3개의 식을 가진 복잡한 첨가행렬 하나를 만듦
M = matrix(QQ, [
[1, 2, -1, 3],
[2, 5, 2, 10],
[-1, -2, 3, -1]
])
print("--- 원본 첨가행렬 M ---")
print(M)
# 1. 행사다리꼴 (REF) 구하기
ref_M = M.echelon_form()
print("\n--- 행사다리꼴 (REF) ---")
print(ref_M)
# 2. 기약행사다리꼴 (RREF) 구하기
rref_M = M.rref()
print("\n--- 기약행사다리꼴 (RREF) ---")
print(rref_M)
💡 형태 차이 이해하기
- REF 결과를 보면 대각선 아래쪽이
0으로 변해있어 계단 모양이 됨. (방정식 하나를 풀기 쉬워진 상태) - RREF 결과를 보면 대각선엔 오롯이
1만 있고, 나머지 칸은 싹 다0으로 청소되어 있음. 그 오른쪽에 남은 숫자들이 바로 연립방정식의 해답(정답)임!
🧮 [예제3] 가우스-조던 소거법 1: 수동으로 스텝 밟아보기 실습 (in SageMath)
방금 위 예제에서 SageMath가 1초 만에 .rref() 라는 마법의 주문(내장 함수) 한 방으로 알아서 최종 청소를 끝마쳐 줬지만, 도대체 컴퓨터 속에서는 무슨 일이 일어난 건지 지퍼를 열고 한 겹 벗겨서 살펴봄.
아래 코드는 컴퓨터가 속으로 “첫 번째 방정식 식에서 두 번째 식을 빼보고, 숫자가 큰 식은 반으로 나누고…” 하던 바로 그 가감법(기본 행 연산) 을 우리가 SageMath로 직접 1줄씩 일일이 지시해 보는 수동 실습임. 이렇게 손수 덧셈 뺄셈으로 0을 하나하나 만들어 나가는 과정이 바로 가우스-조던 소거법의 진짜 속살임.
# SageMath 환경에서 실행
M = matrix(QQ, [
[2, 4, 6, 18],
[1, 3, 2, 10],
[-1, 1, 1, 2]
])
print("1. 초기 상태")
print(M)
# 1번째 줄(Row 0)을 전체적으로 1/2로 나눔 (선두를 1로 만들기 위해)
M.rescale_row(0, 1/2)
print("\n2. R0을 1/2로 나눔")
print(M)
# 1번째 줄(R0)에 -1을 곱한 뒤, 그 결과를 2번째 줄(R1)에 더함! (아래쪽 0 만들기)
# 방정식 가감법에서 위 식을 아래 식에서 빼는 것과 완전 똑같음.
M.add_multiple_of_row(1, 0, -1)
print("\n3. R1에서 R0을 뺌 (R1의 첫 번째 칸 0으로 정리)")
print(M)
# 1번째 줄(R0)을 그냥 3번째 줄(R2)에 더함 (부호가 반대니까 바로 0이 됨)
M.add_multiple_of_row(2, 0, 1)
print("\n4. R2에 R0을 더함 (R2의 첫 번째 칸 0으로 정리)")
print(M)
이런 식으로 줄 단위로 더하고(add), 빼고, 곱하는(rescale) “기본 행 연산(Row Operations)”을 수십 번 반복해서 대각선 기준으로 다 0을 만들어가는 것이 인공지능이 내부에서 열심히 푸는 가우스 소거 알고리즘임.
🧮 [예제4] 가우스-조던 소거법 2: RREF 한 방으로 해 구하기 실습 (in SageMath)
위의 3번 예제처럼 사람이 한 땀 한 땀 0을 손으로 지워가며 청소하는 것은 너무 피곤함. 특히 연립방정식의 미지수가 수십수백 개씩 방대하게 등장하는 딥러닝 영역이나, 빅데이터 통계 영역에선 더더욱 불가능함.
그래서 실전에서는 그냥 컴퓨터를 믿고 SageMath의 .rref() 치트키 명령어 단 1줄에 모든 가감법 청소를 통째로 외주 줘버림. 이 실습은 머리 아픈 미지수 3개짜리(3원 1차) 연립방정식의 정답을 우리 대신 컴퓨터가 어떻게 통쾌하고 똑똑하게 한 번에 찾아내어 RREF 행렬로 대령하는지 알 수 있는 최종 실습임!
우리가 1차원적으로 풀어야 할 꼬여있는 3개의 방정식: $x + 2y - z = 2$
$2x + 5y + 2z = 9$
$-x - 2y + 3z = 2$
# SageMath 환경에서 실행
# 1. 문제를 첨가행렬 형태로 뽑아냄 (수직선 세팅)
A_aug = matrix(QQ, [
[ 1, 2, -1, | 2],
[ 2, 5, 2, | 9],
[-1, -2, 3, | 2]
], subdivide=True) # 편의상 '|' 기재를 허용하지 않으므로 코드 작성 시 빼고 subdivide=True 사용
# 실제 Sage 문법
A_aug = matrix(QQ, [
[ 1, 2, -1, 2],
[ 2, 5, 2, 9],
[-1, -2, 3, 2]
])
print("--- 1. 연립방정식의 첨가행렬 ---")
print(A_aug)
# 2. 가우스-조던 소거법 펀치! (RREF)
solved_matrix = A_aug.rref()
print("\n--- 2. RREF 변환 완료 = 정답 도출 ---")
print(solved_matrix)
💡 직관적인 정답 해석
출력된 solved_matrix 결과를 보면 이렇게 나옴.
[1 0 0 | 1]
[0 1 0 | 1]
[0 0 1 | 1]
- 첫 번째 줄 해석:
1*x + 0*y + 0*z = 1➡️ 즉, x = 1 - 두 번째 줄 해석:
0*x + 1*y + 0*z = 1➡️ 즉, y = 1 - 세 번째 줄 해석:
0*x + 0*y + 1*z = 1➡️ 즉, z = 1
어지럽게 얽혀있던 3개의 방정식이 SageMath의 .rref() 함수 단 한 줄로 깔끔하게 풀려버린 것임!
(아래는 세 개의 평면 방정식이 3차원 공간에서 오직 하나의 점(1, 1, 1)에서 교차하며 만나는 모습을 시각화한 것임)

🎯 오늘의 요약 (Summary)
- 행렬과 첨가행렬: 방정식에서 복잡한 $x, y, z$ 문자 껍데기는 버리고, 진짜 알맹이인 숫자(계수)들만 네모난 표로 묶어놓은 압축팩임.
- 가우스 소거법 (Row Operations): 중학교 때 배운 가감법(위 식에서 아래 식 빼기)을 컴퓨터가 표(행렬) 상태로 줄 단위로 반복 작업하는 것임.
- REF vs RREF:
- REF(행사다리꼴): 대각선 아래쪽만 0으로 비워서 계단 모양으로 만든 중간 단계 형태.
- RREF(기약행사다리꼴): 대각선엔 1만 남기고 위아래 싹 다 0으로 청소한 최종 흑염룡 형태. 이 상태가 되면 오른쪽에 남은 숫자들이 지체 없이 연립방정식의 100% 정답이 됨.
- 이 원리 덕분에 인공지능은 1억 개의 미지수가 있는 초거대 방정식도 슈퍼컴퓨터 행렬 연산을 통해 초고속으로 풀어낼 수 있는 것임!
Comments