본문 바로가기
수학/Numpy로 공부하는 선형대수

선형대수와 해석기하의 기초

by 대소기 2021. 11. 22.

벡터의 기하학적 의미

* 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에 가까워진다.

https://elwlsek.tistory.com/1185

직교(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