Mathematics">
tpmarkov
tpmarkov
tpmarkov
July 9, 2020
1.1 Consignes
Vous répondrez aux questions en modifiant ce notebook. En insérant des cellules de type Mark-
down pour le texte et des cellules de type code pour le code.
Ensuite vous sauvez ce notebook sous le nom Prenom_Nom_tpmarkov.ipynb et vous le déposez
sur Moodle
pla=np.array([[0.5,0.5],[0.1,0.9]])
pla
rnd.choice(a=2,p=pla[0])
[1]: 0
1
dim=len(pla[0])
for i in np.arange(1,n):
x[i]=rnd.choice(a=dim,p=pla[x[i-1]])
[2]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1])
Ecrire une fonction genmarkov(x,n,p) qui simule une chaîne de markov de matrice de transition p
issue de x et qui renvoie la valeur Xn−1 (ω ). On écrira également la fonction vgenmarkov qui elle
renvoie le vecteur des valeurs ( X0 (ω ), ..., Xn−1 (ω )).
Pour le climat à Los Angeles, vérifiez que la proportion de temps passé dans chaque état converge
vers un nombre qui ne dépend que de cet état et pas du point de départ.
[3]: n=5000
z=vgenmarkov(1,n,pla)
(z==0) #donne un vecteur de booleen
(z==0).sum() #donne le nombre de fois ou l'on est passe dans l'etat 0
(z==0).mean() #donne la moyenne empirique
(z==0).cumsum() #donne le vecteur des sommes cumulees
y=(z==0).cumsum()/np.arange(1,len(z)+1) #donne le vecteur des moyennes de 0
---------------------------------------------------------------------------
<ipython-input-3-da6a850e0e43> in <module>()
1 n=5000
----> 2 z=vgenmarkov(1,n,pla)
3 (z==0) #donne un vecteur de booleen
4 (z==0).sum() #donne le nombre de fois ou l'on est passe dans l'etat 0
5 (z==0).mean() #donne la moyenne empirique
[4]: plt.plot(y)
---------------------------------------------------------------------------
2
<ipython-input-4-9436e2a700a8> in <module>()
----> 1 plt.plot(y)
[20]: p3=np.array([[7/20,3/20,1/4,1/4],[3/10,1/4,7/20,1/10],[1/4,1/4,7/20,3/20],[3/
,→10,1/4,1/4,1/5]])
p4=np.array([[1/2,0,0,0,1/2],[0,1/2,0,1/2,0],[0,0,1,0,0],[0,1/4,1/4,1/4,1/4],[1/
,→2,0,0,0,1/2]])
3
1.3 Calcul des probabilités de transition
On utilise également la matrice de transition p = pt suivante
[212]: pt=np.array([[1/2,0,1/2,0],[0,1,0,0],[1/2,0,0,1/2],[0,1/2,0,1/2]])
pt
Utiliser la loi forte des grands nombres pour calculer, pour les matrices p3, p4 des valeurs ap-
(n) (n) (n)
prochées de p2,3 , p3,3 , p1,4 pour les valeurs de n suivantes n = 2, 5, 10, 20. Par exemple, vous faites
N=1000 (ou N=10000, ou N=50000) simulations de la chaîne de Markov issue de 2, puis vous
comptez la proportion de fois où vous observez la valeur 3
Vérifier vos simulations en utilisant le calcul matriciel. Sous Python, le produit matriciel des
matrices p et q s’écrit np.dot(p,q) ce qui est très différent de p ∗ q. Ecrivez une fonction puis(p,n)
qui renvoie la matrice pn . (Vous pouvez utiliser un algorithme de calcul rapide de puissance si
vous savez le coder).
[213]: p=np.array([[1,0,0,0,0],[0,1,0,0,0],[3/20,1/10,3/10,1/5,1/4],[1/5,3/20,3/20,7/
,→20,3/20],[0,0,0,0,1]])
[213]: array([[ 1. , 0. , 0. , 0. , 0. ],
[ 0. , 1. , 0. , 0. , 0. ],
[ 0.15, 0.1 , 0.3 , 0.2 , 0.25],
[ 0.2 , 0.15, 0.15, 0.35, 0.15],
[ 0. , 0. , 0. , 0. , 1. ]])
En utilisant la loi forte des grands nombres, calculer une valeur approchée de la probabilité que la
chaîne de Markov, issue de 4, réussisse à atteindre l’état 2.
Essayons maintenant de répondre à la même question en utilisant le calcul matriciel. Ecrire la
matrice de la chaîne absorbee P̃ sous la forme canonique
Q R
P̃ =
0 I
Puis utiliser la fonction np.linalg.inv pour calculer N = ( I − Q)−1 et enfin retrouver le calcul
précédent de la probabilité d’absorption en 2 lorsque l’on part de 4.
4
1.5 Détermination de probabilités invariantes
On peut chercher les valeurs et vecteurs propres de la matrice pla
[214]: np.linalg.eig(pla)
N’oublions pas que le vecteur 1 dont toutes les coordonnées sont des 1 est un vecteur propre avec
la valeur propre 1. Ici nous cherchons une probabilité invariante, i.e. un vecteur propre à gauche.
Il faut donc déterminer le spectre de la transposée
[215]: v,w=np.linalg.eig(pla.T)
[216]: v
[217]: w
[218]: False
[219]: True
Ecrire une fonction probinv(p) qui prenne en paramètre une matrice stochastique p et qui retourne
une probabilité invariante pour p. N’oubliez pas de normaliser le vecteur propre pour obtenir une
probabilité.
Tester cette fonction avec pla et la matrices de transition pt et celle de l’exercice 4.10.
5
[220]: p7=np.array([[2/3,0,1/3],[1/3,1/3,1/3],[0,1,0]])
p7
[221]: 0.0
fig = Image(filename=('./graphepr.png'))
fig
[222]:
6
[1]:
[ ]: