Python에서 Viterbi 알고리즘 구현

Vaibhav Vaibhav 2021년12월4일
Python에서 Viterbi 알고리즘 구현

Viterbi 알고리즘은 사후 확률이 최대인 가장 가능성 있는 상태 시퀀스를 찾는 데 사용됩니다. 동적 프로그래밍 기반 알고리즘입니다. 이 기사에서는 Python을 사용하여 Viterbi 알고리즘을 구현하는 방법에 대해 설명합니다. 구현을 위해 NumPy를 사용합니다.

Viterbi 알고리즘의 Python 구현

다음 코드는 Python에서 Viterbi 알고리즘을 구현합니다. 다음과 같은 4개의 매개변수를 받는 함수입니다.

  • y: 관찰 상태 시퀀스입니다.
  • A: 상태 전이 행렬입니다.
  • B: 이것은 방출 매트릭스입니다.
  • initial_probs: 초기 상태 확률입니다.

그리고 함수는 다음과 같이 3개의 값을 반환합니다.

  • x: 모델 매개변수 A, B, initial_probs에서 관찰 시퀀스 y를 조건으로 하는 숨겨진 상태 궤적의 사후 확률 추정치의 최대값입니다.
  • T1: 가장 가능성이 높은 경로의 확률입니다.
  • T2: 가장 가능성이 높은 경로의 확률입니다.
import numpy as np


def viterbi(y, A, B, initial_probs=None):
    K = A.shape[0]
    initial_probs = initial_probs if initial_probs is not None else np.full(K, 1 / K)
    T = len(y)
    T1 = np.empty((K, T), "d")
    T2 = np.empty((K, T), "B")
    T1[:, 0] = initial_probs * B[:, y[0]]
    T2[:, 0] = 0

    for i in range(1, T):
        T1[:, i] = np.max(T1[:, i - 1] * A.T * B[np.newaxis, :, y[i]].T, 1)
        T2[:, i] = np.argmax(T1[:, i - 1] * A.T, 1)

    x = np.empty(T, "B")
    x[-1] = np.argmax(T1[:, T - 1])

    for i in reversed(range(1, T)):
        x[i - 1] = T2[x[i], i]

    return x, T1, T2
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.