Python/Numpy

[Numpy] 벡터 norm 구하기, 벡터 정규화 함수 : np.linalg.norm(), LA.norm() 사용법

jimmy_AI 2022. 1. 2. 14:40
반응형

파이썬 넘파이 벡터 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.])