벡터의 노름 계산은 인공지능과 양자 컴퓨팅에서 특징 스케일링, 정규화, 거리 메트릭, 수렴 기준, 양자 상태 표현, 연산의 단위성 보장, 오류 정정, 양자 알고리즘 및 회로 설계와 같은 작업에 필수적입니다.
유클리드 노름(norm/distance), 즉 L2 노름을 계산하는 방법을 배우게 될 것입니다. 이는 파이썬 라이브러리인 NumPy, SciPy, Scikit-Learn
, TensorFlow, PyTorch 등에서 단일 차원(1D) 텐서에 대해 수행할 수 있습니다.
Norm vs Distance 이해하기
시작하기 전에 유클리드 노름과 유클리드 거리의 차이점을 이해합시다.
- 노름은 원점(0,0)으로부터 벡터의 거리/길이/크기입니다.
- 거리는 두 벡터 사이의 거리/길이/크기입니다.
필수 사전 지식
- Jupyter 설치.
- 아래 코드를 Jupyter Notebook에서 실행하여 필수 요소를 설치하세요.
# 노트북을 실행하기 위한 필수 요소 설치
!pip install numpy
!pip install scipy
%pip install torch
!pip install tensorflow
Python 코드 셀을 실행하여 다양한 Python 라이브러리에서 L2 노름을 계산하기 위해 Jupyter Notebook을 사용할 것입니다.
시작하겠습니다
이제 Jupyter가 컴퓨터에 설정되고 필요한 Python 라이브러리가 설치되었으니, NumPy를 사용하여 1D 텐서를 정의하는 것으로 시작하겠습니다.
NumPy
NumPy는 과학 컴퓨팅을 위한 Python 라이브러리로, 다차원 배열 및 기타 유도된 객체를 제공합니다.
텐서 순위
# 단일 차원(1D) 텐서 정의
import numpy as np
vector1 = np.array([3,7]) #np.random.randint(1,5,2)
vector2 = np.array([5,2]) #np.random.randint(1,5,2)
print("Vector 1:",vector1)
print("Vector 2:",vector2)
print(f"shape & size of Vector1 & Vector2:", vector1.shape, vector1.size)
벡터 출력
Vector 1: [3 7]
Vector 2: [5 2]
shape & size of Vector1 & Vector2: (2,) 2
Matplotlib
Matplotlib는 정적, 애니메이션 및 대화형 시각화를 생성하기 위한 Python 시각화 라이브러리입니다. Matplotlib의 quiver
를 사용하여 벡터를 그릴 것입니다.
# Matplotlib을 사용하여 벡터 그리기
import matplotlib.pyplot as plt
%matplotlib inline
origin = np.array([0,0])
plt.quiver(*origin, vector1[0],vector1[1], angles='xy', color='r', scale_units='xy', scale=1)
plt.quiver(*origin, vector2[0],vector2[1], angles='xy', color='b', scale_units='xy', scale=1)
plt.plot([vector1[0],vector2[0]], [vector1[1],vector2[1]], 'go', linestyle="--")
plt.title('Vector Representation')
plt.xlim([0,10])
plt.ylim([0,10])
plt.grid()
plt.show()
Matplotlib을 사용한 벡터 표현
# 벡터의 L2(유클리드) 노름
# NumPy
norm1 = np.linalg.norm(vector1, ord=2)
print("The magnitude / distance from the origin",norm1)
norm2 = np.linalg.norm(vector2, ord=2)
print("The magnitude / distance from the origin",norm2)
이 코드를 Jupyter Notebook에서 실행한 결과:
The magnitude / distance from the origin 7.615773105863909
The magnitude / distance from the origin 5.385164807134504
SciPy
SciPy는 NumPy 위에 구축되어 수학적 계산을 위해 사용됩니다. 관찰할 수 있듯이 SciPy는 NumPy와 동일한 linalg
함수를 사용합니다.
# SciPy
import scipy
norm_vector1 = scipy.linalg.norm(vector1, ord=2)
print("L2 norm in scipy for vector1:", norm_vector1)
norm_vector2 = scipy.linalg.norm(vector2, ord=2)
print("L2 norm in scipy for vector2:", norm_vector2)
출력:
L2 norm in scipy for vector1: 7.615773105863909
L2 norm in scipy for vector2: 5.385164807134504
Scikit-Learn
문서에 따르면 Scikit-learn은 지도 및 비지도 학습을 지원하는 오픈 소스 머신 러닝 라이브러리입니다. 또한 모델 적합화, 데이터 전처리, 모델 선택, 모델 평가 등 다양한 도구를 제공합니다.
벡터를 2차원으로 재구성합니다.
Scikit-learn
은 벡터가 2차원이어야 한다고 기대합니다.
## Scikit-learn은 벡터가 2차원이어야 한다고 기대합니다
# Sklearn
from sklearn.metrics.pairwise import euclidean_distances
vector1_reshape = vector1.reshape(1,-1)
euclidean_distances(vector1_reshape, [[0, 0]])[0,0]
출력
7.615773105863909
TensorFlow
TensorFlow는 종단 간 머신 러닝 플랫폼입니다.
# TensorFlow
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
## Tensorflow는 float32, float64, complex64, complex128 타입의 텐서를 기대합니다
vector1_tf = vector1.astype(np.float64)
tf_norm = tf.norm(vector1_tf, ord=2)
print("Euclidean(l2) norm in TensorFlow:",tf_norm.numpy())
출력
출력은 TensorFlow 버전과 L2 노름을 출력합니다.
TensorFlow version: 2.15.0
Euclidean(l2) norm in TensorFlow: 7.615773105863909
PyTorch
PyTorch는 GPU 및 CPU를 사용하여 딥 러닝을 위한 최적화된 텐서 라이브러리입니다.
# PyTorch
import torch
print("PyTorch version:", torch.__version__)
norm_torch = torch.linalg.norm(torch.from_numpy(vector1_tf), ord=2)
norm_torch.item()
출력은 PyTorch 버전과 노름을 출력합니다.
PyTorch version: 2.1.2
7.615773105863909
유클리드 거리
유클리드 거리는 노름과 같은 방식으로 계산되지만, 벡터 간의 차이를 먼저 계산한 후 – vector_diff
라고 할 때, 각각의 라이브러리에 차이를 전달합니다.
# 벡터 간의 유클리드 거리
import math
vector_diff = vector1 - vector2
# 노름 사용
euclidean_distance = np.linalg.norm(vector_diff, ord=2)
print(euclidean_distance)
# 내적 사용
norm_dot = math.sqrt(np.dot(vector_diff.T,vector_diff))
print(norm_dot)
출력
넘파이 라이브러리의 norm 및 dot 함수를 사용한 출력:
5.385164807134504
5.385164807134504
# SciPy
from scipy.spatial import distance
distance.euclidean(vector1,vector2)
SciPy를 사용한 출력
5.385164807134504
출력이 포함된 Jupyter Notebook은 GitHub 저장소에서 이용할 수 있습니다. GitHub 저장소의 지침을 따라 Colab에서 Jupyter Notebook을 실행할 수 있습니다.
Source:
https://dzone.com/articles/norm-of-a-one-dimensional-tensor-in-python-libraries