선형 대수에서 행렬의 조건수(condition number)를 계산하려면 Python의 numpy.linalg.cond() 메서드를 사용하면 됩니다. 이 메서드는 두 번째 매개변수 p의 값에 따라 7가지 서로 다른 노름 중 하나를 선택해 조건수를 반환할 수 있으며, 행렬이 특이행렬(singular matrix)에 가까운 경우 결과가 무한대(inf)가 될 수도 있습니다.
행렬 x의 조건수는 “x의 노름 × x의 역행렬의 노름”으로 정의됩니다. 여기서 노름은 일반적인 L2 노름일 수도 있고, 그 외 다양한 행렬 노름 중 하나일 수도 있습니다.
- 첫 번째 매개변수 x : 조건수를 구하고자 하는 행렬입니다.
- 두 번째 매개변수 p : 조건수 계산에 사용할 노름의 차수(order)입니다. 'fro'로 지정하면 프로베니우스(Frobenius) 노름이 적용됩니다.
참고로 조건수가 클수록 행렬이 수치적으로 불안정하다는 의미이며, 연립방정식 풀이 등에서 작은 입력 오차가 큰 결과 오차로 이어질 수 있습니다.
계산 단계
먼저 필요한 라이브러리를 임포트합니다.
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() 메서드를 사용해 행렬의 조건수를 계산합니다. 두 번째 인자로 'fro'를 전달하면 프로베니우스 노름 기준으로 조건수가 계산됩니다.
print("\nResult...\n",LA.cond(arr, 'fro'))전체 예제 코드
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)
# Frobenius 노름을 사용해 조건수 계산
print("\nResult...\n",LA.cond(arr, 'fro'))
실행 결과
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...
5.000000000000001
실행 결과, 주어진 3×3 행렬의 프로베니우스 노름 기준 조건수는 약 5.0으로 계산되었습니다. 이처럼 조건수가 비교적 작으면 해당 행렬이 수치적으로 안정적(well-conditioned)임을 의미합니다.