벡터 공간은 수학적 좌표 공간을 떠올리면 이해하기 쉬워. 우리가 2차원 좌표 평면을 배울 때, X축과 Y축이 있고 그 안에 점을 찍을 수 있잖아? 벡터 공간도 비슷해. 여기서 각 점은 하나의 벡터야, 벡터는 방향과 크기를 가진 화살표 같은 거야.
벡터 공간이란?
- 벡터는 어떤 "위치"를 나타내는 것이 아니라, "방향"과 "크기"를 나타내는 수학적인 도구야. 예를 들어, 고양이와 강아지처럼 서로 비슷한 것들은 벡터 공간에서 가까운 위치에 놓이고, 고양이와 자동차처럼 서로 관련이 없는 것들은 멀리 떨어져 있어.
- 벡터 공간은 여러 개의 벡터가 모여 있는 공간이라고 생각하면 돼. 컴퓨터는 이 공간 안에서 벡터들의 위치를 보고 그들 간의 관계를 이해해.
예시로 설명
- 예를 들어, "고양이"라는 단어와 "강아지"라는 단어가 있어. 이 두 단어는 실제로는 다르지만 의미상으로는 비슷하지? 그래서 벡터 공간에서는 두 단어를 가까운 위치에 놓아. 반면에, "고양이"와 "자동차"처럼 전혀 다른 것들은 벡터 공간에서 멀리 떨어져 있어.
- 컴퓨터는 이 벡터들의 위치를 바탕으로, "이 단어들은 비슷하구나" 또는 "이건 서로 다른 것들이구나"라고 이해해.
어떻게 사용될까?
이 벡터 공간의 개념은 자연어 처리(NLP)에서 많이 사용돼. 컴퓨터가 글을 이해하려면, 단어나 문장처럼 언어의 의미를 숫자로 바꿔야 해. 이때 단어들을 벡터로 바꿔서, 같은 공간 안에 배치한 다음 서로의 관계를 이해하는 거야. 비슷한 단어는 가까이 놓고, 다른 단어는 멀리 놓는 식으로 말이야.
간단 정리
- 벡터는 방향과 크기를 가진 수학적인 도구.
- 벡터 공간은 여러 벡터가 모인 공간으로, 벡터들 간의 거리로 비슷함과 다름을 나타냄.
- 컴퓨터가 단어 간의 관계를 이해할 때, 비슷한 단어는 가깝게, 다른 단어는 멀리 배치함.
벡터 공간은 컴퓨터가 단어들 간의 관계를 숫자로 표현할 수 있는 아주 중요한 방법이야!
1. 2D/3D 좌표에서의 벡터
벡터는 크기와 방향을 가진 값을 말해요. 프로그래밍에서 2D 또는 3D 그래픽을 다룰 때, 벡터는 좌표나 이동을 표현하는 데 많이 사용됩니다. 예를 들어, 게임 프로그래밍에서 객체의 위치나 이동 속도를 벡터로 나타낼 수 있어요.
2D 벡터 예시:
# 2D 벡터 클래스 정의
class Vector2D:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self, other):
return Vector2D(self.x + other.x, self.y + other.y)
def magnitude(self):
return (self.x**2 + self.y**2)**0.5
def __repr__(self):
return f"Vector2D({self.x}, {self.y})"
# 벡터 정의
v1 = Vector2D(3, 4)
v2 = Vector2D(1, 2)
# 벡터 더하기
v3 = v1.add(v2)
print(v3) # 출력: Vector2D(4, 6)
# 벡터의 크기 계산
print(v1.magnitude()) # 출력: 5.0 (3-4-5 삼각형의 피타고라스 정리)
- 여기서 Vector2D(3, 4)는 (3, 4)라는 좌표를 나타내는 2D 벡터입니다.
- 벡터의 크기는 √(x^2 + y^2)로 계산되며, 여기서는 5.0입니다.
3D 벡터 예시:
# 3D 벡터 클래스 정의
class Vector3D:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def add(self, other):
return Vector3D(self.x + other.x, self.y + other.y, self.z + other.z)
def magnitude(self):
return (self.x**2 + self.y**2 + self.z**2)**0.5
def __repr__(self):
return f"Vector3D({self.x}, {self.y}, {self.z})"
# 벡터 정의
v1 = Vector3D(1, 2, 3)
v2 = Vector3D(4, 5, 6)
# 벡터 더하기
v3 = v1.add(v2)
print(v3) # 출력: Vector3D(5, 7, 9)
# 벡터의 크기 계산
print(v1.magnitude()) # 출력: 3.7416573867739413
- Vector3D(1, 2, 3)는 3D 공간에서 (1, 2, 3) 좌표에 있는 벡터를 나타냅니다.
- 벡터의 크기(길이)는 √(x^2 + y^2 + z^2)로 계산됩니다.
2. 머신 러닝에서의 벡터
머신 러닝에서는 데이터를 벡터로 표현하여, 모델이 숫자로 데이터를 처리할 수 있게 합니다. 예를 들어, 자연어 처리(NLP)에서 단어 임베딩을 벡터로 표현할 수 있습니다. 각 단어는 고유한 벡터로 변환되며, 이 벡터는 단어 간의 의미적 관계를 담고 있어요.
예시: 간단한 단어 임베딩
from sklearn.feature_extraction.text import CountVectorizer
# 문장 리스트
sentences = ["I love programming", "Python is awesome", "I love Python"]
# 단어들을 벡터로 변환
vectorizer = CountVectorizer()
vector = vectorizer.fit_transform(sentences)
# 단어별 벡터 출력
print(vector.toarray())
print(vectorizer.get_feature_names_out())
결과:
[[1 0 1 0 1]
[0 1 0 1 0]
[1 0 1 1 1]]
['awesome' 'is' 'love' 'programming' 'python']
- 여기서 각 문장은 단어들로 이루어진 벡터로 변환됩니다. 예를 들어, 첫 번째 문장 "I love programming"은 [1, 0, 1, 0, 1]로 나타나는데, 각 숫자는 특정 단어가 그 문장에 있는지 여부를 나타냅니다.
- 단어들이 숫자 벡터로 변환되어 머신 러닝 모델이 처리할 수 있게 됩니다.
3. 추천 시스템에서의 벡터
추천 시스템에서도 사용자와 아이템(상품 등)을 벡터로 변환하여 유사한 벡터끼리 매칭하는 방식으로 작동합니다.
사용자 및 아이템 벡터 예시:
import numpy as np
# 사용자를 3차원 벡터로 표현 (취향, 행동 패턴 등)
user_vector = np.array([0.2, 0.7, 0.3])
# 아이템을 3차원 벡터로 표현 (카테고리, 특성 등)
item_vector_1 = np.array([0.3, 0.8, 0.4])
item_vector_2 = np.array([0.1, 0.2, 0.1])
# 벡터 간 유사도를 계산 (코사인 유사도)
similarity_1 = np.dot(user_vector, item_vector_1) / (np.linalg.norm(user_vector) * np.linalg.norm(item_vector_1))
similarity_2 = np.dot(user_vector, item_vector_2) / (np.linalg.norm(user_vector) * np.linalg.norm(item_vector_2))
print(f"Item 1과의 유사도: {similarity_1}")
print(f"Item 2과의 유사도: {similarity_2}")
- user_vector는 사용자의 취향을 나타내는 벡터고, item_vector는 상품의 특성을 나타냅니다.
- 코사인 유사도를 계산해 사용자와 상품 간의 유사도를 구해, 어느 상품이 사용자에게 더 적합한지 확인할 수 있습니다.
정리:
- 2D/3D 벡터는 그래픽에서 좌표나 이동을 표현하는 데 사용됩니다.
- 머신 러닝에서의 벡터는 데이터를 수치화해 모델이 처리할 수 있도록 하는 방법입니다.
- 추천 시스템에서는 사용자와 아이템을 벡터로 표현해 유사도를 계산하고, 맞춤형 추천을 제공합니다.
'AI ( Artificial Intelligence )' 카테고리의 다른 글
Document Loader (4) | 2024.10.23 |
---|---|
Retrieval-Augmented Generation (RAG) (1) | 2024.10.22 |
임베딩(Embedding) (4) | 2024.10.17 |
Few Shot Learning (3) | 2024.10.16 |
Prompt ( 프롬프트 ) (0) | 2024.10.14 |