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

Python NumPy로 행렬 스택의 로그 행렬식 계산하기

여러 개의 행렬이 쌓여 있는 배열(행렬 스택)에 대해 로그 행렬식을 한 번에 계산하려면 Python의 numpy.linalg.slogdet() 메서드를 사용하면 됩니다. 이 메서드는 수치적 안정성이 중요한 대규모 연산에서 특히 유용합니다.

첫 번째 매개변수인 a는 입력 배열로, 반드시 정사각형(n×n) 형태의 마지막 두 차원을 가진 배열이어야 합니다.

slogdet() 메서드의 반환값

numpy.linalg.slogdet()은 두 가지 값을 반환합니다.

  • sign(부호): 행렬식의 부호를 나타내는 값입니다. 실수 행렬의 경우 1, 0 또는 -1이며, 복소수 행렬의 경우 절댓값이 1인 복소수 또는 0입니다.
  • logdet(로그 행렬식): 행렬식 절댓값의 자연로그입니다.

만약 행렬식이 0이라면 sign은 0이 되고 logdet은 -Inf(음의 무한대)가 반환됩니다. 어떤 경우에도 다음 관계가 성립합니다.

determinant = sign * np.exp(logdet)

행렬식 자체를 직접 계산하면 오버플로나 언더플로가 발생할 수 있지만, 로그 값을 사용하면 이러한 문제를 효과적으로 피할 수 있습니다.

단계별 구현 방법

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

import numpy as np

행렬 스택으로 이루어진 3차원 배열을 생성합니다.

arr = np.array([[[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]]])

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

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)

참고로 선형대수에서 일반적인 행렬식은 np.linalg.det()으로 계산할 수 있습니다.

print("\nDeterminant...\n", np.linalg.det(arr))

이제 numpy.linalg.slogdet() 메서드를 사용해 행렬 스택의 로그 행렬식을 계산합니다.

(sign, logdet) = np.linalg.slogdet(arr)
print("\nResult....\n", (sign, logdet))

전체 예제 코드

import numpy as np

# 행렬 스택으로 이루어진 3차원 배열 생성
arr = np.array([[[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]]])

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

# 일반 행렬식 계산
print("\nDeterminant...\n", np.linalg.det(arr))

# slogdet()으로 행렬 스택의 로그 행렬식 계산
(sign, logdet) = np.linalg.slogdet(arr)
print("\nResult....\n", (sign, logdet))

실행 결과

Our Array...
[[[1 2]
[3 4]]

[[1 2]
[2 1]]

[[1 3]
[3 1]]]

Dimensions of our Array...
3

Datatype of our Array object...
int64

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

Determinant...
[-2. -3. -8.]

Result....
(array([-1., -1., -1.]), array([0.69314718, 1.09861229, 2.07944154]))

결과 해석

세 개의 2×2 행렬 각각에 대해 결과가 배열 형태로 반환된 것을 확인할 수 있습니다. 첫 번째 행렬 [[1, 2], [3, 4]]의 행렬식은 -2이므로 sign은 -1, logdet은 ln(2) ≈ 0.6931입니다. 두 번째 행렬 [[1, 2], [2, 1]]의 행렬식은 -3이므로 sign은 -1, logdet은 ln(3) ≈ 1.0986입니다. 세 번째 행렬 [[1, 3], [3, 1]]의 행렬식은 -8이므로 sign은 -1, logdet은 ln(8) ≈ 2.0794입니다.

이처럼 slogdet() 메서드는 여러 행렬을 한 번에 처리할 수 있으며, sign과 logdet을 조합하면 원래의 행렬식을 정확히 복원할 수 있습니다.