Реализация матрицы вероятностей перехода Маркова в Python - PullRequest
0 голосов
/ 03 сентября 2018

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

sample = [1,1,2,2,1,3,2,1,2,3,1,2,3,1,2,3,1,2,1,2]
import numpy as np

def onestep_transition_matrix(transitions):
    n = 3 #number of states

    M = [[0]*n for _ in range(n)]

    for (i,j) in zip(transitions,transitions[1:]):
        M[i-1][j-1] += 1

    #now convert to probabilities:
    for row in M:
        s = sum(row)
        if s > 0:
            row[:] = [f/s for f in row]
    return M

one_step_array = np.array(onestep_transition_matrix(sample))

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

two_step_array = array([[1/7,3/7,3/7],
                       [4/7,2/7,1/7],
                       [1/4,3/4,0]])

Тем не менее. np.dot (one_step_array, one_step_arrary) дает мне результат, который отличается от следующего:

array([[0.43080357, 0.23214286, 0.33705357],
   [0.43622449, 0.44897959, 0.11479592],
   [0.20089286, 0.59821429, 0.20089286]])

Пожалуйста, дайте мне знать, какой из них правильный.

1 Ответ

0 голосов
/ 03 сентября 2018

Вам просто нужно изменить индекс переходов в цикле for:

def twostep_transition_matrix(transitions):
    n = 3 #number of states

    M = [[0]*n for _ in range(n)]

    for (i,j) in zip(transitions,transitions[2:]):
        M[i-1][j-1] += 1

    #now convert to probabilities:
    for row in M:
        s = sum(row)
        if s > 0:
            row[:] = [f/s for f in row]
    return M
...