2016-09-28 6 views
1

숨겨진 마코프 모델 (해독 문제)을 사용하여 숨겨진 상태를 예측하고 싶습니다. 데이터는 범주 적입니다. 숨겨진 상태에는 Hungry, Rest, Exercise 및 Movie가 포함됩니다. 관측 세트에는 음식, 집, 야외 & 레크리에이션 및 예술 & 엔터테인먼트가 포함됩니다. 내 프로그램은 관찰 시퀀스 (Baum-Welch 알고리즘)를 기반으로 HMM을 처음으로 훈련합니다. 그런 다음 숨겨진 상태 시퀀스를 예측하기 위해 디코딩 (Viterbi 알고리즘)을 수행합니다.hmmlearn (Hidden Markov Model)에서 해독 한 후 숨겨진 상태를 해당 카테고리로 매핑하는 방법은 무엇입니까?

제 질문은 어떻게 결과 (음수가 아닌 정수)를 Hungry 또는 Rest와 같은 해당 범주에 매핑 할 수 있는지입니다. 학습 알고리즘의 비 결정적 속성으로 인해 동일한 데이터의 모든 학습마다 매개 변수가 다릅니다. 따라서 숨겨진 상태 시퀀스는 다음 코드와 같이 맵을 수행 할 때마다 다릅니다.

from __future__ import division 
import numpy as np 
from hmmlearn import hmm 

states = ["Hungry", "Rest", "Exercise", "Movie"] 
n_states = len(states) 

observations = ["Food", "Home", "Outdoor & Recreation", "Arts & Entertainment"] 

# The number in this sequence is the index of observation 
category_sequence = [1, 0, 1, 2, 1, 3, 1] 
Location = np.array([category_sequence]).T 
model = hmm.MultinomialHMM(n_components=n_states).fit(Location) 

logprob, result = model.decode(Location) 
print "Category:", ", ".join(map(lambda x: observations[x], Location.T[0])) 
print "Intent:", ", ".join(map(lambda x: states[x], result)) 

답변

1

이는 라벨 스위칭 문제로 알려져있다 : 다음

코드이다. 모델의 log-likelihood는 모든 상태에 대해 합계를 가지므로 특정 순서와는 무관합니다.

내가 아는 한, 그것을 다루는 일반적인 방법은 없습니다. 당신이 시도 할 수있는 것들 중에는 :

  • 그것에 predict을 실행, 부분적으로 표시된 데이터 집합을 찾아 해당 레이블 상태 지수를 매핑 할 예측을 사용합니다.
  • 각 상태의 가능한 매개 변수 값에 대한 경험적 방법을 제시하십시오. 이것은 다항식에 대해 까다로울 수 있지만, 예를 들어 모델링하는 경우 가능합니다. 가속도계 데이터.

업데이트 : 표시된 데이터에서 레이블 매핑 상태를 추측의 임시 버전.

def guess_labels(hmm, X, labels): 
    result = [None] * hmm.n_components 
    for label, y_t in zip(labels, hmm.predict(X)): 
     assigned = result[y_t] 
     if assigned is not None: 
      # XXX clearly for any real data there might be 
      #  (and there will be) conflicts. Here we just blindly 
      #  hope the ``assert`` never fires. 
      assert assigned == label 
     else: 
      result[y_t] = label 
    return result 
+0

안녕하세요. Sergei 님, 여러분의 의견을 듣기 좋습니다. 첫 번째로는 hmmlearn 모듈에서 반 감독 방식으로 어떻게 할 수 있는지에 대해 약간 혼란 스럽습니다. 함수 적합을 호출하면 입력은 관측 값입니다. 그것에 대해 더 자세히 말해 줄 수 있습니까? 감사. – Isaiah

+0

'hmmlearn'은 현재이 작업을 자동으로 수행 할 방법이 없습니다. 왜냐하면 HMM을 사용하는 모든 문제는 감독되지 않았기 때문에 (즉, 레이블 데이터가 전혀 사용 가능하지 않음) 두 번째 접근법이 필요하기 때문입니다. 어쨌든, 나는 대답을 업데이트했다.'guess_labels'의 출력이 당신의 데이터에 대해 어떤 의미인지를 알려주기 바란다. –

+0

Sergei에게 감사드립니다. 데이터를 전송하기 위해 LSTM으로 전환 했으므로 괜찮습니다. – Isaiah