[AI 기초수학 1편] 연립방정식, NumPy로 0.1초에 풀기
AI는 기초가 중요하다고 합니다.. 그 기초가 수학입니다..(저도 사실 수학을 좋아하진 않지만)! 이번 포스팅에서 같이 사과·바나나 가격 구하는 연립방정식을 NumPy로 함께 돌려보면서, AI 신경망의 뿌리가 어디서 오는지 직접 확인해 봅시다.
시작하며 — AI 공부, 수학부터 해야 할까요?
AI에 관심이 생겨서 시작하려고 하면 "행렬, 벡터, 편미분, 확률분포..." 등
내가 굳이 배워야 할까.. 라고 덮어버리고 싶던 적이 있었습니다.
그런데 사실 AI의 핵심 수학은 중학교·고등학교 때 이미 다 봤습니다.
연립방정식, 평균, 확률. 낯선 이름으로 포장돼 있을 뿐이에요.
이 시리즈에서는 그 수학들을 NumPy로 직접 돌려보면서,
"아, 이게 AI에서 이렇게 쓰이는구나"를 함께 느껴보는 걸 목표로 합니다.
첫 번째 주제는 연립방정식입니다. 같이 알아봐요!
연립방정식, 기억하시죠?
중학교 때 이런 문제 풀어보셨을 거예요.
사과 3개와 바나나 2개를 사면 7,000원입니다.
사과 1개와 바나나 4개를 사면 6,000원입니다.
사과와 바나나는 각각 얼마일까요?
손으로 풀면 가감법이니 대입법이니 해서 5~10분 걸립니다.
변수가 3개, 4개로 늘어나면? 손으로는 거의 못 풉니다.
NumPy는 변수가 100개여도 0.1초면 풀어버립니다.
행렬로 표현하기 — 연립방정식의 다른 얼굴
연립방정식을 NumPy로 풀려면 먼저 행렬로 표현해야 합니다.
어렵게 생각하실 필요 없어요. 숫자를 표로 정리하는 것뿐입니다.
위 문제를 행렬로 바꾸면 이렇게 됩니다.
- 계수 행렬 A: 왼쪽 숫자들 (사과·바나나 개수) →
[[3, 2], [1, 4]] - 상수 벡터 b: 오른쪽 금액 →
[7000, 6000] - 해 벡터 x: 우리가 구할 것 →
[사과 가격, 바나나 가격]
수식으로 쓰면 Ax = b. 이걸 x에 대해 풀면 됩니다.
Jupyter Notebook에서 NumPy를 불러오고 문제를 주석으로 정리한 모습
배열로 만들기
계수 행렬과 상수 벡터를 np.array()로 만들어 봅시다.
import numpy as np
# 계수 행렬 A
A = np.array([
[3, 2], # 사과 3개, 바나나 2개
[1, 4] # 사과 1개, 바나나 4개
])
# 상수 벡터 b
b = np.array([7000, 6000])
print("계수 행렬 A:")
print(A)
print("\n상수 벡터 b:", b)
계수 행렬 A와 상수 벡터 b를 NumPy 배열로 정의한 결과
풀기 — numpy.linalg.solve()
이제 numpy.linalg.solve(A, b) 한 줄이면 끝입니다.
linalg는 "linear algebra(선형대수)"의 줄임말이에요.
x = np.linalg.solve(A, b)
print(f"사과 한 개: {x[0]:.0f}원")
print(f"바나나 한 개: {x[1]:.0f}원")
# 검산
print("\n검산:")
print(f"사과 3 + 바나나 2 = {3*x[0] + 2*x[1]:.0f}원 (정답: 7000원)")
print(f"사과 1 + 바나나 4 = {1*x[0] + 4*x[1]:.0f}원 (정답: 6000원)")
solve() 한 줄로 사과·바나나 가격을 구하고 검산까지 완료
손으로 풀면 10분, NumPy는 0.1초도 안 걸립니다.
변수가 늘어나도 코드 구조는 거의 그대로예요.
실전 — 변수가 3개여도 똑같습니다
이번엔 세 지점의 매출을 구하는 문제를 같이 풀어봅시다.
강남점 + 홍대점 + 신촌점 = 1,500만원
강남점 × 2 + 홍대점 = 1,800만원
강남점 + 신촌점 × 2 = 1,400만원
각 지점 매출은 얼마일까요?
A2 = np.array([
[1, 1, 1],
[2, 1, 0],
[1, 0, 2]
])
b2 = np.array([1500, 1800, 1400])
x2 = np.linalg.solve(A2, b2)
print(f"강남점: {x2[0]:.0f}만원")
print(f"홍대점: {x2[1]:.0f}만원")
print(f"신촌점: {x2[2]:.0f}만원")
변수가 3개로 늘어나도 코드 구조는 동일합니다
코드 구조는 2변수 때랑 완전히 같습니다.
행렬 크기만 달라졌을 뿐이에요.
AI와 연결해 보면?
여기서 잠깐, 이게 AI랑 어떤 관계가 있을까요?
AI의 신경망은 결국 수많은 가중치(weight)를 구하는 과정입니다.
"이 가중치들이 모였을 때 정답에 가장 가까운 값이 나오려면?"
그 계산의 뿌리가 바로 Ax = b 형태의 선형 방정식이에요.
변수가 2개에서 3개로 늘어도 solve() 코드가 그대로였던 것처럼,
신경망에서 가중치가 수백만 개가 되어도 원리는 같습니다.
다만 행렬이 엄청 커질 뿐이에요.
정리
- 연립방정식은 계수 행렬 A와 상수 벡터 b로 표현됩니다
numpy.linalg.solve(A, b)한 줄로 풀 수 있습니다- 변수가 몇 개든 코드 구조는 동일합니다
- AI 신경망의 가중치 계산도 같은 원리에서 출발합니다
다음 편에서는 평균·분산·로그 — AI가 데이터를 읽는 법을 함께 알아봅니다.
"왜 손실함수에 log가 들어가지?" 그 이유가 거기 있습니다. ㅎㅎ
