본문 바로가기
Python/선형대수

(1)벡터

by 지식광부키우기 2019. 8. 26.

 

벡터?

 

벡터란 어떤 유한한 차원의 공간에 존재하는 점들입니다.

 

키, 몸무게, 나이에 대한 데이터가 주어졌다면 이 데이터를 3차원 데이터로 표현 가능합니다.

 

벡터를 가장 간단하게 표현하는 방법은 숫자로 구성된 list로 표현하는 것입니다.

예를 들어, 3차원 벡터는 세 개의 숫자로 구성된 list로 표현할 수 있습니다.

height_weight_age = [70,      # 인치
                    170,      # 파운드
                     40 ]     # 나이

 

list로 벡터를 표현하는 방법의 문제점은 list를 통해 벡터 연산을 할 수 없다는 점입니다.

 

두 개의 벡터를 더하는 함수를 만들어 보겠습니다.

def vector_add(v, w):
    """각 성분끼리 더한다"""
    return [v_i + w_i for v_i, w_i in zip(v,w)]

 

뺄셈도 비슷합니다.

def vector_subtract(v, w):
    """각 성분끼리 뺀다"""
    return [v_i - w_i for v_i, w_i in zip(v,w)]

 

list에서 모든 벡터의 각 성분을 더하고 싶은 경우 

reduce를 사용해서 구할 수 있습니다. 

def vector_sum(vectors):
    return reduce(vector_add, vectors)

 

벡터의 스칼라 곱셈입니다.

def scalar_multiply(c, v):
    return [c * v_i for v_i in v]

 

같은 길이의 벡터로 구성된 list 주어졌을 때 각 성분별 평균 구하기

def vector_mean(vectors):
    """i번째 성분이 입력된 벡터의 i번째 성분의 평균을
    의미하는 벡터를 게산해준다"""
    n = len(vectors)
    return scalar_multiply(1/n, vector_sum(vectors))

 

벡터의 내적 

내적은 벡터 v가 벡터 w 방향으로 얼마나 멀리 뻗어 나가는지를 나타냅니다. 

다른 관점에서 보면 v가 w로 투영된 벡터의 길이를 나타냅니다. 

def dot(v, w):
    """v_1 * w_1 + ... + v_n * w_n"""
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

 

내적의 개념을 사용하면, 각 성분의 제곱 값의 합을 쉽게 구할 수 있습니다.

def sum_of_squares(v):
    """v_1 * v_1 + ... + v_n * v_n"""
    return dot(v, v)

 

제곱 값의 합을 이용하면 벡터의 크기를 계산할 수 있습니다. 

def magnitude(v):
    return math.sqrt(sum_of_squares(v))

 

두 벡터 간의 거리 계산

def squared_distance(v, w):
    return sum_of_squares(vector_subtract(v, w))
def distance(v, w):
   return math.sqrt(squared_distance(v, w))

 

더 깔끔하게 쓰려면

def distance(v, w):
   return magnitude(vector_subtract(v, w)

 

위의 표현된 코드는 벡터의 원리를 설명하는 데 굉장히 편리하지만 성능면에서 끔찍하다. 

 

Numpy 라이브러리를 활용하도록 하자. 

댓글