NumPy 배열을 단위 벡터로 정규화하는 방법 (Python, NumPy, scikit-learn 활용)
NumPy의 linalg.norm 함수 사용
NumPy의 linalg
서브 모듈에는 norm
함수가 포함되어 있으며, 이 함수를 사용하여 벡터의 노름(Norm)을 계산할 수 있습니다. 벡터의 노름은 벡터의 크기를 나타내는 값이며, 일반적으로 L2 노름을 사용합니다. L2 노름은 벡터의 각 성분을 제곱한 값을 모두 더한 후, 제곱근을 취한 값입니다.
import numpy as np
# 입력 벡터
a = np.array([1, 2, 3])
# L2 노름 계산
norm = np.linalg.norm(a)
# 단위 벡터 계산
b = a / norm
print(b) # 출력: [0.26726056 0.53452113 0.8017817]
위 코드에서 norm
은 벡터 a
의 L2 노름을 계산하고, b
는 벡터 a
를 노름 norm
으로 나누어 단위 벡터를 생성합니다.
scikit-learn의 preprocessing.normalize 함수 사용
scikit-learn 라이브러리에는 preprocessing
모듈이 포함되어 있으며, 이 모듈에는 벡터 정규화를 수행하는 normalize
함수가 포함되어 있습니다. normalize
함수는 입력 벡터를 L1, L2 또는 최대값 노름으로 정규화할 수 있습니다.
from sklearn.preprocessing import normalize
# 입력 벡터
a = np.array([1, 2, 3])
# L2 노름으로 정규화
b = normalize(a, norm='l2')
print(b) # 출력: [0.26726056 0.53452113 0.8017817]
위 코드에서 normalize
함수는 벡터 a
를 L2 노름으로 정규화하고, 결과를 b
에 저장합니다.
직접 계산
벡터를 단위 벡터로 정규화하는 수식은 다음과 같습니다.
b = a / np.sqrt(np.sum(a**2))
위 수식에서 a
는 입력 벡터이고, b
는 단위 벡터입니다. np.sqrt
는 제곱근 함수를 나타내고, np.sum
은 배열의 모든 요소를 합산하는 함수입니다.
선택 및 활용
위에서 소개된 세 가지 방법 모두 NumPy 배열을 단위 벡터로 정규화하는 데 유효합니다. 사용하는 방법은 개발자의 선호와 상황에 따라 다릅니다.
- 간단하고 빠른 방법을 원한다면
linalg.norm
함수를 사용하는 것이 좋습니다. - scikit-learn 라이브러리를 이미 사용하고 있다면
preprocessing.normalize
함수를 사용하는 것이 편리합니다. - 수식을 직접 사용하는 것은 더 명확하고 직관적이지만, 다른 방법들보다 느릴 수 있습니다.
추가 정보
예제 코드 (Python, NumPy, scikit-learn 활용)
NumPy의 linalg.norm 함수 사용
import numpy as np
def unit_vector(vector):
"""
NumPy의 `linalg.norm` 함수를 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
norm = np.linalg.norm(vector)
return vector / norm
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector(a)
print(b) # 출력: [0.26726056 0.53452113 0.8017817]
scikit-learn의 preprocessing.normalize 함수 사용
from sklearn.preprocessing import normalize
def unit_vector_sklearn(vector):
"""
scikit-learn의 `preprocessing.normalize` 함수를 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
return normalize(vector, norm='l2')
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector_sklearn(a)
print(b) # 출력: [0.26726056 0.53452113 0.8017817]
직접 계산
def unit_vector_manual(vector):
"""
수식을 직접 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
return vector / np.sqrt(np.sum(vector ** 2))
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector_manual(a)
print(b) # 출력: [0.26726056 0.53452113 0.8017817]
활용
추가 정보
NumPy 배열을 단위 벡터로 정규화하는 대체 방법 (Python, NumPy 활용)
최대값 노름 사용
최대값 노름은 벡터의 모든 요소 중 절대값이 가장 큰 값을 기준으로 정규화하는 방법입니다.
import numpy as np
def unit_vector_max(vector):
"""
최대값 노름을 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
norm = np.max(np.abs(vector))
return vector / norm
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector_max(a)
print(b) # 출력: [0.33333333 0.66666667 1.0]
Min-Max 스케일링 사용
Min-Max 스케일링은 벡터의 모든 요소를 0과 1 사이의 값으로 변환하는 방법입니다. 이를 통해 벡터의 각 요소가 동일한 범위에 속하도록 조정할 수 있습니다.
import numpy as np
def unit_vector_minmax(vector):
"""
Min-Max 스케일링을 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
min_val = np.min(vector)
max_val = np.max(vector)
return (vector - min_val) / (max_val - min_val)
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector_minmax(a)
print(b) # 출력: [0. 0.5 1.]
소프트맥스 함수 사용
소프트맥스 함수는 벡터의 각 요소에 지수 함수를 적용한 후 전체 요소의 합으로 나누는 함수입니다. 이를 통해 벡터의 모든 요소가 0과 1 사이의 값이 되고, 가장 큰 요소가 1에 가까운 값을 갖도록 변환됩니다.
import numpy as np
def unit_vector_softmax(vector):
"""
소프트맥스 함수를 사용하여 벡터를 단위 벡터로 변환합니다.
Args:
vector: 변환할 벡터 (NumPy 배열)
Returns:
단위 벡터 (NumPy 배열)
"""
e_x = np.exp(vector)
return e_x / np.sum(e_x)
# 입력 벡터
a = np.array([1, 2, 3])
# 단위 벡터 계산
b = unit_vector_softmax(a)
print(b) # 출력: [0.09072923 0.24982712 0.65944365]
선택 및 활용
위에서 소개된 방법들은 각각 장단점이 있습니다.
- 최대값 노름: 계산이 가장 간단하지만, 벡터의 방향 정보가 손실될 수 있습니다.
- Min-Max 스케일링: 벡터의 모든 요소가 동일한 범위에 속하도록 조정할 수 있지만, 데이터 분포에 따라 정확도가 떨어질 수 있습니다.
- 소프트맥스 함수: 가장 큰 요소가 1에 가까운 값을 갖도록 변환하지만, 계산 비용이 가장 높습니다.
따라서 사용하는 방법은 상황에 따라 적절하게 선택해야 합니다.
추가 정보
python numpy scikit-learn