Вместо ответа на каждый отдельный вопрос позвольте мне проиллюстрировать, как использовать набор инструментов HMM с примером - пример погоды , который обычно используется при представлении скрытых марковских моделей.
В основном состояния модели представляют собой три возможных типа погоды: солнечная, дождливая и туманная.В любой день мы предполагаем, что погода может быть только одним из этих значений.Таким образом, набор состояний HMM:
S = {sunny, rainy, foggy}
Однако в этом примере мы не можем наблюдать погоду напрямую (очевидно, мы заперты в подвале!).Вместо этого у нас есть единственное доказательство: носит ли человек, который проверяет вас каждый день, зонтик или нет.В терминологии HMM это дискретные наблюдения:
x = {umbrella, no umbrella}
Модель HMM характеризуется тремя вещами:
- Априорные вероятности: вектор вероятностей нахождения в первом состояниипоследовательности.
- Вероятность перехода: матрица, описывающая вероятности перехода из одного состояния погоды в другое.
- Вероятность выброса: матрица, описывающая вероятности наблюдения за выходом (зонтик или нет) дано состояние (погода).
Далее нам либо даны эти вероятности, либо мы должны изучить их из учебного набора.Как только это будет сделано, мы можем провести рассуждение, например, вычислить вероятность последовательности наблюдений относительно модели HMM (или группы моделей и выбрать наиболее вероятную) ...
1) известных параметров модели
Вот пример кода, который показывает, как заполнить существующие вероятности для построения модели:
Q = 3; %# number of states (sun,rain,fog)
O = 2; %# number of discrete observations (umbrella, no umbrella)
%# prior probabilities
prior = [1 0 0];
%# state transition matrix (1: sun, 2: rain, 3:fog)
A = [0.8 0.05 0.15; 0.2 0.6 0.2; 0.2 0.3 0.5];
%# observation emission matrix (1: umbrella, 2: no umbrella)
B = [0.1 0.9; 0.8 0.2; 0.3 0.7];
Затем мы можем отобрать несколько последовательностей из этой модели:
num = 20; %# 20 sequences
T = 10; %# each of length 10 (days)
[seqs,states] = dhmm_sample(prior, A, B, num, T);
например, 5-й пример:
>> seqs(5,:) %# observation sequence
ans =
2 2 1 2 1 1 1 2 2 2
>> states(5,:) %# hidden states sequence
ans =
1 1 1 3 2 2 2 1 1 1
мы можем оценить логарифмическую вероятность последовательности:
dhmm_logprob(seqs(5,:), prior, A, B)
dhmm_logprob_path(prior, A, B, states(5,:))
или вычислить путь Витерби (наиболее вероятная последовательность состояний):
vPath = viterbi_path(prior, A, multinomial_prob(seqs(5,:),B))
2) неизвестные параметры модели
Обучение выполняется с использованием алгоритма EM и лучше всего выполняется с набором последовательностей наблюдений.
Продолжая на том же примере, мы можем использовать сгенерированные выше данные для обучения новой модели и сравнить ее с оригиналом:
%# we start with a randomly initialized model
prior_hat = normalise(rand(Q,1));
A_hat = mk_stochastic(rand(Q,Q));
B_hat = mk_stochastic(rand(Q,O));
%# learn from data by performing many iterations of EM
[LL,prior_hat,A_hat,B_hat] = dhmm_em(seqs, prior_hat,A_hat,B_hat, 'max_iter',50);
%# plot learning curve
plot(LL), xlabel('iterations'), ylabel('log likelihood'), grid on
Имейте в виду, что порядок штатов не имеетчтобы соответствовать.Вот почему нам нужно переставить состояния, прежде чем сравнивать две модели.В этом примере обученная модель выглядит близко к исходной:
>> p = [2 3 1]; %# states permutation
>> prior, prior_hat(p)
prior =
1 0 0
ans =
0.97401
7.5499e-005
0.02591
>> A, A_hat(p,p)
A =
0.8 0.05 0.15
0.2 0.6 0.2
0.2 0.3 0.5
ans =
0.75967 0.05898 0.18135
0.037482 0.77118 0.19134
0.22003 0.53381 0.24616
>> B, B_hat(p,[1 2])
B =
0.1 0.9
0.8 0.2
0.3 0.7
ans =
0.11237 0.88763
0.72839 0.27161
0.25889 0.74111
Есть еще несколько вещей, которые вы можете сделать со скрытыми марковскими моделями, например классификация или распознавание образов.У вас будут разные наборы последовательностей обервации, принадлежащих разным классам.Вы начинаете с тренировки модели для каждого набора.Затем, учитывая новую последовательность наблюдений, вы можете классифицировать ее, вычисляя ее вероятность по каждой модели, и прогнозировать модель с наибольшим логарифмическим правдоподобием.
argmax[ log P(X|model_i) ] over all model_i