Um Modelo oculto de Markov (HMM) é um modelo em que você observa uma
sequência de emissões, mas não sabe a sequência de estados que o
modelo passou para gerar esses emissões. A analise de um modelo de
Markov busca recuperar a sequência de estados de um dado observado.
Por
exemplo, considerando um modelo de Markov que 2 estados e 6
possibilidades de emissões. O modelo usa:
- Um dado vermelho com 6 lados, rotulados de 1 a 6.
- Um dado verde, com 20 lados, 5 deles estão rotulados de 2 a 6, enquanto os 7 lados remanescestes então rotulados com 1
- O peso ponderado do vermelho possui a probabilidade de cabeça 9 e a probabilidade da calda 1.
- O peso ponderado do verde possui a probabilidade de cabeça .95 e a probabilidade de cauda .05
O
diagrama de estados para este modelo possui dois estados e é
apresentado a imagem a seguir;
Porém esse modelo não é oculto porque você sabe a sequência de estados dos dados. Suponha, entrentando, que outro alguém gerou as emissões sem mostrar a você os dados. Tudo que você vê é a sequência de emissões. Se você começa vendo mais uns dos que outros números, você pode suspeitar que o modelo está em um determinado estado, mas você não pode afirmar com segurança, porque você não pode ver a cor que o dado começou a ser rolado.
Analise
do modelo de markov
Hmmgenerate
- gerar uma sequência de estados e emissões de um Modelo de Markov.
Hmmestimate
- calcula a estimativa de máxima verossimilhança de transição e a
probabilidade de emissão a partir de sequência de emissão e uma
conhecida sequencia de estados.
hmmtrain
- calcula a estimativa máxima verossimilhança de transição e
probabilidade de emissão a partir de um sequência de emissões.
hmmviterbi
- calcula o caminho de maior probabilidade de um Modelo Oculto de
Markov
hmmdecode
- calcula a probabilidade de um estado posterior de a sequência de
emissões.
Gerando
um sequência de Teste
O
seguinte comando cria matrizes de transição e emissão for o modelo
descrito na introdução.
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];
|
Para
gerar a sequência randômica de estados e emissões partir de modelo
use:
[seq,states] = hmmgenerate(1000,TRANS,EMIS);
|
A
saída seq é a sequência de emissões e a saída states
é o sequência de estados.
hmmgenerate
inicia no estado 1 no passo 0, fazendo a transição do estado i1 no
passo 1, e retornando i1 como a primeira entrada no estado. Para
mudar o estado inicial, veja Mudando a Distribuição do Estado
Inicial.
Estimando
a sequência de estados
Dado
a as matrizes de transição e emissão TRANS e EMIS, a função
hmmviterbi usa o algorítimo de Viterbi para computar a sequência mais
provável de estados do modelo iria passar para gerar uma dada
sequência seq de emissões:
likelystates = hmmviterbi(seq, TRANS, EMIS);
|
likelystates
é um sequência com o mesmo tamanho de seq
Para
testar a precisão de hmmviterbi, computar a porcentagem do estado de
sequência atual que concorda com a sequência likelystates
sum(states==likelystates)/1000
|
ans
= 0.8200
Nese
caso, a sequência mais provável de estados concorda que com a
sequência aleatória em 82% das vezes.
Estimando
matrizes de transições e emissão
As
funções hmmestimate e hmmtrain estima as matrizes de
transição e emissão TRANS e EMIS dada um sequência seq de
emissões.
A
função hmmestimate requer que você conheça a sequência de estados
que o modelo atravessou para gerar a seq.
a
entrada é a emissão e sequência de estados e o retorno são as
matrizes de transição e emissão.
[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
Você
pode compara as saídas como as originais TRANS e 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
Se
você não conhece a sequência de estados, mas você tem uma
suposição inicial para TRANS e EMIS, você pode ainda estimar o
TRANS e EMIS usando hmmtrain
TRANS_GUESS
= [.85 .15; .1 .9];
EMIS_GUESS
= [.17 .16 .17 .16 .17 .17;.6 .08 .08 .08 .08 08];
Você
estima TRANS e EMIS da seguinte forma:
[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
usa um algorítimo interativo que altera as matrizes TRAN_GUESS e
EMIS_GUESS que então para cada passo a matriz de ajuste é mais
provável para gerar a sequência observada, seq. O algoritmo para
quando as matrizes em duas interações estiver com a pequena
tolerância uma da outra.
Se o
algoritmo falhar para alcançar essa tolerância dentro de um numero
máximo de interações, cujo valor padrão é 100, no algoritmo de
parada. Neste caso, hmmtrains retorna os últimos valores de TRANS_EST e EMIS_EST,o problema é o caso em que a tolerância não foi
alcançada.
Se o
algoritmo falha para alcançar a tolerância desejada, aumente o valor
padrão do numero máximo de interações com o comando:
hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)
onde
maxitter é o numero máximo de passos que o algorítimo executa.
Muda
o valor padrão da tolerância como comando:
hmmtrain(seq,
TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)
onde
tol e o valor desejado de tolerância. Aumentando o valor do tol faz o
algoritmo parar mais cedo, mas os resultato são menos precisos.
Considerações:
Esta postagem foi feita com base na documentação do MathLab, (Com algumas alterações, por isso não é totalmente uma tradução)
http://www.mathworks.com/help/stats/hidden-markov-models-hmm.html
0 comentários:
Postar um comentário