큰 틀은 아래 흐름과 같이 진행됨
- 벡터들이 모여서 행렬을 이룸
- 행렬에서 역행렬을 계산, 이를 이용해서 선형회귀 (행렬을 이용한 회귀는 선형 모델에서만 가능)
- 미분/편미분을 이용한 경사하강법(Gradient Descent)
- GD는 연산량이 많고 Non-Convex(볼록한 함수가 아닐 때) 사용 불가 → 확률적 경사하강법(SGD; Stochastic Gradient Descent)
- SGD는 데이터를 한 개만 사용 → 배치마다 여러 데이터를 사용하는 Mini-batch SGD
- 비선형모델일 때 적용하기 위한 Neural Network
벡터의 노름은 원점에서부터의 거리
L1 노름: 각 성분의 변화량의 절대값의 합 ()
L2 노름: 유클리드 거리 ()
def l1_norm(x):
return np.sum(np.abs(x))
def l2_norm(x):
return np.sqrt(np.sum(x ** 2))
두 벡터사이의 거리는 벡터의 뺄셈 이용 ()
def angle(x, y):
v = np.inner(x, y) / (l2_norm(x) * l2_norm(y))
theta = np.arccos(v)
return thetanp.inner()(X의 행벡터와 Y의 행백터 사이의 내적)는 수학에서 말하는 내적과 다름아무래도 7차 교육과정의 영향으로, 행렬과 벡터 등 선형대수 관련 내용들을 고등학생 때에는 단 한번도 접하지 못했었다. 대학교 2학년 1학기 때에도 경영통계를 위해 간단한 미적분과 분산/표준편차 계산 등만 배웠을 뿐...
난생 처음 접하는 개념이다보니, 부스트코스 입교 시험 준비를 시작할 때부터 유튜브로 선형대수를 찾아보며 공부했는데.. 역시나 넘을 수 없는 벽을 느꼈었다고 해야하나?
그래도 선형대수 부분 중에서는 쉬운 부분이라 다행스럽게도 Pre-course 강의를 통해 어느 순간 이해가 딱 되는 것을 느꼈다.
역행렬은 매번 계산할 때마다 느끼지만, 수학자가 아니라 개발자라 천만다행이라는 생각이 든다. numpy.linalg.inv()/numpy.linalg.pinv() 함수로 수월하게 계산할 수 있으니, 컨셉만 정확히 이해하고 있다면 유용하게 사용할 수 있을 것 같다.