기계학습을 위한 수학
import numpy as np
# 스칼라
a = 1.5
# 1차원 벡터
b = np.array([1, 2, 3, 4])
# 2x2 벡터 = 행렬
c = np.array([[1, 2], [3, 4]])
# 2x2x2 벡터 = 텐서
d = np.array([[[1, 2], [3, 4], [5, 6], [7, 8]]])
벡터의 아다마르 곱(Hadamard product)¶
벡터의 아다마르 곱은 각 요소를 곱한 것입니다. 따라서 벡터의 크기가 같아야 하고 교환법칙도 성립합니다.
$ A \odot B = B \odot A $
A = np.array([[1, 2], [4, 5]])
B = np.array([[4, 5], [1, 2]])
A * B
벡터의 내적(Dot product)¶
벡터의 내적은 곱의 한 종류입니다. A와 B가 벡터이면, 길이가 같아야 하고 A와 B가 행렬이나 다차원 배열이면 크기가 같아야 합니다. 내적은 Numpy
의 dot()
으로 구할 수 있습니다.
행렬 곱셈에 대해서는 교환법칙이 성립하지 않음으로 내적을 구하는 순서가 중요합니다.
$AB \neq BA$
np.dot(A, B)
np.dot(B, A)
벡터의 전치(Transpose)¶
행과 열을 바꾸는 것으로 전치된 행렬 $A$는 $A^T$로 표현합니다. Numpy
에서는 .T
로 구현합니다. 보통 내적을 계산하기 위한 전처리에 많이 사용됩니다.
A = np.array([[1, 2, 3], [4, 5, 6]]) # 2x3행렬
B = np.array([[4, 5, 6], [1, 2, 3]]) # 2x3행렬
np.dot(A, B.T)
백터의 외적(Cross product)¶
$A \times B$, A cross B 라고 읽습니다.
cross product = X : 외적 연산자로 좌변의 벡터에서 우변의 벡터로 cross 곱하면 두 벡터에 동시에 수직인 법선벡터의 방향이 표시된다.
추가적으로 벡터의 내적과 외적은 서로 반대되는 개념이 아닙니다. 그냥 벡터의 여러가지 성질을 나타내기 위한 서로 다른 개념입니다.
np.cross(A, B)
벡터의 놈(Norm)¶
벡터의 크기를 나타내는 양입니다. 기계학습에서는 L1, L2 놈을 과적합을 방지하기 위한 정규화 방법으로 사용합니다. Numpy
의 linalg.norm()
함수를 사용합니다.
과적합(overfitting): 예측모델이 학습데이터에 대해서는 잘 예측하지만, 학습한 적이 없는 데이터에 대해서는 잘 예측하지 못하는 현상
종류 | 거리를 구하는 방법 | 특징 |
---|---|---|
L1 놈 | 절대값 | 가중치가 작은 경우를 0으로 만들어 변수 선별이 가능. |
L2 놈 | 제곱값 | 모든 특징들이 다 필요하다고 보는 경우에 사용. |
# L1 놈
np.linalg.norm(A, 1)
# L2 놈
np.linalg.norm(A)
코사인 유사도¶
이름에서 알 수 있듯이 벡터의 유사도를 수치화하는 방법입니다. 같은 방향인 경우 최댓값이 1이고 반대 방향인 경우 최솟값이 -1입니다. 코사인 유사도를 구하는 방법은 내적과 놈을 사용합니다.
A = np.array([1, 2]) # 2x2행렬
B = np.array([4, 5]) # 2x2행렬
def cosine_similar(x, y):
return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))
cosine_similar(A, B)
np.eye(2) # 2x2 단위 행렬
역행렬¶
행렬 A에 곱하면 단위행렬이 되는 행렬로 $A^{-1}$로 나타냅니다. $AA^{-1} = E$으로 표현합니다. 행렬에 따라서 역행렬이 존재하지 않는 경우도 있습니다. 역행렬이 존재여부는 행렬식(determinant, 줄여서 det)에 의해 판단하며 이 행렬식이 '0'이 아니면 역행렬이 존재하고, 이 행렬식이 '0'이면 역행렬이 존재하지 않습니다. Numpy
에서는 linalg.det()
함수로 행렬식을 계산하고 linalg.inv()
로 역행렬을 구할 수 있습니다.
A = np.array([[1, 2], [4, 5]])
np.linalg.det(A)
np.linalg.inv(A)
import sympy as sp
from sympy.abc import x, y
# Juypter에서 LaTeX 표현을 위해 필요
sp.init_printing(use_latex="mathjax")
간단한 수식 만들기
exp = x**2 + 1 * x + 6
exp
편미분¶
편미분은 다변수 함수에서 관심이 있는 한 변수만 변수로 생각하고, 나머지 변수들은 상수로 취급한 뒤 미분하는 방법입니다.
sp.diff(exp, x)
sp.diff(exp, x, x) # x로 2번 미분
전미분¶
다변수 함수를 모든 변수에 대해 미분하는 것을 전미분이라 합니다.
exp = x**3 + y**2 + 1 * x + 5
exp
# dy/dx
sp.idiff(exp, y, x)
# dx/dy
sp.idiff(exp, x, y)
x, y = sp.symbols("x y")
exp = x**3 - 2 * x**2 + x + 25
exp
# 부정 적분
F = sp.integrate(exp)
F
정적분¶
위에서 구한 부정적분 값에 구간(0에서 3)을 넣어 계산을 합니다.
(F.subs(x, 3) - F.subs(x, 0)).evalf()