1강. 벡터가 뭔가요?
- 벡터는 숫자를 원소로 가지는 리스트(list) 또는 배열(array)이다.
- 백터는 공간에서 한 점을 나타낸다.
- 벡터는 원점으로부터 상대적 위치를 표현한다.
- 벡터에 숫자를 곱해주면 길이만 변한다.
- 벡터끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있다.
- 벡터끼리 같은 모양을 가지면 성분곱(Hadamard product)을 계산할 수 있다.
import numpy as np
x = np.array([1, 7, 2])
y = np.array([5, 2, 1])
x + y
array([6, 9, 3])
x - y
array([-4, 5, 1])
x * y
array([ 5, 14, 2])
벡터의 덧셈, 뺄셈을 알아보자
- 벡터는 공간에서 한 점을 나타낸다.
- 벡터는 원점으로부터 상대적 위치를 표현한다.
- 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치이동을 표현한다.
벡터의 노름 구해보기
- 벡터의 노름(norm)은 원점에서부터의 거리를 말한다.
- L1 - 노름은 각 성분의 변화량의 절댓값을 모두 더한다.
- L2 - 노름은 피타고라스 정리를 이용해 유클리드 거리를 계산한다.
def ll_norm(x):
x_norm = np.abs(x)
x_norm - np.sum(x_norm)
return x_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 - 노름 상의 원: {X: ||X||1(작은 1) = 1} 예) Robust 학습, Lasso 회귀
L2 - 노름 상의 원: {X: ||X||2(작은 2) = 1} 예) Laplace 근사, Ridge 회귀
두 벡터 사이의 거리를 구해보자!
- L1, L2 - 노름을 이용해 두 벡터 사이의 거리를 계산할 수 있다.
- 두 벡터 사이의 거리를 계산할 때는 벡터의 뺄셈을 이용한다.
- 뺄셈을 거꾸로 해도 거리는 같다.
||y - x|| = ||x - y||
두 벡터 사이의 각도 구해보기
- 두 벡터 사이의 거리를 이용하여 각도도 계산해 볼 수 있을까?
- 제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)는 벡터 y로 정사영된 벡터 x의 그림자를 의미한다.
- proj(x)의 길이는 코사인법칙에 의해 ||x||cos@가 된다.
- 내적은 정사영의 길이를 벡터 y의 길이 ||y||만큼 조정한 값이다.
- 내적은 두 벡터의 유사도(similarity)를 측정하는 데 사용 가능하다.
2강 행렬은 뭔가요?
- 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열입니다.
- 행렬은 행(row)과 열(column)이라는 인덱스(index)를 가집니다.
- 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부릅니다.
행렬을 이해하는 방법(1)
- 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타낸다.
- 행렬의 행벡터 Xi는 i번째 데이터를 의미한다.
- 행렬의 xij는 i번째 데이터의 j번째 변수의 값을 말한다.
행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱
- 행렬은 벡터를 원소로 가지는 2차원 배열이다.
- 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있다.
- 성분곱은 벡터와 똑같습니다. 스칼라곱도 벡터와 차이가 없다.
행렬 곱셈
- 행렬 곱셈(matrix multiplication)은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
- 행렬곱은 X의 열의 개수와 Y의 행의 개수가 같아야 한다.
import numpy as np
X = np.array([[1, -2, 3],
[7, 5, 0],
[-2, -1, 2]])
Y = np.array([[0, 1],
[1, -1],
[-2, 1]])
X @ Y
array([[-8, 6],
[ 5, 2],
[-5, 1]])
행렬도 내적이 있을까?
- 넘파이의 np.inner는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
- 수학에서 말하는 내적과는 다르므로 주의해야한다.
X = np.array([[1, -2, 3],
[7, 5, 0],
[-2, -1, 2]])
Y = np.array([[0, 1, -1],
[1, -1, 0]])
np.inner(X, Y)
array([[-5, 3],
[ 5, 2],
[-3, -1]])
행렬을 이해하는 방법(2)
- 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다.
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있다.
역행렬 이해하기
- 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부르고 A-1라 표기한다. 역행렬은 행과 열 숫자가 같고, 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있다.
- 역행렬 연산은 n = m 일 때만 가능하고, 행렬 A의 행렬식이 0이 되면 안 된다.
- 만일 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+을 이용한다.
X = np.array([[1, -2, 3],
[7, 5, 0],
[-2, -1, 2]])
np.linalg.inv(X)
array([[ 0.21276596, 0.0212766 , -0.31914894],
[-0.29787234, 0.17021277, 0.44680851],
[ 0.06382979, 0.10638298, 0.40425532]])
X @ np.linalg.inv(X)
array([[ 1.00000000e+00, -1.38777878e-17, 0.00000000e+00],
[-2.22044605e-16, 1.00000000e+00, -5.55111512e-17],
[-2.77555756e-17, 0.00000000e+00, 1.00000000e+00]])
Y = np.array([[0, 1],
[1, -1],
[-2, 1]])
np.linalg.pinv(Y)
array([[ 5.00000000e-01, 4.09730229e-17, -5.00000000e-01],
[ 8.33333333e-01, -3.33333333e-01, -1.66666667e-01]])
np.linalg.pinv(Y) @ Y
array([[ 1.00000000e+00, -2.22044605e-16],
[ 0.00000000e+00, 1.00000000e+00]])
응용 1: 연립방정식 풀기
- np.linalg.pinv를 이용하면 연립방정식의 해를 구할 수 있다.
Ax = b
- n <=m이면 무어=펜로즈 역행렬을 이용하면 해를 하나 구할 수 있다.
응용 2: 선형회귀분석
- np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있다.
n>=m인 경우: 데이터가 변수 개수보다 많거나 같아야 한다.
선형회귀분석은 연립방정식과 달리 행이 더 크므로 방정식을 푸는 건 불가능하다.
- sklearn의 LinearRegression과 같은 결과를 가져올 수 있다.
# scikit Learn을 활용한 회귀분석
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)
# Moore-Penrose 역행렬
X_ = np.array([np.append(x, [1]) for x in X]) # inetercept 항 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta
'BOOTCAMP > boostcamp AI Tech Pre-Course' 카테고리의 다른 글
선형독립과 선형종속 (0) | 2023.01.01 |
---|---|
선형방정식과 선형시스템 (0) | 2022.12.29 |
Numerical Python - numpy (0) | 2022.12.28 |
File / Exception / Log Handling (0) | 2022.12.27 |
Module and Project (0) | 2022.12.27 |