(делая записи условными вероятностями). Поскольку я не люблю делить на 0, приведенный выше код оставляет ряд нулей без изменений. Невозможно оценить вероятности перехода из данного состояния, если переходы из этого состояния не наблюдались.

тавьте, что у меня есть серия из 4 возможных марковских состояний (A, B, C, D):

X = [A, B, B, C, B, A, D, D, A, B, A, D, ....]

Как я могу сгенерировать матрицу преобразования Маркова, используя Python? Матрица должна быть 4 на 4, показывая вероятность перехода из каждого состояния в другие 3 состояния. Я просматривал много примеров в Интернете, но во всех них приведена матрица, а не рассчитана на основе данных. Я также изучал hmmlearn, но нигде не читал о том, как заставить его выплевывать матрицу переходов. Есть ли библиотека, которую я могу использовать для этой цели?

Вот код R для точного, что я пытаюсь сделать в Python:https://stats.stackexchange.com/questions/26722/calculate-transition-matrix-markov-in-r

 John Coleman10 окт. 2017 г., 03:18
В сыром Python вам нужно будет использовать список списков. Такого рода вещи более естественно сделаны вnumpy или жеpandas, Если вы хотите использовать один из этих инструментов, возможно, вы можете добавить соответствующий тег. В любом случае, что является причиной вашей проблемы? Конечный список состояний?

Ответы на вопрос(1)

Решение Вопроса

Это может дать вам несколько идей:

transitions = ['A', 'B', 'B', 'C', 'B', 'A', 'D', 'D', 'A', 'B', 'A', 'D']

def rank(c):
    return ord(c) - ord('A')

T = [rank(c) for c in transitions]

#create matrix of zeros

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

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

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

#print M:

for row in M:
    print(row)

выход:

[0.0, 0.5, 0.0, 0.5]
[0.5, 0.25, 0.25, 0.0]
[0.0, 1.0, 0.0, 0.0]
[0.5, 0.0, 0.0, 0.5]

На редактировать Вот функция, которая реализует вышеуказанные идеи:

#the following code takes a list such as
#[1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1]
#with states labeled as successive integers starting with 0
#and returns a transition matrix, M,
#where M[i][j] is the probability of transitioning from i to j

def transition_matrix(transitions):
    n = 1+ max(transitions) #number of states

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

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

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

#test:

t = [1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1]
m = transition_matrix(t)
for row in m: print(' '.join('{0:.2f}'.format(x) for x in row))

Выход:

0.67 0.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.50 0.12 0.12 0.25 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00
0.00 0.00 0.00 0.50 0.50 0.00 0.00 0.00 0.00
0.00 0.20 0.00 0.00 0.20 0.60 0.00 0.00 0.00
0.17 0.17 0.00 0.00 0.17 0.33 0.00 0.17 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
0.00 0.33 0.00 0.00 0.00 0.33 0.00 0.00 0.33
 John Coleman10 окт. 2017 г., 19:08
@ st19297 Я только что заменил глобальныйn со строкойn (делая записи условными вероятностями). Поскольку я не люблю делить на 0, приведенный выше код оставляет ряд нулей без изменений. Невозможно оценить вероятности перехода из данного состояния, если переходы из этого состояния не наблюдались.
 st1929710 окт. 2017 г., 18:23
Спасибо, Джон. Единственное, что полученная из вашего кода матрица переходов - это не совсем матрица переходов Маркова. Ваш код делит ячейки строк на n = 11. Есть ли в любом случае, вы можете удобно исправить код, чтобы дать таблицу на скриншоте, который я добавил к вопросу"Обновить" раздел?

Ваш ответ на вопрос