Генерация цепи Маркова из матрицы перехода - PullRequest
2 голосов
/ 22 января 2020

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

days=['rain', 'rain', 'rain', 'clouds', 'rain', 'sun', 'clouds', 'clouds', 
  'rain', 'sun', 'rain', 'rain', 'clouds', 'clouds', 'sun', 'sun', 
  'clouds', 'clouds', 'rain', 'clouds', 'sun', 'rain', 'rain', 'sun',
  'sun', 'clouds', 'clouds', 'rain', 'rain', 'sun', 'sun', 'rain', 
  'rain', 'sun', 'clouds', 'clouds', 'sun', 'sun', 'clouds', 'rain', 
  'rain', 'rain', 'rain', 'sun', 'sun', 'sun', 'sun', 'clouds', 'sun', 
  'clouds', 'clouds', 'sun', 'clouds', 'rain', 'sun', 'sun', 'sun', 
  'clouds', 'sun', 'rain', 'sun', 'sun', 'sun', 'sun', 'clouds', 
  'rain', 'clouds', 'clouds', 'sun', 'sun', 'sun', 'sun', 'sun', 'sun', 
  'clouds', 'clouds', 'clouds', 'clouds', 'clouds', 'sun', 'rain', 
  'rain', 'rain', 'clouds', 'sun', 'clouds', 'clouds', 'clouds', 'rain', 
  'clouds', 'rain', 'sun', 'sun', 'clouds', 'sun', 'sun', 'sun', 'sun',
  'sun', 'sun', 'rain']

Я создаю матрицу перехода, используя:

pd.crosstab(pd.Series(days[1:],name='Tomorrow'),
            pd.Series(days[:-1],name='Today'),normalize=1)

вывод:

Today      clouds      rain       sun
Tomorrow                             
clouds    0.40625  0.230769  0.309524
rain      0.28125  0.423077  0.142857
sun       0.31250  0.346154  0.547619

Теперь я хочу сгенерировать вывод, используя матрицу выше. Итак, предположим, что моей случайной начальной точкой будет «дождь», тогда результат будет (например):

[rain, rain, clouds, sun] 

К сожалению, я могу найти решения, только если матрица составлена ​​с использованием словарей.

Редактировать: Я использовал:

pd.crosstab(pd.Series(word[:-1],name='Current'),
            pd.Series(word[1:],name='Next'),normalize=0)

Моя собственная матрица:

Next    a    b      c          d         e   f   g   h
Current                             
a      0.0  0.0 0.428571    0.571429    0.0 0.0 0.0 0.0
b      0.0  0.0 0.230769    0.769231    0.0 0.0 0.0 0.0
c      0.0  0.0 0.000000    0.000000    0.0 0.0 1.0 0.0
d      0.0  0.0 0.000000    0.000000    0.0 0.0 0.0 1.0
e      1.0  0.0 0.000000    0.000000    0.0 0.0 0.0 0.0
f      0.0  1.0 0.000000    0.000000    0.0 0.0 0.0 0.0
g      0.0  0.0 0.000000    0.000000    1.0 0.0 0.0 0.0
h      0.0  0.0 0.000000    0.000000    0.0 1.0 0.0 0.0

1 Ответ

1 голос
/ 22 января 2020

Должны работать следующие функции - get_next_term генерирует следующий член в цепочке с учетом матрицы перехода и предшествующего члена, а make_chain создает цепочку длиной n с учетом матрицы перехода и начального члена.

Код:

import random
def get_next_term(t_s):
    return random.choices(t_s.index, t_s)[0]

def make_chain(t_m, start_term, n):
    chain = [start_term]
    for i in range(n-1):
        chain.append(get_next_term(t_m[chain[-1]]))
    return chain

Использование:

>>> make_chain(transition_mat, 'rain', 5)
['rain', 'rain', 'clouds', 'clouds', 'sun']

С вашими данными:

>>> make_chain(transition_mat2, 'a', 8)
['a', 'e', 'g', 'c', 'a', 'e', 'g', 'c']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...