Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 NumPy로 음의 2-노름을 사용해 행렬의 조건수 계산하기

선형 대수에서 행렬의 조건수(condition number)를 계산하려면 파이썬의 numpy.linalg.cond() 메서드를 사용합니다. 이 메서드는 두 번째 매개변수인 p 값에 따라 7가지 서로 다른 노름(norm) 중 하나를 사용해 조건수를 반환할 수 있으며, 특정 경우에는 결과가 무한대가 될 수도 있습니다.

행렬 x의 조건수는 'x의 노름'과 'x의 역행렬(inverse)의 노름'을 곱한 값으로 정의됩니다. 여기서 노름은 일반적인 L2-노름이 될 수도 있고, 다른 종류의 행렬 노름이 될 수도 있습니다. 첫 번째 매개변수는 조건수를 구하고자 하는 행렬 x이며, 두 번째 매개변수 p는 조건수 계산에 사용할 노름의 차수입니다. p에 -2를 지정하면 음의 2-노름, 즉 가장 작은 특이값(smallest singular value)을 기준으로 조건수를 계산합니다.

cond() 메서드에서 지원하는 주요 노름 옵션

  • p = None: 2-노름(SVD를 직접 사용)
  • p = 'fro': 프로베니우스(Frobenius) 노름
  • p = 1 또는 -1: 열 방향 절댓값 합의 최댓값 / 최솟값
  • p = inf 또는 -inf: 행 방향 절댓값 합의 최댓값 / 최솟값
  • p = 2 또는 -2: 최대 특이값 / 최소 특이값

구현 단계

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np
from numpy import linalg as LA

배열을 생성합니다.

arr = np.array([[ 1, 1, 0], [1, 0, 1], [1, 0, 0]])

배열을 화면에 출력합니다.

print("Our Array...\n",arr)

배열의 차원을 확인합니다.

print("\nDimensions of our Array...\n",arr.ndim)

배열의 데이터 타입을 확인합니다.

print("\nDatatype of our Array object...\n",arr.dtype)

배열의 형상(shape)을 확인합니다.

print("\nShape of our Array object...\n",arr.shape)

numpy.linalg.cond() 메서드를 호출하여 조건수를 계산합니다. 이때 두 번째 인자로 -2를 전달하면 음의 2-노름이 적용됩니다.

print("\nResult...\n",LA.cond(arr, -2))

전체 예제 코드

import numpy as np
from numpy import linalg as LA

# 배열 생성
arr = np.array([[ 1, 1, 0], [1, 0, 1], [1, 0, 0]])

# 배열 출력
print("Our Array...\n",arr)

# 차원 확인
print("\nDimensions of our Array...\n",arr.ndim)

# 데이터 타입 확인
print("\nDatatype of our Array object...\n",arr.dtype)

# 형상 확인
print("\nShape of our Array object...\n",arr.shape)

# 음의 2-노름으로 행렬의 조건수 계산
print("\nResult...\n",LA.cond(arr, -2))

실행 결과

Our Array...
[[1 1 0]
[1 0 1]
[1 0 0]]

Dimensions of our Array...
2

Datatype of our Array object...
int64

Shape of our Array object...
(3, 3)

Result...
0.2679491924311227

참고: 조건수의 의미

조건수는 행렬이 얼마나 "안정적인지"를 나타내는 지표입니다. 조건수가 큰 행렬은 입력에 작은 오류가 생겨도 결과에 큰 오류가 발생할 수 있는 ill-conditioned(나쁜 조건) 상태를 의미하며, 선형 시스템 해의 수치적 안정성을 평가할 때 중요하게 활용됩니다. 위 예제에서는 -2 옵션을 사용해 가장 작은 특이값 기반의 조건수 약 0.268을 얻었습니다.