J'écrirai un article sur la probabilité de transition de la chaîne de Markov.
Plus précisément, nous allons introduire une fonction qui obtient la probabilité de transition à partir de données de séries temporelles et crée une matrice. Notez que ce n'est pas une introduction aux fonctions qui traitent de la matrice de probabilité de transition de la chaîne de Markov.
J'écrirai des informations détaillées à partir de "2. Qu'est-ce que la chaîne de Markov?" Si vous ne voulez connaître que le code, je pense qu'il suffit de se référer à "3. Fonction pour trouver la probabilité de transition".
Vous trouverez ci-dessous la définition de la chaîne de Markov sur Wikipedia.
Si l'état actuel est déterminé par une série de variables stochastiques X1, X2, X3, ..., les états passés et futurs sont indépendants.
Source: https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9% 8E% 96
Ce qui suit est la formule de la chaîne de Markov écrite dans Wikipedia.
Pr(X_{n+1}=x | X_n=x_n,..., X_1=x_1,X_0=x_0) = Pr(X_{n+1}=x_{n+1} | X_n=x_n)
Les valeurs possibles de> Xi sont appelées espace d'états de chaîne et forment un ensemble dénombrable S. La chaîne de Markov est représentée par un graphe orienté et l'arête montre la probabilité de transition d'un état à un autre.
Un exemple de chaîne de Markov est une machine à états finis. Cela signifie que s'il est dans l'état y au temps n, la probabilité qu'il passe à l'état x au temps n + 1 dépend uniquement de l'état actuel, pas du temps n.
Source: https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9% 8E% 96
La probabilité exprimée par la formule suivante est appelée probabilité de transition.
Pr(X_{n+1}| X_n)
Source: https://mathtrain.jp/markovchain
La probabilité de transition est en fait calculée, mais je pense que c'est difficile à imaginer avec juste les définitions et les expressions. Prenons la météo comme exemple.
tenki = np.array([0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1])
print('Jours ensoleillés:{0}journée, 曇のjournée数:{1}journée, 雨のjournée数:{2}journée'.format(np.count_nonzero(data==0), np.count_nonzero(data==1), np.count_nonzero(data==2))))
production
Jours ensoleillés:Le 20,Jours nuageux:Le 8,Jours de pluie:Jour 2
En regardant ce qui précède, vous pouvez voir en un coup d'œil que le temps ensoleillé est le plus ensoleillé, suivi du temps nuageux et du temps pluvieux. Cependant, le but est "comment le temps a changé".
Par conséquent, je veux une matrice avec la probabilité de transition connue (Fig.1), mais je ne peux pas la trouver en recherchant.
Alors, créons une fonction.
J'utilise Python 3.7.1. L'environnement d'utilisation est le notebook Jupyter.
import numpy as np
import copy
import itertools
import seaborn as sns
seaborn n'a pas à être inclus fonctionnellement, mais il est inclus car il sera visualisé plus tard.
Cette fois, j'utiliserai tenki.
def tp(transition_probability):
data = transition_probability
zero = np.zeros((np.max(data)+1,np.max(data)+1))
for i in range(len(data)-1):
j = copy.deepcopy(i)
j += 1
for x, y in itertools.product(range(np.max(data)+1), range(np.max(data)+1)):
if data[i] == x and data[j] == y:
zero[x][y] += 1
row_sum = np.sum(zero, axis=1).reshape((np.max(data)+1,1))
prob = zero / row_sum
return prob
zero
Il y a trois éléments d'information utilisés dans tenki, "0-2". --Par conséquent, si vous prenez "np.max (data) +1", vous pouvez créer une matrice 0 avec une valeur maximale * une valeur maximale.
(Nous pouvons gérer 3 ou plus ou moins.) --Traitement pour
"I, j" représente respectivement Xn * et * Xn + 1 *. ―― «X, y» représente respectivement la colonne et la ligne de la variable «zéro».
Lors du traitement dans for, une combinaison concrète est saisie dans la variable "zéro".
row_sum
L'intérieur de la variable "zéro" est les données de comptage.
Le nombre total est donné pour chaque ligne.
prob
La somme de chaque ligne est divisée par la valeur individuelle de chaque ligne.
Vous avez maintenant une matrice de probabilités de transition.
print(tp(data))
production
[[0.65 0.25 0.1 ]
[0.57142857 0.42857143 0. ]
[1. 0. 0. ]]
Cela seul est un peu triste, alors visualisons-le.
sns.heatmap(tp(data), cmap='Blues', vmin=0, vmax=1, center=.5,
square=True, cbar_kws={"shrink": .5},
xticklabels = 1, yticklabels = 1)
Dans cette carte de chaleur, l'axe de gauche représente * Xn * et l'axe du bas représente * Xn + 1 *.
J'ai écrit une fonction sur la probabilité de transition de la chaîne de Markov, mais comment était-ce? Je vous serais reconnaissant de bien vouloir souligner les points difficiles à comprendre ou incorrects.
・ Chaîne de Markov (Wikipedia) https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9%8E%96
・ Les bases de la chaîne de Markov et l'équation de Kormogorov (une belle histoire de mathématiques au lycée) https://mathtrain.jp/markovchain
Recommended Posts