벡터의 기하학적 의미
* N차원 벡터 a는 N차원의 공간에서 다음과 같다고 생각할 수 있다.
1) 벡터 a의 값으로 표시되는 점(point) 또는
2) 원점과 벡터 a의 값으로 표시되는 점을 연결한 화살표
* 벡터를 화살표로 생각할 때, 길이와 방향을 유지한 채 평행이동하는 것이 가능하다.
벡터의 길이
* 벡터 a의 길이는 norm $ ||a|| $로 정의한다.
스칼라와 벡터의 곱
* 양의 실수와 벡터를 곱하면 벡터의 방향이 변하지 않고 길이가 실수배가 된다.
* 음의 실수와 벡터를 곱할 경우 벡터의 방향이 반대가 되고 길이가 실수배가 된다.
단위 벡터
* 방향에 상관 없이 길이가 1인 벡터를 단위벡터(unit vector)라고 한다. 예를 들면 다음과 같다.
* 영벡터가 아닌 임의의 벡터 x에 대해 다음 벡터는 벡터 x와 같은 방향을 가리키는 단위벡터가 된다.
벡터의 합
* 두 벡터의 합은 두 벡터를 이웃하는 변으로 가지는 평행사변형의 대각선을 나타내는 벡터가 된다.
* 두 벡터의 합은 또한 한 벡터를 다른 벡터의 끝 점으로 평행이동 했을 때 가리키게 되는 점의 위치로 생각할 수 있다.
벡터의 선형조합
* 여러개의 벡터에 스칼라곱을 해준 후 더한 것을 벡터의 선형조합이라고 한다.
벡터의 차
* 벡터의 차 a-b=c 는 벡터 b가 가리키는 점으로부터 벡터 a가 가리키는 점을 연결하는 벡터이다.
* 벡터 b에 벡터 a-b를 더하면(벡터 b와 벡터 a-b를 연결하면) 벡터 a가 되어야 하기 때문이다.
Word2Vec
* word2vec 방법을 이용하면 word를 점 또는 vector로 표현할 수 있다. word2vec으로 만들어진 단어는 단어의 의미에 따라 평행사변형 관계를 가질 수 있다.
일본 = 도쿄 + (한국 - 서울)
* 벡터의 차를 통해 살펴보았듯이 a-b = c 는 b가 가리키는 점으로부터 a가 가리키는 점을 연결한 벡터이다. 때문에 한국 - 서울은 서울에서 한국으로 향하는 벡터이다. 의미론적으로 보자면 서울(수도 이름)을 한국(나라 이름)으로 바꾸는 행위이다.
* 이러한 행위를 도쿄에 대해 적용한 결과가 도쿄 + (한국 - 서울)이다.
* 한국은 $\begin{bmatrix} 3 \\ 4\end{bmatrix}$, 서울은 $\begin{bmatrix} 2 \\ 2\end{bmatrix}$이다. 한국 - 서울은 $\begin{bmatrix} 1 \\ 2\end{bmatrix}$이다.
* 도쿄는 $\begin{bmatrix} 4 \\ 1\end{bmatrix}$ 이다. 도쿄 + (한국 - 서울) = $\begin{bmatrix} 5 \\ 3\end{bmatrix}$으로 일본이 된다.
연습문제 3.1.2
남자배우, 여자배우, 남자, 여자, 이렇게 4가지 단어에 대응하는 4개의 벡터에 대해 위와 같은 관계가 성립한다고 가정하자. 다음 식을 완성하라.
남자배우 = 여자배우 + ?
* 정답 : ?에는 (남자 - 여자)가 들어가야 한다.
유클리드 거리(Euclidean distance)
* 두 벡터가 가리키는 점 사이의 거리를 유클리드 거리라고 한다.
벡터의 내적과 삼각함수
* 두 벡터의 내적은 벡터의 길이와 두 벡터 사이의 각도 $\theta$의 cosine함수 값으로 계산 가능하다.
* $sin \theta$의 값은 $\theta$가 0에 가까워질수록 0에 가까워지고 90에 가까워질수록 1에 가까워진다.
* $cos \theta$의 값은 $\theta$가 0에 가까워질수록 1에 가까워지고 90에 가까워질수록 0에 가까워진다.
직교(orthogonal)
* 두 벡터 a와 b가 이루는 각도가 90도이면 직교한다고 한다.
* cos 90 = 0 이므로 서로 직교인 두 벡터의 내적은 0이 된다.
* 직교하는 두 N차원 벡터 a, b는 다음 식이 성립한다.
정규 직교(orthonormal)
* N개의 단위벡터 $v_1, v_2, ... , v_N$가 서로 직교하면 정규직교라고 한다.
* 정규직교하는 3차원 벡터 $v1, v2, v3$로 이뤄진 행렬 V에 대해서 다음 등식이 성립한다.
코사인 유사도(Cosine Similarity)
* 두 벡터 사이의 코사인 값을 코사인 유사도라고 한다.
* 코사인 유사도는 두 벡터의 방향이 얼마나 같은지를 나타내는 지표이다. 두 벡터의 방향이 같을 수록 벡터들이 비슷하다고 간주한다.
* 코사인 값은 0도일 때 1로 가장 커지며, 두 벡터의 방향이 같을 경우 코사인 유사도는 1이 된다.
* 코사인 유사도는 추천 시스템에서 사용자간 취향의 유사한 정도를 계산할 때 쓰인다.
* 코사인 유사도를 사용하면 코사인 거리(cosine distance)를 계산할 수 있다.
연습문제
a, b, c, 3명의 사용자가 4개의 영화에 준 평점을 다음처럼 벡터로 표현하였다.
(1) a, b, c 사이의 유클리드 거리를 구하라. 어느 두 사용자가 가장 가까운가? 또 어느 두 사용자가 가장 멀리 떨어져 있는가?
import numpy as np
import itertools
def norm2(v):
result=0
for v_i in v:
result+=(v_i)**2
result=np.sqrt(result)
return result
def Euclid_dist(v1, v2):
norm2_v1=norm2(v1)
norm2_v2=norm2(v2)
v1_T=v1.T
result=norm2_v1**2 + norm2_v2**2 - 2*np.dot(v1_T, v2)
result=np.sqrt(result)
return result
a=np.array([4,5,2,2])
b=np.array([4,0,2,0])
c=np.array([2,2,0,1])
print('Euclidean distance between a,b :{}'.format(Euclid_dist(a,b)))
print('Euclidean distance between b,c :{}'.format(Euclid_dist(b,c)))
print('Euclidean distance between a,c :{}'.format(Euclid_dist(a,c)))
#Euclidean distance between a,b :5.385164807134504
#Euclidean distance between b,c :3.6055512754639896
#Euclidean distance between a,c :4.242640687119285
* 유클리드 거리에 의하면 b, c가 가장 가깝고, a, b가 가장 멀다.
(2) a, b, c 사이의 코사인 거리를 구하라. 어느 두 사용자가 가장 가까운가? 또 어느 두 사용자가 가장 멀리 떨어져 있는가?
def cos_sim(v1, v2):
numer=np.dot(v1.T, v2)
denom=norm2(v1) * norm2(v2)
result=numer / denom
return result
def cos_dist(v1, v2):
return 1 - cos_sim(v1, v2)
print('Cosine distance between a,b :{}'.format(cos_dist(a,b)))
print('Cosine distance between b,c :{}'.format(cos_dist(b,c)))
print('Cosine distance between a,c :{}'.format(cos_dist(a,c)))
#Cosine distance between a,b :0.36112343500006017
#Cosine distance between b,c :0.40371520600005606
#Cosine distance between a,c :0.04761904761904767
* cosine 유사도에 의하면 a,b가 가장 가깝고, a,c가 가장 멀다.
벡터의 분해와 성분
* 어떤 두 벡터 a, b의 합이 다른 벡터 c가 될 때 c가 두 성분(component) a,b로 분해(decomposition)된다고 말한다.
* c가 분해될 때의 두 성분을 이루는 벡터 a,b는 둘 중 한 벡터를 나머지 벡터가 가리키는 점으로 평행이동했을 때 최종적으로 가리키는 점이 C가 되는지 여부를 통해 찾아낼 수 있다.
투영성분과 직교성분
* 벡터 a를 다른 벡터 b에 평행한 성분(투영성분(projection), $a^{||b}$)과 벡터 b에 직교하는 성분(직교성분(rejection), $a^{\perp b}$)으로 분해할 수 있다.
* 투영성분의 길이는 다음처럼 구할 수 있다.
* 만약 벡터 b 자체가 이미 단위벡터이면, 단위벡터에 대한 투영길이는 내적이 된다.
* 투영성분 성분 벡터는 투영성분 길이와 벡터 b 방향의 단위벡터의 곱이다.
* 직교성분 벡터는 원래의 벡터에서 투영성분 벡터를 뺀 나머지이다.
연습 문제
1)
* 일 때, 투영성분 $a^{||b}$, 직교성분 $a^{\perp b}$를 구하라.
def len_vec(v):
result=v / norm2(v)
return result
def len_proj(v1, v2):
result=np.dot(v1.T, v2/norm2(v2))
return result
def proj_vec(v1, v2):
len_projection=len_proj(v1, v2)
len_vector=len_vec(v2)
result = np.dot(len_projection, len_vector)
return result
def rej_vec(v1, v2):
result = v1 - proj_vec(v1,v2)
return result
a = np.array([1, 2])
b = np.array([2, 0])
projection = proj_vec(a, b)
rejection = rej_vec(a, b)
print('projection vector : {}'.format(projection))
print('rejection vector : {}'.format(rejection))
#projection vector : [1. 0.]
#rejection vector : [0. 2.]
직선의 방정식
* 어떤 벡터 $w$가 있을 때
* 원점에서 출발한 벡터 $w$가 가리키는 점을 지나면서 벡터 $w$에 수직인 직선의 방정식은 다음과 같이 구한다.
* 두 조건을 만족하는 직선 상의 임의의 점을 가리키는 벡터를 x라고 했을 때, x가 가리키는 점과 w가 가리키는 점을 이은 벡터 x-w는 w와 직교하게 된다. 직교하는 두 벡터의 내적은 0이므로 다음과 같다.
* 위에서 도출된 방정식은 그림의 직선의 방정식과 같다. 이 직선과 원점 사이의 거리는 $||w||$이다.
* 이번엔 벡터 $w$가 가리키는 점을 지난다는 조건을 제거하고 벡터 $w$에 수직인 직선 x의 방정식을 구해보겠다.
* 직선은 $w$가 아닌 방향이 같고 길이가 다른 벡터 $w' = cw$를 지나게 될 것이다(c는 양의 실수이다).
* $c||w||^2$는 임의의 수(스칼라 값)가 될 수 있으므로 $w_0$으로 대체할 수 있다.
* 이 직선과 원점 사이의 거리는 다음과 같다.
직선과 점의 거리
* 직선 $w^T x - ||w||^2 = 0$과 이 직선 위에 있지 않은 점 $x'$ 사이의 거리를 구해보자.
* 벡터 $w$에 대한 벡터 $x'$의 투영성분 ${x'}^{||w}$의 길이는 다음과 같다.
* 직선과 점 x'사이의 거리는 투영성분 벡터의 길이에서 원점에서 직선까지의 거리 ||w||를 뺀 값의 절댓값이다.
* 만약 직선의 방정식이 $w^T x - w_0 = 0$이면 직선과 점의 거리는 다음과 같다.
* 이 공식은 추후 SVM에서 사용될 것이다(분류가 되는 기준선과 벡터간의 거리 계산에 쓰임).
'수학 > Numpy로 공부하는 선형대수' 카테고리의 다른 글
선형 연립방정식과 역행렬 (0) | 2021.11.18 |
---|---|
행렬의 성질 (0) | 2021.11.15 |
벡터와 행렬의 연산 (0) | 2021.11.12 |
데이터와 행렬 (0) | 2021.11.12 |