- 벡터
- 숫자를 원소로 가지는 리스트 or 배열
== 원점에서의 상대적 위치
벡터의 노름: 원점에서의 거리
L1 norm: 각 성분의 변화량 절대값의 합
L2 norm: 유클리드 거리(성분곱의 합에 제곱근 연산)
=> 기하학적 성질에 따라 두가지 모두 사용
L1 norm 상의 원 => Robust 학습, Lasso 회귀
L2 norm 상의 원 => Laplace 근사, Ridge 회귀
1
2
3
4
5
6
7
8
9
10
11
| def l1_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
# 또는 np.linalg.norm(x)
|
- 두 벡터 사이의 거리 => 유클리드 거리 사용
즉, 벡터의 뺄셈 이용 (순서 바뀌어도 결과는 동일)
- Numpy 라이브러리 이용
1
| dist = np.linalg.norm(a - b) #L2 norm
|
- scipy 라이브러리의 distance 모듈 이용
1
| dist = distance.euclidean(a, b)
|
- 두 벡터 사이의 각도 => L2 norm만 가능
1
2
3
4
5
| # 라디안 단위 각도 계산
def angle(x, y):
v = np.inner(x, y) / (l2_norm(x)*l2_norm(y)) # 분자:inner product(내적)
theta = np.arccos(v) #코사인의 역함수, 즉, 주어진 코사인 값에 해당하는 각 반환
return theta
|
- 내적(inner product)
- 정사영(orthogonal projection)의 길이를 벡터 y의 길이만큼 조정한 값 == ||y|| Proj(x)
=> 벡터 간의 유사도 측정시 사용
Proj(x) == ||x||cosθ
즉, 벡터 x와 y의 내적: x의 노름 x y의 노름 x 두 벡터 사이의 각도
1
| dot_product = np.dot(a, b)
|
- 벡터를 원소로 가지는 2차원 배열(n x m 행렬)
- 벡터공간에서 사용되는 연산자
- 행렬곱을 통해 벡터(점)를 다른 차원의 공간으로 보냄
=> 패턴 추출 or 데이터 압축
- 전치행렬
- 행과 열의 인덱스가 바뀐 행렬
- 행렬 곱셈
- i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬 계산
np.inner은 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산
- 역행렬 (inverse matrix)
- 행과 열 숫자가 같고, 행렬식(determinant)이 0이 아닌 경우에만 가능
1
| np.linalg.inv(X) #inverse 의미
|
위 조건이 성립되지 않을 경우,
유사역행렬(pseudo-inverse) or 무어-펜로즈(Moore-Penrose) 역행렬 사용
1
| np.linalg.pinv(Y) #pseudo inverse
|
- 선형회귀분석
- 무어 펜로즈 역행렬을 사용해 데이터를 선형모델로 해석하는 선형회귀식(L2 norm을 최소화) 찾을 수 있음
n >= m인 경우: 데이터가 변수 개수보다 많거나 같아야 함
1
2
3
4
5
6
7
8
9
10
| #1. Scikit Learn 을 활용한 회귀분석
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)
#2. Moore-Penrose 역행렬
X_ = np.array([np.append(x,[1]) for x in X]) # intercept 항 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta
|
네이버 boostcourse의 인공지능 기초 다지기 강의를 참조함