Main Content

은닉 마르코프 모델(HMM)

은닉 마르코프 모델(HMM) 소개

은닉 마르코프 모델(HMM, Hidden Markov Model)에서는 일련의 출력(Emission)을 관측할 수 있지만, 출력을 생성하기 위해 이 모델이 거친 상태 열은 알 수 없습니다. 은닉 마르코프 모델의 분석은 관측된 데이터에서 상태 열을 복원하려고 합니다.

이에 대한 예로, 2개의 상태를 가지며 6종류의 출력이 가능한 마르코프 모델이 있다고 가정해 보겠습니다. 이 모델은 다음을 사용합니다.

  • 1부터 6이 표시된 6면 빨간색 주사위.

  • 12개 면을 가지며 그중 5개 면에는 2부터 6까지가 표시되고 나머지 7개 면에는 1이 표시된 녹색 주사위.

  • 동전의 앞면이 나올 확률은 0.9이고 뒷면이 나올 확률은 0.1인, 중량이 편중된 빨간색 동전.

  • 동전의 앞면이 나올 확률은 0.95이고 뒷면이 나올 확률은 0.05인, 중량이 편중된 녹색 동전.

이 모델은 다음 규칙을 사용하여 집합 {1, 2, 3, 4, 5, 6}에서 수열을 생성합니다.

  • 먼저, 빨간색 주사위를 굴리고 나오는 숫자(출력)를 기록합니다.

  • 빨간색 동전을 던지고 다음 중 하나를 수행합니다.

    • 결과가 앞면이면 빨간색 주사위를 굴리고 결과를 기록합니다.

    • 결과가 뒷면이면 녹색 주사위를 굴리고 결과를 기록합니다.

  • 각 후속 단계에서는 이전 단계에서 굴린 주사위와 같은 색의 동전을 던집니다. 동전의 앞면이 나오면 이전 단계와 동일한 주사위를 굴립니다. 동전의 뒷면이 나오면 다른 주사위로 바꿉니다.

이 모델의 상태 도식에는 다음 그림에 나와 있는 것처럼 두 상태가 있습니다.

State diagram for the Markov model with two states

상태와 같은 색의 주사위를 굴려서 상태에서 생성되는 출력을 확인합니다. 상태와 같은 색의 동전을 던져서 다음 상태로의 전이를 확인합니다.

전이 행렬은 다음과 같습니다.

T=[0.90.050.10.95]

출력 행렬은 다음과 같습니다.

E=[161616161616712112112112112112]

동전과 주사위의 색을 통해 상태 열을 알 수 있으므로 이 모델은 은닉 모델이 아닙니다. 그러나, 다른 누군가가 여러분에게 주사위나 동전을 보여주지 않고 출력을 생성한다고 가정해 보겠습니다. 여러분이 볼 수 있는 것은 출력 수열뿐입니다. 다른 숫자보다 1이 더 많이 보이기 시작하면 이 모델이 녹색 상태에 있다고 의심해 볼 수 있지만, 현재 굴리고 있는 주사위의 색을 볼 수 없으므로 확신할 수 없습니다.

은닉 마르코프 모델은 다음과 같은 질문을 제기합니다.

  • 출력 열이 주어진 경우 어떠한 상태 경로가 가장 가능성이 높은가?

  • 출력 수열이 주어진 경우 모델의 전이 확률과 출력 확률을 어떻게 추정할 수 있는가?

  • 모델이 주어진 수열을 생성할 전향 확률(Forward Probability)은 얼마인가?

  • 모델이 이 수열의 임의 점에서 특정 상태에 있을 사후 확률은 얼마인가?

은닉 마르코프 모델(Hidden Markov Model) 분석하기

은닉 마르코프 모델과 관련된 Statistics and Machine Learning Toolbox™ 함수는 다음과 같습니다.

  • hmmgenerate — 마르코프 모델에서 상태 열과 출력 열을 생성합니다.

  • hmmestimate — 출력 열과 알려진 상태 열에서 전이 확률과 출력 확률에 대한 최대가능도 추정값을 계산합니다.

  • hmmtrain — 출력 수열에서 전이 확률과 출력 확률에 대한 최대가능도 추정값을 계산합니다.

  • hmmviterbi — 은닉 마르코프 모델에 대한 가장 가능성이 높은 상태 경로를 계산합니다.

  • hmmdecode — 출력 열에 대한 사후 상태 확률을 계산합니다.

이 섹션에서는 이러한 함수를 사용하여 은닉 마르코프 모델을 분석하는 방법을 보여줍니다.

테스트 수열 생성하기

다음 명령은 은닉 마르코프 모델(HMM) 소개에 설명된 모델에 대한 전이 행렬과 출력 행렬을 생성합니다.

TRANS = [.9 .1; .05 .95];

EMIS = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6;...
7/12, 1/12, 1/12, 1/12, 1/12, 1/12];

모델에서 상태의 랜덤 시퀀스와 출력의 랜덤 시퀀스를 생성하려면 hmmgenerate를 사용하십시오.

[seq,states] = hmmgenerate(1000,TRANS,EMIS);

출력값 seq는 출력 열이고, 출력값 states는 상태 열입니다.

hmmgenerate는 단계 0에서 상태 1로 시작하고, 단계 1에서 상태 i1로의 전이를 수행한 후 states의 첫 번째 항목으로 i1을 반환합니다. 초기 상태를 변경하려면 초기 상태 분포 변경하기 항목을 참조하십시오.

상태 열 추정하기

전이 행렬 TRANS와 출력 행렬 EMIS가 주어진 경우, 함수 hmmviterbi는 모델이 출력 열 seq를 생성하기 위해 거칠 수 있는 가장 가능성이 높은 상태 열을 비터비(Viterbi) 알고리즘을 사용하여 계산합니다.

likelystates = hmmviterbi(seq, TRANS, EMIS);

likelystatesseq와 길이가 같은 수열입니다.

hmmviterbi의 정확도를 검정하려면 실제 수열 states가 수열 likelystates와 일치하는 비율을 계산하십시오.

sum(states==likelystates)/1000
ans =
   0.8200

이 경우, 가장 가능성이 높은 상태 시퀀스가 랜덤 시퀀스와 일치하는 비율은 82%입니다.

전이 행렬과 출력(Emission) 행렬 추정하기

함수 hmmestimatehmmtrain은 출력 수열 seq가 주어진 경우 전이 행렬 TRANS와 출력 행렬 EMIS를 추정합니다.

hmmestimate 사용하기.  함수 hmmestimate를 사용하려면 모델이 seq를 생성하기 위해 거친 상태 열 states를 알아야 합니다.

다음은 출력 열과 상태 열을 받고 전이 행렬과 출력 행렬의 추정값을 반환합니다.

[TRANS_EST, EMIS_EST] = hmmestimate(seq, states)

TRANS_EST =
0.8989    0.1011
0.0585    0.9415

EMIS_EST =
0.1721    0.1721    0.1749    0.1612    0.1803    0.1393
0.5836    0.0741    0.0804    0.0789    0.0726    0.1104

출력값을 원래 전이 행렬 TRANS 및 원래 출력 행렬 EMIS와 비교할 수 있습니다.

TRANS
TRANS =
0.9000    0.1000
0.0500    0.9500

EMIS
EMIS =
0.1667    0.1667    0.1667    0.1667    0.1667    0.1667
0.5833    0.0833    0.0833    0.0833    0.0833    0.0833

hmmtrain 사용하기.  상태 열 states를 알지 못하지만 TRANSEMIS에 대한 초기 추측값을 알고 있는 경우 계속해서 hmmtrain을 사용하여 TRANSEMIS를 추정할 수 있습니다.

TRANSEMIS의 다음과 같은 초기 추측값을 알고 있다고 가정하겠습니다.

TRANS_GUESS = [.85 .15; .1 .9];
EMIS_GUESS = [.17 .16 .17 .16 .17 .17;.6 .08 .08 .08 .08 08];

다음과 같이 TRANSEMIS를 추정합니다.

[TRANS_EST2, EMIS_EST2] = hmmtrain(seq, TRANS_GUESS, EMIS_GUESS)

TRANS_EST2 =
0.2286    0.7714
0.0032    0.9968

EMIS_EST2 =
0.1436    0.2348    0.1837    0.1963    0.2350    0.0066
0.4355    0.1089    0.1144    0.1082    0.1109    0.1220

hmmtrain은 각 단계에서 조정된 행렬이 관측된 수열 seq를 생성할 가능성이 더 높아지도록 행렬 TRANS_GUESSEMIS_GUESS를 고쳐나가는 반복 알고리즘을 사용합니다. 두 개의 연속된 반복에 포함된 행렬이 서로의 작은 허용오차 범위 내에 있는 경우 이 알고리즘이 중단됩니다.

알고리즘이 최대 반복 횟수(디폴트 값은 100임) 내에서 이 허용오차에 도달하지 못할 경우 알고리즘이 중단됩니다. 이 경우, hmmtrainTRANS_ESTEMIS_EST의 마지막 값을 반환하고 허용오차에 도달하지 못했다는 경고를 발생시킵니다.

알고리즘이 기대한 허용오차에 도달하지 못할 경우 다음 명령을 사용하여 최대 반복 횟수의 디폴트 값을 늘립니다.

hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)

여기서 maxiter가 알고리즘이 실행하는 최대 단계 수입니다.

다음 명령을 사용하여 허용오차의 디폴트 값을 변경합니다.

hmmtrain(seq, TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)

여기서 tol이 기대하는 허용오차 값입니다. tol의 값을 늘리면 알고리즘이 더 빠르게 중단되지만, 그 결과는 더 부정확합니다.

hmmtrain의 출력 행렬의 신뢰성을 감소시키는 인자가 두 가지 존재합니다.

  • 이 알고리즘은 진정한 전이 행렬과 출력(Emission) 행렬을 나타내지 않는 국소 최댓값으로 수렴합니다. 이것이 의심되는 경우 행렬 TRANS_ESTEMIS_EST에 다른 초기 추측값을 사용하십시오.

  • 수열 seq는 행렬을 올바르게 훈련시키기에는 너무 짧을 수 있습니다. 이것이 의심되는 경우 seq에 대한 더 긴 수열을 사용하십시오.

사후 상태 확률 추정하기

출력(Emission) 열 seq의 사후 상태 확률은 seq가 출력된 경우 모델이 seq의 심볼을 생성할 때 특정 상태에 있을 조건부 확률입니다. 다음과 같이 hmmdecode를 사용하여 사후 상태 확률을 계산합니다.

PSTATES = hmmdecode(seq,TRANS,EMIS)

출력값 PSTATES는 M×L 행렬입니다. 여기서 M은 상태의 개수이고 L은 seq의 길이입니다. PSTATES(i,j)seq가 출력된 경우 모델이 seqj번째 심볼을 생성할 때 상태 i에 있을 조건부 확률입니다.

첫 번째 출력 전에 hmmdecode는 단계 0에서 상태 1에 있는 모델로 시작합니다. PSTATES(i,1)은 다음 단계 1에서 모델이 상태 i에 있을 확률입니다. 초기 상태를 변경하려면 초기 상태 분포 변경하기 항목을 참조하십시오.

hmmdecode의 두 번째 출력 인수를 사용하여 수열 seq의 확률에 대한 로그를 반환합니다.

[PSTATES,logpseq] = hmmdecode(seq,TRANS,EMIS)

수열의 확률은 수열의 길이가 증가할수록 0에 가까워지고, 충분히 긴 수열의 확률은 컴퓨터가 나타낼 수 있는 가장 작은 양수보다 더 작아집니다. hmmdecode는 이 문제가 발생하지 않도록 확률의 로그를 반환합니다.

초기 상태 분포 변경하기

기본적으로, Statistics and Machine Learning Toolbox 은닉 마르코프 모델 함수는 상태 1에서 시작합니다. 다시 말해, 초기 상태 분포는 그 확률 질량이 모두 상태 1에 집중됩니다. 다른 확률 분포 p = [p1, p2, ..., pM]을 M개의 초기 상태로 할당하려면 다음과 같이 하십시오.

  1. 다음 형식을 갖는 M+1-by-M+1 크기의 첨가 전이 행렬 T^를 생성합니다.

    T^=[0p0T]

    여기서 T는 진정한 전이 행렬입니다. T^의 첫 번째 열은 M+1개의 0을 포함합니다. p는 합이 1이어야 합니다.

  2. 다음 형식을 갖는 M+1 × N 크기의 첨가 출력(Emission) 행렬 E^를 생성합니다.

    E^=[0E]

전이 행렬과 출력 행렬이 각각 TRANSEMIS인 경우 다음 명령을 사용하여 첨가 행렬을 생성합니다.

TRANS_HAT = [0 p; zeros(size(TRANS,1),1) TRANS];

EMIS_HAT = [zeros(1,size(EMIS,2)); EMIS];

참고 항목

| | | |

관련 항목