Ответ 1
Вместо того, чтобы отвечать на каждый отдельный вопрос, позвольте мне проиллюстрировать, как использовать HMM toolbox с примером - пример погоды, который обычно используется при введении скрытых марковских моделей.
В основном состояния модели - три возможных типа погоды: солнечный, дождливый и туманный. В любой день мы предполагаем, что погода может быть только одним из этих значений. Таким образом, множество состояний 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);
например, пятый пример:
>> 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) неизвестные параметры модели
Обучение выполняется с использованием алгоритма ЭМ и лучше всего выполняется с набором последовательностей наблюдений.
Продолжая в том же примере, мы можем использовать сгенерированные данные выше, чтобы обучить новую модель и сравнить ее с оригиналом:
%# 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