ML study

[네이버AI class] 3주차 (1) - 벡터

mlslly 2024. 5. 16. 23:31

벡터  (Vector)

 

벡터의 개념

 

벡터란 숫자를 원소로 가지는 리스트 또는 배열. 

가로로 배열되면 행벡터, 세로로 배열되면 열벡터로 불리며,  벡터 안에 요소의 수가 곧 '벡터의 차원'이 된다.

 

벡터는 '공간에서의 한 점'을 나타낸다.

- 1차원 벡터 : 1차원 공간 (x축) '수직선 상의 한 점'을 의미 (스칼라)

- 2차원 벡터 :  2차원 공간 (x축, y축)  '좌표평면 상의 한 점'을 의미 (x,y) 

- 3차원 벡터 : 3차원 공간 (x축, y축, z축) '공간 상의 한 점'을 의미 (x,y,z) 

- n차원 벡터 : n차원 공간 (.... n개의 축) 'n차원 공간 상의 한 점'을 의미

 

벡터는 원점으로부터의 '상대적 위치'를 표현한다 

아래 그림처럼 점, 화살표가 달린 선으로 시각화 할 수 있듯이 벡터는 길이, 방향을 가진다.

벡터에 숫자를 곱해주면 '길이, 방향 변화' 한다. == 스칼라곱 

스칼라곱에서 곱해주는 값이 1보다 크면 길이가 증가, 1보다 작으면 길이가 감소한다.

스칼라곱에서 곱해주는 값이 0보다 크면 방향이 그대로, 0보다 작으면 방향이 반대가 된다.

https://mathinsight.org/vector_introduction

 

 

 

벡터의 Norm

 

벡터의 원점으로부터의 거리를 '벡터의 노름Norm'이라고 한다

X의 Norm은 X의 L1 norm과 L2 norm 등 다양한 종류의 norm이 있다.

Norm은 특정한 1차원, 2차원.. 등에서 성립하는 것이 아니라 임의의 차원 d에 대해서 성립하는 개념이다.

따라서 벡터의 Norm 또한, 벡터의 차원과 상관없이 (벡터의 구성 성분의 개수와 상관없이) 성립 및 계산 가능한 개념이다.

벡터의 Norm에는 다양한 종류가 있으며, 대표적으로 L1 노름과 L2 노름이 있다. 

 

L1 노름Norm은 각 성분의 '변화량의 절대값'을 모두 더한 값이다. (맨해튼 distance)

이는 좌표평면에서 각 좌표축을 따라 움직이는 좌표간 이동간 거리로 볼 수 있다.  x축에 따라 움직인 값과, y축에 따라 움직인 값을 서로 더해준 값과 같다.

 

L2 노름Norm은 원점에서부터 x의 벡터까지 피타고라스 정리를 이용해 '이동한 거리 값'이다 (유클리드 distance)

L2 노름은 피타고라스 정리에 의해서, (x축의 이동한 거리의 절대값의 제곱 + y축 이동한 거리의 절대값의 제곱) **2로 계산된다.

2차원 좌표평면에서 뿐 아니라 d차원 좌표평면에서의 Norm도 정의할 수 있다.

 

파이썬 코드로 L1, L2 노름 구하는 코드는 아래와 같다.

import numpy as np

# L1 norm 함수
def l1_norm(vector):
    return np.sum(np.abs(vector))

# L2 norm 함수
def l2_norm(vector):
    return np.sqrt(np.sum(np.square(vector)))

# 사용 예제
vector = np.array([1, 2, 3, 4, 5])
print(f"l1 노름: {l1_norm(vector)}")
print(f"l2 노름: {l2_norm(vector)}")

 

두 벡터 사이의 거리를 구하는 경우 아래와 같이 구한다.

import numpy as np

def l1_norm(a, b):
    return np.sum(np.abs(a - b))

def l2_norm(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

# 두 벡터 예시
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# L1 노름 계산
l1_distance = l1_norm(a, b)
print("L1 노름 (맨해튼 거리):", l1_distance)

# L2 노름 계산
l2_distance = l2_norm(a, b)
print("L2 노름 (유클리드 거리):", l2_distance)

 

Norm의 종류에 따라, 공간상에서 표현되는 기하학적 성질이 매우 달라진다.

아래 그림에서, L1 norm의 거리를 표현하면 마름모 꼴로, L2 norm의 거리를 표현하면 원형이 된다. (원점으로부터의 거리) 

서로 다른 norm을 사용하면 거리의 개념도 달라지는데, 같은 좌표평면을 사용하더라도 norm을 표현하는 기하학적 성질이 달라지는 것.

이렇게 Norm의 차이는 머신러닝에서 서로 다른 목적의 학습 및 정규화, 최적화 방법으로 활용되므로,

Norm별 차이를 인지하고 비교하여 활용할 수 있어야 함.

  • L1 Norm : Robust 학습, Lasso 회귀 등 방법론에 활용
  • L2 Norm : Laplace 근사, Ridge 회귀 등 방법론에 활용

https://junklee.tistory.com/29

 

벡터의 연산 

 

벡터간 연산으로 같은 모양을 가지는 벡터끼리는 덧셈, 뺄셈, 곱셈(성분곱) 등을 계산할 수 있다

(성분곱 : Hadamard product, 같은 위치의 원소끼리 연산하면됨)

벡터끼리 연산할때는 벡터의 차원, 모양이 중요함

 

벡터의 덧셈, 뺄셈 : 두 벡터의 덧셈 및 뺄셈은 다른 벡터로부터 더해지는(빼지는) 벡터만큼의 '상대적인 위치 이동'이다 

https://tikz.net/vector_sum/

 

 

두 벡터 사이의 거리 & 각도 구하기

 

'두 벡터 사이의 거리'를 구하는 것은 뺄셈 개념으로, L1, L2 Norm을 모두 이용 가능하다.

언급했듯이 L1, L2 Norm 은 각각 거리 개념이 달라지기 때문에, 두 벡터간 거리를 구하는 뺄셈도 달라진다. 

뺄셈은 상대적 위치를 반대로 이동하는 것이므로, y라는 벡터에서 -x 만큼 이동하는 개념과 같다.

x-y 한 거리와, y-x한 두 벡터 사이의 거리는 서로 같다.

http://matrix.skku.ac.kr/M-calculus/W2/

 

'두 벡터 사이의 각도'를 구하는 것은 코사인 법칙에 의한 것으로 L2 Norm만 이용 가능하다.

유클리드 거리를 이용해서 두 벡터 사이의 거리를 계산할 수 있다면, 제2 코사인 법칙에 의해서 두 벡터 사이의 각도도 구할 수 있다.  

2차원, 3차원에서 뿐이 아니라, d차원에서도 두 벡터 사이의 각도를 구할 수 있다. 

 

각도 계산시에 아래 식에서 분자를 쉽게 계산하는 방법이 내적이다 (inner product) :

내적이란 벡터들의 연산의 성분 곱을 취한 뒤, 성분을곱을한 모든 벡터들을 더해주는 연산.

각도 계산시 내적 연산과 L2 Norm을 활용해서 구할 수 있다.

아래는 두 벡터간의 각도를 구하는 파이썬 코드이다.

import numpy as np

def angle_between_vectors(a, b):
    # 내적 계산
    dot_product = np.dot(a, b)
    
    # 벡터의 크기(노름) 계산 : L2
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    
    # 코사인 값 계산
    cos_theta = dot_product / (norm_a * norm_b)
    
    # 값의 범위를 [-1, 1]로 제한하여 수치적 안정성을 확보
    cos_theta = np.clip(cos_theta, -1.0, 1.0)
    
    # 각도 계산 (라디안 단위)
    theta = np.arccos(cos_theta)
    
    return theta

# 예제 벡터
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 각도 계산
theta = angle_between_vectors(a, b)
print(f'두 벡터 사이의 각도 (라디안): {theta}')
# print(f'두 벡터 사이의 각도 (도): {np.degrees(theta)}')

https://velog.io/@ysw2946/1.-Vector

 

추가적으로, 내적은 새로운 벡터가 아니라 정사영된 벡터의 길이와 관련이 있다.

내적은 정사영의 길이를 벡터 y의 길이만큼 조정한 값이다. 

내적은 두 벡터 사이의 유사도를 측정시 많이 사용한다.

머신러닝에서, 두 값이 얼마나 유사한가, 얼마나 비슷한 패턴을 가지고 있는가를 비교할 때 두 벡터의 내적을 측정함으로써 두 벡터가 얼마나 유사한지를 측정한다.

 

 

 

 

 

 

 


* 참고 자료 

https://medium.com/linear-algebra-basics/vector-basic-operations-5f084ecee391

 

Vector & basic operations

What is a vector

medium.com

https://junklee.tistory.com/29

 

L1, L2 Norm, Loss, Regularization?

정규화 관련 용어로 자주 등장하는 L1, L2 정규화(Regularization)입니다. 이번에는 단순하게 이게 더 좋다 나쁘다보다도, L1, L2 그 자체가 어떤 의미인지 짚어보고자합니다. 사용된 그림은 위키피디아

junklee.tistory.com