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

Python에서 특이값 분해(SVD) 방식으로 배열의 행렬 랭크 구하기

Python에서 numpy.linalg.matrix_rank() 메서드를 사용하면 특이값 분해(Singular Value Decomposition, SVD) 방식으로 배열의 행렬 랭크(matrix rank)를 계산할 수 있습니다. 행렬의 랭크란 허용 오차(tol)보다 큰 특이값(singular value)의 개수를 의미합니다.

matrix_rank() 메서드의 주요 매개변수

첫 번째 매개변수 A는 랭크를 계산할 입력 벡터 또는 행렬의 스택(stack)입니다.

두 번째 매개변수 tol은 SVD 값이 0으로 간주되는 임계값(threshold)입니다. tol이 None이고, S가 행렬 M에 대한 특이값 배열이며 eps가 S의 데이터 타입에 대한 엡실론(epsilon) 값이라면, tol은 S.max() * max(M, N) * eps로 설정됩니다.

세 번째 매개변수 hermitian이 True이면 A가 에르미트(Hermitian) 행렬이라고 가정하여, 더 효율적인 방법으로 특이값을 계산합니다. 기본값은 False입니다.

구현 단계

먼저 필요한 라이브러리를 가져옵니다.

import numpy as np
from numpy.linalg import matrix_rank

배열을 생성합니다.

arr = np.eye(5)

배열을 출력합니다.

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.matrix_rank() 메서드를 사용합니다.

print("\nResult (rank)...\n",matrix_rank(arr))

전체 예제 코드

import numpy as np
from numpy.linalg import matrix_rank

# 배열 생성
arr = np.eye(5)

# 배열 출력
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)

# SVD 방식으로 행렬 랭크 계산
print("\nResult (rank)...\n",matrix_rank(arr))

실행 결과

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

Dimensions of our Array...
2

Datatype of our Array object...
float64

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

Result (rank)...
5

위 실행 결과에서 볼 수 있듯이, np.eye(5)로 생성한 5×5 단위행렬(identity matrix)의 랭크는 5입니다. 단위행렬은 모든 특이값이 1이므로, 임계값보다 큰 특이값의 개수인 5가 그대로 랭크로 반환됩니다.