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}에서 수열을 생성합니다.

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

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

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

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

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

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

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

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

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];

참고 항목

| | | |

관련 항목