2015-11-17 9 views
0

Я пытаюсь запустить кадр данных через несколько переходов марковской модели для класса.несколько переходов марковской модели

Кадр данных выглядит следующим образом:

df = pd.DataFrame({'Bull Market': [.9, .8, .5], 
        'Bear Market': [.25, .05, .25], 
        'Stagnant Market': [.75, .15, .25] 
        }, 
        index=["Bull Market", "Bear Market", "Stagnant Market"]) 

У меня есть этот код для запуска через два раза:

print(df.dot(df)) 

мне нужно, чтобы запустить его через раз модель X. Мне было трудно найти документацию на dot(), но из того, что я нашел, не кажется, что вы можете запустить ее через X раз.

Любая помощь будет оценена, спасибо!

ответ

0

Это не так, как работает цепь Маркова. Вам нужно начальное состояние (в этом случае либо [1,0,0], [0,1,0], либо [0,0,1]), то вы оставите умножить матрицу перехода на вектор состояния, тогда умножить матрицу перехода на вновь достигнутый вектор состояния и т. д. Вы не умножаете матрицу перехода сами по себе. Если вам нужно понять, что происходит после определенного количества переходов, вы можете просто пропустить X-время и выполнить умножение матричных векторов X. Если вы хотите стабильное состояние, вам нужно найти доминирующий собственный вектор, который вы можете сделать, используя numpy.linalg.eig. Обратите также внимание на то, что это не будет работать с матрицей перехода, поскольку эти строки не являются распределением вероятности.

Редактировать: Хорошо, я думаю, что вижу, что вы пытаетесь сделать. Из-за того, как работает матричное векторное умножение, вы также можете просто увеличить размер матрицы, затем умножить ее на исходный вектор состояния и получить тот же результат, как если бы вы итеративно умножали каждый промежуточный результат. Вы можете использовать numpy.linalg.matrix_power для этого. И я вижу, что вы получили эту матрицу из Википедии. Вы просто недочитали некоторые из этих чисел, то есть должны быть 0.025, а не 0.25. Очень важно, чтобы каждая строка подводит к 1.

Этот код воспроизводит пример из Википедии:

import numpy as np 

T = np.array([[0.9, 0.075, 0.025], 
       [0.15, 0.8, 0.05], 
       [0.25, 0.25, 0.5]]) 
start = np.array([0, 1, 0]) 

def find_state_after_n(start, T, n): 
    Tmult = np.linalg.matrix_power(T, n) 
    state = np.dot(start, Tmult) 
    return state 

find_state_after_n(start, T, 3) 

array([ 0.3575 , 0.56825, 0.07425]) 
+0

Спасибо за вашу помощь. Я создал матрицу, основанную на диаграмме, которую я дал для моего класса, с тремя разными элементами/столбцами (я не знаю правильной терминологии.) Пример проблемы, которую я получил, имел только два, поэтому я был очень смущен относительно того, как чтобы сопоставить три столбцовой матрицы, чтобы она равнялась 1. Моя настройка работала равной 1, просто не в правильном порядке, как вы упомянули. Я просмотрю ваш код, а также запись в Википедии, которую вы нашли. Дополнительная заметка, в примере, который я дал, столбцы равны 1 вместо строк. Я продолжу исследовать больше примеров этого в действии. –

+0

Это действительно работает в любом случае. Если вы используете транспонирование этой матрицы, чтобы столбцы суммировались с 1 вместо строк, вам просто нужно умножить умножение, то есть выше изменить 'state = np.dot (start, Tmult)' на 'state = np.dot (Tmult, start) '. –

 Смежные вопросы

  • Нет связанных вопросов^_^