Estimación de la matriz de transición de la cadena de Markov en MATLAB con diferentes longitudes de secuencia de estado
probability transitions (2)
Estoy intentando construir la matriz de transición para una cadena de Markov en MATLAB; Tengo varias secuencias de observación diferentes (todas de diferentes longitudes) y necesito generar la matriz de transición usando esas.
La construcción de una matriz de transición de cadenas de múltiples órdenes de Markov en Matlab me muestra cómo construir una matriz de transición con una única secuencia de observación.
¿Cómo puedo construir uno usando observaciones de diferente longitud? Un ejemplo puede ser que una secuencia es 1,2,3,4 y otra es 4,5,6. ¿Hay alguna forma de hacerlo sin tener que pasar por todas las secuencias y recuentos de computación?
Entonces, para las cadenas de Markov, supongo que solo te interesan las transiciones de estado. Puede agrupar todas las transiciones de estado en una única matriz Nx2 y luego contar el número de veces que aparece una fila.
Para este ejemplo estoy usando tres observaciones de longitud 4, 3 y 3. Puedo usar cellfun para agrupar todas las transiciones de estado juntas en una matriz única de la siguiente manera:
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)'';
Lo cual me da las transiciones observadas (1->2, 2->3, 3->4 ...)
:
alltransitions =
1 2
2 3
3 4
4 5
5 6
3 4
4 5
Para configurar la matriz de transición, puede seguir los consejos enumerados aquí y contar las filas de todas sus transiciones:
[uniqueTransitions, ~, i]=unique(alltransitions,''rows'',''stable'');
v=arrayfun(@(x) sum(i==x),1:size(uniqueTransitions,1))'';
p = v/sum(v);
Mi vector p contiene mi probabilidad de transición, entonces puedo continuar y construir una matriz dispersa
transitionMatrix = sparse(uniqueTransitions(:,1), uniqueTransitions(:,2), p, 6,6)
lo que resulta en:
transitionMatrix =
(1,2) 0.1429
(2,3) 0.1429
(3,4) 0.2857
(4,5) 0.2857
(5,6) 0.1429
Esta quizás sea una forma más fácil de calcular la matriz de probabilidad de transición (TPM) para una secuencia de datos dada (un vector) como esta:
myS = {S1, S2, S1, S3, ...} con tantos estados como tenga;
TPM = hmmestimate (myS, myS);
La función hmmestimate se define bajo modelos ocultos de markov en MATLAB.