벡터?
벡터란 어떤 유한한 차원의 공간에 존재하는 점들입니다.
키, 몸무게, 나이에 대한 데이터가 주어졌다면 이 데이터를 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 라이브러리를 활용하도록 하자.
댓글