Python, simulation chaîne de Markov

Bonsoir, j'aimerais simuler une chaîne de Markov à temps discret à valeurs dans $\mathbb{N}^2$ sous Python. Je sais le faire pour une dimension, mais pour deux dimensions j'ai des problèmes pour la définition de la matrice de transition dans la machine. Car à une dimension $P=(P_{ij})_{ij}$ ici $i $ et $j $ sont des entiers. Par contre à deux dimensions ce sont des vecteurs.
Merci d'avance pour votre aide.

Réponses

  • Bonsoir,

    Une remarque tout d'abord : très souvent c'est un peu pénible de revenir à la matrice de transition pour la simulation. Est-ce que dans ton cas ce ne serait pas plus simple de simuler directement? Par exemple si c'est une marche aux plus proches voisins, autant juste tirer des directions aléatoires à chaque coup.

    Sinon tu as deux options : soit faire des listes de listes de listes de listes (pour avoir de la dimension ), soit définir une fonction à 4 arguments.
  • Comment as-tu écrit ton script ?
    C’est très vague, là.
    Tu coinces parce que tu n’arrives pas à créer un dictionnaire avec une liste comme clé ? Si c’est le cas, utilise un tuple.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Voici le code que j'utilise pour simuler pour une dimension.
    import numpy as np
    import matplotlib.pyplot as plt
    #Fonction générant une v.a de loi $P_i $
    def generate(i,P):
    #taille de la matrice  $P $
    [nrow,ncol]=np.shape(P)
    #Somme cumulé de chaque ligne de $P $
    scP=np.cumsum(P,axis=1)
    #tirage de v.a uniforme sur $(0,1) $
    u=np.random.uniform (1)
    if u<=scP[i,0]:
          return(0)
    else:
           for j in range(1,ncol):
                  if scP[i,j-1]<u and u<=scP[i,j]:
                       return(j)
                        break 
    #fonction simulant les trajectoires de la chaîne de #Markov 
    def Simul_Markov(P,n,init):
    #vecteur trajectoire X
              X=np.zeros(n,dtype=np.int)
               X[0]=init
               for k in range(1,n):
                      X[k]=generate(X[k-1],P)
                plt.plot(X)
                plt.show()
    
    La matrice de transition du processus dont je veux simuler est la suivante:
    \[P\left((a,b,c), (d,e,f)\right)=\begin{cases}
    \frac{\mu b}{\mu b+\lambda b \frac{a}{N}} &\mbox{ si } e=a,\,d=b-1\text{ et }f=c+1\\
    \frac{\lambda b \frac{a}{N}}{\mu b+\lambda b \frac{a}{N}} &\mbox{ si } e=a-1,\,d=b+1\text{ et }f=c\\0&\mbox{ sinon}\end{cases}\]où $\mu,\,\lambda\text{N} $ sont des paramètres bien définis.
  • La remarque de Lucas s'applique parfaitement.
    De chaque point, il y a au plus deux successeurs possibles; pas besoin de matrice.
  • Oui tu as raison. Ça marche.
    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.