파이썬 넘파이 벡터 norm, 정규화 함수 : np.linalg.norm()
안녕하세요.
이번 포스팅에서는 파이썬 넘파이 라이브러리에서
벡터의 norm을 구하거나 벡터를 정규화할 때 유용하게 사용 가능한
np.linalg.norm() 혹은 LA.norm() 함수의 사용법에 대해서
살펴보도록 하겠습니다.
먼저 가장 기본적인 사용법은 아래와 같습니다.
default로는 2-norm(혹은 frobenius norm)을 기준으로 구하게 됩니다.
numpy 라이브러리 혹은 numpy 라이브러리 내 linalg 라이브러리를
import하는 형태에 따라, np.linalg.norm 혹은 LA.norm 형태로 사용 가능합니다.
# 가능한 import 형태
import numpy as np
import numpy.linalg as LA
a = np.array([1, 3, 5, 7])
# 9.16515138991168 결과 동일(import 형태에 따라 다른 사용법)
np.linalg.norm(a)
LA.norm(a)
LA.norm 함수 norm 지정하기
2-norm이 아닌 다른 norm의 값을 구하고 싶은 경우,
두 번째 인자로 벡터의 norm의 값을 지정해주면 됩니다.
1, 2 등 정수 형태나, np.inf로 무한대의 값을 지정할 수 있습니다.
a = np.array([1, 3, 5, 7])
# 1-norm
np.linalg.norm(a, 1) # 16.0
# 2-norm(frobenius norm)
np.linalg.norm(a, 2) # 9.16515138991168
# infinity-norm
np.linalg.norm(a, np.inf) # 7.0
각 norm 형태의 계산 방법은 아래 식을 참조하시면 되실 듯 합니다.
참고로, 넘파이 라이브러리의 norm 함수에서는 음수 형태의 norm이라는
특수 형태도 지원하고 있습니다.
여기서는 음수 형태의 norm에 대한 설명은 생략하도록 하겠습니다.
np.linalg.norm 함수로 넘파이 벡터 정규화 하기
각 벡터를 계산된 norm 값으로 나누면 해당 norm 기준 정규화가 가능합니다.
아래는 벡터를 각가 2-norm과 1-norm으로 정규화한 예시입니다.
a = np.array([1, 3, 5, 7])
# 2-norm 정규화
a / LA.norm(a) # array([0.10910895, 0.32732684, 0.54554473, 0.76376262])
# 1-norm 정규화
a / LA.norm(a, 1) # array([0.0625, 0.1875, 0.3125, 0.4375])
정규화의 원리를 간단히 식으로 나타내면 아래 그림과 같습니다.
다차원 배열에서 축 기준 정규화 하기 : axis 인자
다차원 배열의 경우에도, 각 축을 기준으로 정규화를 진행할 수 있습니다.
위에서 norm을 나타내는 ord 인자 뒤에 axis 인자를 설정해주면 되는데요.
axis 인자 미 설정 시(혹은 None), 모든 값들을 하나의 차원으로 편 후의 결과를
기준으로 1개의 전체 norm 값을 계산합니다.
axis 인자를 숫자로 지정 시에는 해당 숫자의 축을 기준으로 각 행/열의 값들에
대한 norm 값을 각각 계산합니다.
아래에서 코드 예시와 상세 원리를 살펴보겠습니다.
참고로, 여기서는 2-norm을 기준으로 계산한 예시입니다.
b = np.array([[1, 3, 5],
[2, 4, 6]])
# 전체 값 기준 정규화
LA.norm(b) # 9.539392014169456
# 각 열 기준 정규화
LA.norm(b, axis = 0) # array([2.23606798, 5. , 7.81024968])
# 각 행 기준 정규화
LA.norm(b, axis = 1) # array([5.91607978, 7.48331477])
만일 다차원 배열을 대상으로 다른 형태의 norm을 계산하고 싶다면,
다음 예시처럼 인자를 지정해주시면 됩니다.
b = np.array([[1, 3, 5],
[2, 4, 6]])
# 각 열 기준 1-norm 정규화(ord, axis 인자로 지정)
LA.norm(b, ord = 1, axis = 0) # array([ 3., 7., 11.])
# 각 행 기준 infinity-norm 정규화(인자의 순서대로 지정)
LA.norm(b, np.inf, 1) # array([5., 6.])
'Python > Numpy' 카테고리의 다른 글
[Numpy] 파이썬 원하는 자릿수까지 반올림, 올림, 내림 총정리 (0) | 2022.01.03 |
---|---|
[Numpy] 파이썬 배열 하한, 상한값 채우기 함수 : np.clip() (0) | 2021.12.29 |
[Numpy] 파이썬 내적, 행렬곱 함수 np.dot() 사용법 총정리 (3) | 2021.12.28 |