Vector
- 숫자의 한 줄 배열 (1D array), 크기와 방향을 가짐
- Vector space를 이루는 단위원소
- 여러 개의 숫자를 한줄로 배열한 것
- Element(원소): 벡터를 구성하고 있는 각 숫자
- 종벡터, 횡벡터
- Scalar: 숫자 하나(실수)
- Matrix: 숫자의 사각형 형태의 배열 (2D array) - 직사각형 그리드
Vector의 기하학적 의미(공간에서의 의미)
- 하나의 vector는 N 차원 공간 상의 위치를 가짐
- 벡터의 차원: 벡터에 포함된 원소의 수 e.g. n차원 벡터 = n개의 원소 수
- e.g. 2차원 공간의 벡터 = 2차원 공간의 한점 (1, 2)
- 차원 공간에서의 vector의 위치는 vector의 원소값에 의해 결정
- 벡터 원소 값은 해당 벡터의 고유한 특성을 의미 = 벡터의 공간상에서의 위치는 해당 벡터의 고유한 특성을 반영
- 차원 공간에서의 vector의 위치 정보를 사용해서 벡터 간의 유사도 계산 가능
- 차원 공간에서의 vector의 위치 정보를 사용해 vector 간의 유사도 계산 가능
- 비슷한 위치 = 높은 유사도 = 유사한 특성
- 위치가 비슷한 정도는 거리로 계산
- 유클리디안 거리(초록색 선), 코사인 유사도 등 사용
유클리디안(초록)/ 맨해튼 거리(초록 외 모두) - 벡터의 길이/크기 (원점으로부터의 거리): v1 = np.linalg.norm(v1)
- 두 벡터 사이의 거리: v1v2 = np.linalg.norm(v2-v1)
- 유클리디안 거리(초록색 선), 코사인 유사도 등 사용
- Norm
- 벡터의 크기(magnitude) 또는 길이(length)를 측정하는 방법
- 벡터를 구성하는 성분의 값에 기반하여 그 벡터가 얼마나 큰지를 나타내는 수치적인 방법
- 벡터가 원점으로부터 얼마나 떨어져있는지를 측정하는 수단
- L1 norm: 각 벡터의 각 성분의 절대값의 합으로 계산 = 두점 사이의 거리를 격자와 같은 metric에서 직각으로만 이동한 거리 - 맨해튼 거리
- L2 norm: 직선거리 - 유클리디안
- 유사도 = 벡터간의 거리 (방향성 기준)
- 원점을 기준으로 함(원점에서의 방향)
- 원점에서 벡터의 끝점까지 연장되는 선(길이와 무관)
- 벡터의 위치는 벡터의 원소의 값에 의해서 결정: 벡터의 고유한 특성을 반영
- 방향이 비슷함 = 유사도가 높다
- 두 벡터의 방향의 유사도는 사이각을 이용하여 표현
- Cosine 함수를 통해 표현 (1: 가장 가까움 -1: 가장 먼 거)
- cosine_similarity(a,b)=∥a∥∥b∥a⋅b
- Dot product을 이용한 유사도 구하기 (dot prodcut)
x=(x1, x2), y=(y1, y2) xy거리=x1*y1 + y1*y2 - e.g. a = [1, 2], b = [2, 2]
실습) Vector 구하기
Vectorization (문서의 벡터 표현)
- 자연어 처리에서 문서를 수치적인 형태로 변환하는 과정을 의미
- 주로 단어의 빈도수를 기반으로 하며, 각 문서는 단어의 집합을 고유한 벡터로 표현하여 컴퓨터가 이해할 수 있는 형태로 변환
- 각 문서를 문서에 사용된 단어들로 구성이 된 vector로 표현
- 정보 검색, 문서 분류, 감성 분석 등 다양한 자연어 처리 작업에서 활용
-
- Bag-of-Words (BoW) 모델
- 가장 간단하고 기본적인 문서의 벡터 표현 방법
- 단어 집합 구축: 문서에 있는 모든 단어들을 중복을 허용하지 않고 모아서 단어 집합을 구현
- 벡터 생성: 각 문서에서 단어가 나타나는 빈도수를 기록한 벡터를 생성. 벡터의 각 차원은 단어 집합에 있는 각 단어에 해당하며, 해당 문서에서 단어가 나타나는 횟수를 값으로 가짐
- e.g. "This is a cat"이라는 문장이 있다면, 단어 집합은 {"this", "is", "a", "cat"}이 되고, 이 문장은 [1, 1, 1, 1] 벡터로 표현
- TF-IDF (Term Frequency-Inverse Document Frequency)
- 단어의 빈도와 역 문서 빈도를 고려하여 문서를 벡터로 표현하는 방법
- 단순 빈도수만을 고려하는 BoW보다 문서의 특성을 더 잘 반영할 수 있음
- 단어의 빈도 (TF): 문서에 단어가 얼마나 자주 등장하는지를 나타냄
- 역 문서 빈도 (IDF): 특정 단어가 다른 문서에서 얼마나 일반적으로 등장하는지를 나타냄. IDF는 특정 단어가 문서의 특성을 나타내는 정도를 측정하는 데 사용됨
- TF-IDF: TF와 IDF를 곱해서 얻는 값으로, 각 문서에서 각 단어의 중요도를 반영하는 가중치를 제공
- 이 방법은 일반적으로 BoW보다 문서의 특징을 더 잘 반영할 수 있으며, 정보 검색이나 문서 분류에서 효과적으로 사용됨
- Word Embeddings (단어 임베딩)
- Word Embeddings은 단어를 고차원 공간에 벡터로 표현하는 방법
- 단어 간의 의미적 유사성을 포착할 수 있도록 설계
- Word2Vec, GloVe, FastText 등의 방법을 사용하여 단어를 벡터로 변환할 수 있음
- 문서의 벡터 표현을 구축할 때는 보통 문서에 포함된 단어들의 임베딩 벡터를 평균하거나 합산하여 문서 벡터를 생성하는 방법이 사용될 수 있음
- 사용예시
- 정보 검색: 문서 간의 유사성을 판별하거나 검색 쿼리와의 일치도를 평가할 때 사용
- 문서 분류: 문서의 내용을 기반으로 문서를 분류할 때 사용
- 텍스트 요약: 문서의 중요한 부분을 추출하거나 요약할 때 사용방법
- Bag-of-Words (BoW) 모델
실습) Vectorization 구하기
import numpy as np
import pandas as pd
# 문서 집합에서 단어의 빈도를 기반으로 문서-단어 행렬(Document-Term Matrix, DTM)을 생성
from sklearn.feature_extraction.text import CountVectorizer # frequency based DTM
# TF-IDF (Term Frequency-Inverse Document Frequency) 기반의 문서-단어 행렬(DTM)을 생성
from sklearn.feature_extraction.text import TfidfVectorizer # tf-idf based DTM
Vectorization in Deep Learning
딥러닝에서 벡터화는 데이터를 신경망이 처리할 수 있는 숫자 형식으로 변환하는 과정을 의미합니다. 이는 텍스트, 이미지, 시계열 데이터와 같은 다양한 유형의 데이터를 처리할 때 필수적인 단계입니다. 신경망은 숫자 데이터를 필요로 하기 때문에, 벡터화는 이러한 데이터를 숫자 형식으로 변환하는 방법
- 숫자 표현:
- 신경망은 숫자 데이터를 처리합니다. 따라서 텍스트나 범주형 변수와 같은 비숫자 데이터는 반드시 숫자 형식으로 변환되어야 합니다.
- 특징 벡터:
- 특징 벡터는 어떤 객체를 나타내는 n차원의 숫자 특징 벡터입니다. 딥러닝에서는 이 객체가 이미지, 텍스트, 오디오 등의 데이터일 수 있습니다.
- 토큰(Token): 자연어 처리에서 텍스트를 나누는 최소 단위
- 토큰화(Tokenization)
- 텍스트를 토큰(단어별)으로 나누는 과정
- 텍스트를 단어, 문장, 형태소 등의 특정 단위로 분리하거나 변환하는 작업을 포함
- 자연어 처리 작업에서 매우 중요한 전처리 과정이며, 정확한 토큰화가 모델의 성능에 큰 영향을 미칠 수 있음
- 벡터화(Vectorization)
- 단어를 추출하여 수치화
- 토큰화 된 텍스트를 숫자의 형태(벡터)로 변환하는 과정
-
-
- 텍스트 데이터:
- 원-핫 인코딩: 각 단어를 고유한 벡터로 변환. 벡터는 단어 집합의 크기와 같은 차원을 가지며, 단어에 해당하는 위치는 1, 나머지는 0으로 표시.
- TF-IDF: 문서에서 단어의 빈도와 문서 간의 중요도를 반영한 벡터화 방법.
- Word Embeddings: 단어를 고차원 공간의 밀집 벡터로 변환. 예를 들어, Word2Vec, GloVe, BERT 등이 있으며, 단어 간의 의미적 유사성을 반영.
- 이미지 데이터:
- 이미지의 각 픽셀 값을 숫자 값으로 표현.
- 이미지의 각 채널(RGB 등)을 포함한 2D 또는 3D 배열로 변환.
- 시계열 데이터:
- 시간에 따른 값의 변화 패턴을 벡터화. 각 시점의 값을 연속적인 숫자 벡터로 표현.벡터화 방법
- 텍스트 데이터:
-
실습) 1, 2(Iris)
코드 예시
# 필요한 라이브러리들을 임포트합니다.
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1. 데이터 준비
# 간단한 예제로 문서와 레이블(카테고리)을 준비합니다.
documents = [
"I love apples",
"I hate bananas",
"I love oranges",
"I hate apples",
"I love bananas"
]
labels = [1, 0, 1, 0, 1] # 1: 긍정, 0: 부정
# 2. 벡터화
# TF-IDF 벡터라이저를 사용하여 텍스트 데이터를 수치형 데이터로 변환합니다.
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents) # 문서들을 벡터화합니다.
y = np.array(labels) # 레이블을 넘파이 배열로 변환합니다.
# 3. 데이터 분할
# 데이터를 학습용(train)과 테스트용(test)으로 나눕니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. 모델 학습
# 로지스틱 회귀 모델을 학습시킵니다.
model = LogisticRegression()
model.fit(X_train, y_train)
# 5. 모델 평가
# 학습된 모델을 사용하여 테스트 데이터의 성능을 평가합니다.
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy * 100:.2f}%')
# 추가: 새로운 문서 분류
# 학습된 모델을 사용하여 새로운 문서를 분류합니다.
new_document = ["I love fruits"]
new_vector = vectorizer.transform(new_document) # 새로운 문서를 벡터화합니다.
new_pred = model.predict(new_vector)
print(f'Prediction for new document: {"Positive" if new_pred[0] == 1 else "Negative"}')