벡터가 뭐에요?
벡터
- 벡터는 숫자를 원소로 가지는 리스트 또는 배열
- 차원이 존재
- 벡터는 공간에서 한 점을 나타냄
- 1 차원 [x], 2 차원 [x, y], 3 차원 [x, y, z] ...
- 원점으로부터 상대적 위치를 표현함
- 벡터에 숫자를 곱하면 방향은 그대로고 길이만 변함 → 스칼라곱
- 스칼라곱에서 스칼라가 음수이면 반대 방향으로 진행됨
- 같은 모양을 가진 벡터끼리 덧셈, 뺄셈, 성분곱 (elementry-wise) 가능
- 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치 이동을 표현
벡터의 노름 (norm)
- 벡터의 노름은 원점에서부터의 거리, 임의의 차원 d 에 대해 성립
- 여러 노름 공식이 있지만 두 가지 소개
L1 노름은 각 성분의 변화량의 절대값을 모두 더함
def l1_norm(x):
x_norm = np.abs(x)
x_norm = np.sum(x_norm)
return x_norm
L2 노름은 피타고라스 정리를 이용해 유클리드 거리를 계산, np.linalg.norm 으로 구현 가능
def l2_norm(x):
x_norm = x*x
x_norm = np.sum(x_norm)
x_norm = np.sqrt(x_norm)
return x_norm
- 노름의 종류에 따라 기하학적 성질이 달라짐
- L1 노름 상의 길이가 1 인 원은 마름모
- Robust 학습, Lasso 회귀 등에 사용
- L2 노름 상의 길이가 1 인 원은 원
- Laplace 근사, Ridge 회귀 등에 사용
두 벡터 사이의 거리
- 두 점 사이의 거리 구하는 것과 동일, L1, L2 노름을 이용해 계산할 수 있음
- 벡터의 뺄셈 이용!
||x - y||
두 벡터 사이의 각도 구하기
- L2 노름으로 구할 수 있음
- 제 2 코사인 법칙 사용
- 내적 (np.inner) 을 사용하여 분자를 쉽게 구할 수 있음
def angle(x, y):
v = np.inner(x, y) / (l2_norm(x) * l2_norm(y))
theta = np.arccos(v)
return theta
내적은 어떻게 해석할까?
- 내적은 정사영(orthogonal projection) 된 벡터의 길이와 관련 있다.
- Proj(x) 의 길이는 코사인법칙에 의해 ||x||cosθ 가 된다.
- 내적은 정사영의 길이를 벡터 y 의 길이 ||y|| 만큼 조정한 값이다.
- 내적은 두 벡터의 유사도를 측정하는데 사용 가능
행렬이 뭐에요?
행렬
- 벡터를 원소로 가지는 2 차원 배열
- numpy 는 행벡터를 기본 단위로 가짐
- n x m 행렬 : m 개의 원소지닌 벡터를 n 개 가진 행렬
- X = (xij) 로 표기하기도 함
전치 행렬
- XT=(xji), Transpose of X
- n x m 행렬 → m x n 행렬
- 행렬의 연산을 위해 많이 사용!
- 벡터에도 적용 가능. 행벡터 → 열벡터
행렬의 이해 (1)
- 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 의미
- 행렬의 행벡터 xi 는 i 번째 데이터를 의미
- 행렬의 xij 는 i 번째 데이터의 j 번째 변수 값
행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱
- 같은 모양을 가진 행렬끼리 덧셈, 뺄셈, 성분곱 가능 (element-wise)
행렬 곱셈
- maxtrix multiplication : i 번째 행벡터와 j 번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산
- XY=(∑kxikykj)
행렬의 내적
- 일반 수학에서는 XTY 이지만, numpy 의
np.inner
는 행벡터 기준이므로 XYT (중요)
- XYT=(∑kxikyjk)
⇒ 행렬곱에서는 X 의 열의 개수와 Y 의 행의 개수가 같아야하고, 행렬의 내적에서는 X 의 열의 개수 (행벡터 크기) 와 Y 의 열의 개수가 같아야 함!
행렬의 이해 (2)
- 데이터를 저장하는게 아니라, 서로 다른 두 데이터를 연결시키는 연산자로 이해 할 수 있음
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있음
- m x n 행렬과 n x 1 벡터를 곱하면 벡터는 n → m 차원으로 이동이 됨 (Linear Transform)
- 행렬곱을 통해 패턴을 추출하거나 데이터를 압축할 수 있음
역행렬
- 어떤 행렬 A 의 연산을 거꾸로 되돌리는 행렬을 역행렬 (inverse matrix) 라고 부르고 A−1 라고 표기함
- 역행렬은 행과 열 숫자가 같고 행렬식 (detA) 가 0 이 아닌 경우에만 가능
- AA−1=A−1A=I
np.linalg.inv(X)
유사 역행렬
- 무어-펜로즈 역행렬 (유사역행렬) 은 행과 열의 숫자가 달라도 역행렬 구할 수 있음
- A+ 로 표현
- 행의 개수가 열의 개수보다 많은 경우 A+=(ATA)−1AT
- 열의 개수가 행의 개수보다 많은 경운 A+=AT(AAT)−1
np.linalg.pinv(Y)
- 조심할 점
- 행이 열보다 많은 경우, A+A=I 만 성립
- 열이 행보다 많은 경우, AA+=I 만 성립
- 응용 1 : 변수 개수와 식의 개수가 같지 않은 연립방정식 풀기
⇒ Ax = b 에서 양 변의 앞에 A+ 곱하기
- 응용 2 : 선형회귀분석에서 데이터가 변수 개수보다 많거나 같을 때 사용 (행이 더 많기 때문에 방정식을 푸는 것은 불가능 → L2 norm 을 최소화하는 웨이트 찾기 가능), 양 변 앞에 XT 곱함
sklearn
의 LinearRegression
과 같은 결과를 가져올 수 있음
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)
X_ = np.array([np.append(x, [1]) for x in X])
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta
⇒ 딥러닝을 이해하려면 행렬 연산에 대한 완벽한 이해가 필요!
참조