C++ Eigen3에서 마르코프 확률 과정 (Markov Stochastic Process in C++ Eigen3)

개요

Eigen3는 C++에서 행렬 및 벡터 연산을 효과적으로 수행하기 위해 설계된 라이브러리로, 마르코프 확률 과정을 모델링하고 시뮬레이션하는 데에도 유용하게 사용될 수 있다. 이 글에서는 Eigen3를 사용하여 마르코프 체인의 기본 구성 요소를 구현하고, 이를 통해 마르코프 확률 과정을 어떻게 처리할 수 있는지를 설명한다. 특히, 상태 전이 행렬(Transition Matrix)을 다루는 방법과 불변 분포(Invariant Distribution) 및 에르고딕성(Ergodicity) 검사를 중심으로 설명한다.

Eigen3를 이용한 상태 전이 행렬 (Transition Matrix) 구현

마르코프 확률 과정의 중심 요소는 상태 전이 행렬이다. Eigen3에서는 Eigen::MatrixXd 클래스를 사용하여 상태 전이 행렬을 구현할 수 있다. 상태 전이 행렬은 시스템의 각 상태에서 다른 상태로 전이할 확률을 나타내며, 각 행의 요소는 확률의 합이 1이 되어야 한다.

#include <Eigen/Dense>
#include <iostream>

int main() {
    // 3x3 상태 전이 행렬을 정의
    Eigen::MatrixXd P(3, 3);
    P << 0.5, 0.2, 0.3,
         0.4, 0.4, 0.2,
         0.3, 0.3, 0.4;

    std::cout << "상태 전이 행렬 P:\n" << P << std::endl;

    // 상태 벡터를 정의
    Eigen::VectorXd v(3);
    v << 1, 0, 0; // 초기 상태

    // 다음 상태 벡터를 계산
    Eigen::VectorXd next_v = P * v;
    std::cout << "다음 상태 벡터:\n" << next_v << std::endl;

    return 0;
}

위의 코드는 3x3 상태 전이 행렬을 정의하고, 주어진 초기 상태 벡터에서 다음 상태를 계산하는 간단한 예제이다. 이 예제에서 Eigen::MatrixXd는 상태 전이 행렬을 나타내며, Eigen::VectorXd는 현재 상태를 나타내는 벡터이다.

마르코프 체인의 불변 분포 (Invariant Distribution) 계산

마르코프 체인의 불변 분포는 상태 전이 행렬이 주어졌을 때 시간이 무한히 경과한 후의 상태 분포를 나타낸다. 불변 분포 $ \pi $는 다음과 같은 조건을 만족한다.

πP=π\pi P = \pi

이는 Eigen3를 이용하여 고유 벡터(Eigenvector)를 계산함으로써 구할 수 있다. 상태 전이 행렬의 고유값이 1에 해당하는 고유 벡터가 불변 분포를 나타낸다.

위의 코드에서는 상태 전이 행렬의 고유값을 계산하고, 고유값이 1인 고유 벡터를 찾아 불변 분포를 구한다. 이를 통해 마르코프 체인이 수렴하는 장기 분포를 구할 수 있다.

에르고딕성 (Ergodicity) 검증

마르코프 체인의 에르고딕성을 검증하는 방법 중 하나는 체인의 모든 상태가 서로 접근 가능(irreducible)하며, 체인이 재발성(recurrent)을 가진다는 것을 확인하는 것이다. 이 조건들이 충족되면 체인은 에르고딕하다고 할 수 있다.

에르고딕성을 확인하기 위해, 상태 전이 행렬의 거듭 제곱을 계산하여 일정한 시간이 경과한 후 모든 요소가 양수인지를 확인할 수 있다. 이 계산은 Eigen3의 행렬 거듭 제곱 연산을 통해 수행할 수 있다.

이 코드는 상태 전이 행렬의 10제곱을 계산하여 모든 요소가 양수인지 확인함으로써, 체인이 에르고딕한지를 검증하는 예제이다. 이는 상태 전이 행렬의 모든 상태가 서로 접근 가능하며, 충분한 시간이 지나면 모든 상태가 결국 같은 분포에 도달함을 의미한다.


Last updated