Frobenius Norm 이란 무엇인가?
Frobenius Norm은 행렬의 크기를 측정하는데 사용하는 Norm으로 행렬의 모든 원소를 제곱한 값을 합한 다음 제곱근을 한 값으로 정의된다. 벡터의 L2 Norm(유클리드 놈)을 행렬에 적용한 형태이다. 수식은 다음과 같다.
$$\| X \|_F = \sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n} |x_{ij}|^2}$$
예를 들어 다음과 같은 행렬이 주어 졌을 때
$A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}$
Frobenius Norm은 다음과 같이 계산된다.
$\| A \|_F = \sqrt{1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2} = \sqrt{1 + 4 + 9 + 16 + 25 + 36} = \sqrt{91} \approx 9.54$
Numpy을 사용한 Frobenius Norm 계산
Numpy를 사용해 Frobenius Norm을 계산하려면 linalg.norm 함수의 첫째 값으로 행렬 X를 넘기고 두번째 인자로 "fro" 값을 넘기면 된다.
import numpy as np
# 행렬 정의
X = np.array([[1, 2, 3], [4, 5, 6]])
# 프로베니우스 놈 계산
frobenius_norm = np.linalg.norm(X, 'fro')
print("Frobenius Norm:", frobenius_norm)
혹은 linalg.norm 함수의 첫째 값으로 행렬 X만 넘겨도 된다.
frobenius_norm = np.linalg.norm(X)
코드 실행 결과는 다음과 같다.
Frobenius Norm: 9.539392014169456
TensorFlow를 사용한 Frobenius Norm 계산
TensorFlow를 사용해 Frobenius Norm을 계산하려면 tf.norm 함수를 사용하고, ord='euclidean'를 넘기면 된다.
import tensorflow as tf
# 행렬 정의
X = tf.constant([[1, 2, 3], [4, 5, 6]], dtype=tf.float32)
# 프로베니우스 놈 계산
frobenius_norm = tf.norm(X, ord='euclidean')
print("Frobenius Norm:", frobenius_norm.numpy())
혹은 tf.norm 함수에 X만 넘겨도 된다.
frobenius_norm = tf.norm(X)
코드 실행 결과는 다음과 같다.
Frobenius Norm: 9.539392
PyTorch를 사용한 Frobenius Norm 계산
PyTorch를 사용해 Frobenius Norm을 계산하려면 torch.norm 함수를 사용하고, p='fro'를 설정하면 된다.
import torch
# 행렬 정의
X = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
# 프로베니우스 놈 계산
frobenius_norm = torch.norm(X, p='fro')
print("Frobenius Norm:", frobenius_norm.item())
혹은 torch.norm 함수에 X만 넘겨도 된다.
frobenius_norm = torch.norm(X)
코드 실행 결과는 다음과 같다.
Frobenius Norm: 9.539392471313477
인자에 아무것도 안넘겨도 Frobenius Norm 이 나오는 이유는, Frobenius Norm 는 Tensor의 기본적인 크기를 구하는 Norm과 같은 방식으로 동작하기 때문이다.