2

Я пытаюсь построить матрицу перехода для цепи Маркова в MATLAB; У меня есть несколько различных последовательностей наблюдения (все разные длины), и мне нужно сгенерировать матрицу перехода, используя эти.Оценить Марковскую матрицу перехода цепи в MATLAB с различными длинами последовательности состояний

Constructing a multi-order Markov chain transition matrix in Matlab показывает, как построить матрицу перехода с одной последовательностью наблюдения.

Как я могу построить один, используя наблюдения различной длины? Одним из примеров может быть то, что одна последовательность составляет 1,2,3,4, а другая - 4,5,6. Есть ли способ сделать это без необходимости для цикла через все последовательности и вычисления?

ответ

4

Итак, для цепей Маркова я предполагаю, что вас интересуют только состояния перехода. Вы можете сгруппировать все переходы состояний в одну матрицу Nx2, а затем подсчитать количество раз, когда появится строка.

Для этого примера я использую три наблюдения длины 4, 3 и 3. Я могу использовать cellfun сгруппировать все переходы между состояниями вместе в одну матрицу следующим образом:

obs = cell(1, 3); 

obs(1) = {[1 2 3 4]}; 
obs(2) = {[4 5 6]}; 
obs(3) = {[3 4 5]}; 

transitions = cellfun(@(x)([x(1:length(x)-1); x(2:length(x))]), obs, 'UniformOutput', false); 

alltransitions = cell2mat(transitions)'; 

Какие дает мне мои наблюдаемые переходы (1->2, 2->3, 3->4 ...):

alltransitions = 

    1  2 
    2  3 
    3  4 
    4  5 
    5  6 
    3  4 
    4  5 

Чтобы настроить матрицу перехода, вы могли бы принять совет, перечисленные здесь, и подсчет строк всех ваших переходов:

http://www.mathworks.it/matlabcentral/answers/75009-i-ve-a-matrix-of-6x4-and-i-want-to-count-the-rows-how-many-times-it-occur-in-a-matrix

[uniqueTransitions, ~, i]=unique(alltransitions,'rows','stable'); 
v=arrayfun(@(x) sum(i==x),1:size(uniqueTransitions,1))'; 
p = v/sum(v); 

Мой вектор р содержит мою вероятность перехода, поэтому я могу идти вперед и строить разреженную матрицу

transitionMatrix = sparse(uniqueTransitions(:,1), uniqueTransitions(:,2), p, 6,6) 

, что приводит к:

transitionMatrix = 

    (1,2)  0.1429 
    (2,3)  0.1429 
    (3,4)  0.2857 
    (4,5)  0.2857 
    (5,6)  0.1429 
0

это может быть, проще способ вычисления матрицы вероятности перехода (TPM) для заданной последовательности данных (один вектор) следующим образом:

myS = {S1, S2, S1, S3, ...} с таким количеством состояний, как у вас;

TPM = hmmestimate (myS, myS);

hmmestimate Функция определена под скрытыми марковскими моделями в MATLAB.

+0

hmmestimate действителен, когда у вас есть несколько векторов? – galtor