Aller au contenu

Calculez des probabilités d'absorption

Vous jouez à pile ou face contre un ami, un euro par lancer. Vous avez 3 €, lui 2 €, et la partie s’arrête quand l’un de vous deux est ruiné. Quelle est votre probabilité de gagner ? Combien de lancers faudra-t-il en moyenne ? La partie finira forcément (les états « ruiné » sont absorbants), mais où et quand ?

Au chapitre 2, vous avez appris à repérer les classes transitoires et les classes fermées. Ici, vous allez calculer ce qui se passe entre les deux : la probabilité d’être absorbé par chaque classe fermée, et le temps moyen pour y arriver. Nous suivrons la ruine du joueur, un exemple classique du cours, puis nous reviendrons au visiteur du site de presse.

Notons XnX_n votre fortune après nn lancers et KK la fortune totale en jeu (ici K=5K = 5). À chaque lancer, vous gagnez un euro avec probabilité pp et en perdez un avec probabilité q=1−pq = 1 - p. Les états sont 0,1,…,K0, 1, \dots, K :

  • depuis i∈{1,…,K−1}i \in \lbrace 1, \dots, K-1 \rbrace : pi,i+1=pp_{i,i+1} = p et pi,i−1=qp_{i,i-1} = q ;
  • 00 (vous êtes ruiné) et KK (votre ami est ruiné) sont absorbants : p00=pKK=1p_{00} = p_{KK} = 1.
q q q q
0 ◄──── 1 ◄───► 2 ◄───► 3 ◄───► 4 ────► 5
p p p p
(0 et 5 bouclent sur eux-mêmes avec probabilité 1)

Les états 1 à 4 forment une classe ouverte, donc transitoire ; {0}\lbrace 0 \rbrace et {5}\lbrace 5 \rbrace sont deux classes fermées. La chaîne sera absorbée en 0 ou en 5 avec probabilité 1. Reste à savoir avec quelle probabilité chacun.

0246810lancer0 €1 €2 €3 €4 €5 €votre fortunevous ruinez votre ami (5 parties sur 8)vous êtes ruiné (3 parties sur 8)
Huit parties simulées avec une pièce équilibrée, toutes parties de 3 €. Chacune erre dans les états transitoires 1 à 4 puis se fige dans un état absorbant : ruine (0 €) ou victoire (5 €).

L’idée clé du chapitre tient en une phrase : pour calculer une grandeur depuis l’état ii, regardez où va la chaîne au premier pas, puis utilisez la propriété de Markov.

Notons hih_i la probabilité de finir en KK (vous gagnez) en partant de ii. Depuis ii, au premier lancer, on va en i+1i+1 avec probabilité pp, en i−1i - 1 avec probabilité qq, et ensuite tout recommence depuis ce nouvel état. D’où le système :

h0=0,hK=1,hi=p hi+1+q hi−1(0<i<K).h_0 = 0, \qquad h_K = 1, \qquad h_i = p\, h_{i+1} + q\, h_{i-1} \quad (0 < i < K).

Plus généralement, pour une chaîne quelconque et un ensemble d’états cible CC, la probabilité hih_i d’atteindre CC depuis ii vérifie

hi=1 si i∈C,hi=∑jpij hj sinon,h_i = 1 \text{ si } i \in C, \qquad h_i = \sum_{j} p_{ij}\, h_j \text{ sinon},

avec hi=0h_i = 0 pour les états d’où CC est inaccessible (les autres classes fermées). C’est exactement ce que vous avez fait au chapitre 2 pour calculer une probabilité de retour.

On calcule de la même façon le temps moyen d’absorption kik_i, c’est-à-dire le nombre moyen de pas avant d’atteindre un état absorbant. Le premier pas coûte 1, puis tout recommence :

ki=0 si i est absorbant,ki=1+∑jpij kj sinon.k_i = 0 \text{ si } i \text{ est absorbant}, \qquad k_i = 1 + \sum_j p_{ij}\, k_j \text{ sinon}.

Pour la ruine du joueur équitable, la solution est ki=i (K−i)k_i = i\,(K - i). Partant de 3 € sur 5, la partie dure en moyenne 3×2=63 \times 2 = 6 lancers.

012345fortune de départ i (€)0,000,250,500,751,000,00,20,40,60,81,0probabilitédegagner:hii=/5012345fortune de départ i (€)0246046640duréemoyenne:kiii=(5−)
Jeu équitable : la probabilité de gagner croît en ligne droite (chaque h_i est la moyenne de ses voisins), la durée moyenne est une parabole, maximale au milieu. Depuis 3 € (cercle orange) : 0,6 et 6 lancers.

Pour une grande chaîne, on écrit ces systèmes sous forme matricielle. On range les états transitoires en premier, les états absorbants ensuite. La matrice de transition prend alors la forme canonique :

P=(QR0I)P = \begin{pmatrix} Q & R \\ 0 & I \end{pmatrix}
  • QQ contient les transitions entre états transitoires ;
  • RR contient les transitions des états transitoires vers les états absorbants ;
  • 00 et II traduisent le fait qu’un état absorbant ne mène qu’à lui-même.

On définit alors la matrice fondamentale

N=(I−Q)−1=I+Q+Q2+Q3+⋯N = (I - Q)^{-1} = I + Q + Q^2 + Q^3 + \cdots

Son coefficient NijN_{ij} est le nombre moyen de passages par l’état transitoire jj quand on part de ii : chaque terme QnQ^n compte la probabilité d’être en jj au pas nn, et la somme compte les passages. On en déduit tout le reste :

  • temps moyens d’absorption : k=N 1k = N\,\mathbf{1}, où 1\mathbf{1} est le vecteur colonne de 1 (on somme les passages dans tous les états transitoires) ;
  • probabilités d’absorption : B=N RB = N\,R, où BiaB_{ia} est la probabilité d’être absorbé en aa en partant de ii (on passe un certain nombre de fois par chaque état transitoire, puis on sort vers aa).
1,61,20,80,4départ 1 €en 1 €40,21,22,41,60,8départ 2 €en 2 €60,40,81,62,41,2départ 3 €en 3 €60,60,40,81,21,6départ 4 €en 4 €40,8N : passages moyensk = N1P(gagner)=ligne « 3 € » : 0,8 + 1,6 + 2,4 + 1,2 = 6 lancers, dont 2,4 avec exactement 3 €
Chaque ligne de N répartit la durée de la partie entre les états visités : depuis 3 €, on passe en moyenne 0,8 + 1,6 + 2,4 + 1,2 = 6 lancers, c'est la somme qui donne k. La diagonale, plus foncée, rappelle qu'on repasse souvent par son point de départ.

Et si la pièce est défavorable ? Avec p=0,4p = 0{,}4, le calcul matriciel donne une probabilité de gagner de 0,360 seulement depuis 3 €, pour une durée moyenne d’environ 6,0 lancers. Un faible désavantage à chaque lancer se transforme en un net désavantage sur la partie. L’exercice 3 pousse ce constat jusqu’au casino.

0 €1 €2 €3 €4 €5 €fortune de départ0,00,20,40,60,81,0probabilité de gagner la partie0,60,360−0,2 € par lancer en moyennepièce équilibrée, p = 0,5pièce défavorable, p = 0,4
Une pièce à peine défavorable creuse toute la courbe : depuis 3 €, la probabilité de gagner tombe de 0,6 à 0,360, alors que le désavantage n'est que de 0,2 € par lancer.

Au chapitre 2, nous avions établi que tout visiteur finit abonné ou parti. Calculons maintenant les probabilités. La classe fermée « Abonné, Vidéo » se traite comme un seul état absorbant (une fois entré, on n’en sort plus), de même que Départ. Avec les états transitoires dans l’ordre Accueil, Recherche, Article :

Q=(00,30,40,300,70,300,2),R=(00,3000,10,4)Q = \begin{pmatrix} 0 & 0{,}3 & 0{,}4 \\ 0{,}3 & 0 & 0{,}7 \\ 0{,}3 & 0 & 0{,}2 \end{pmatrix}, \qquad R = \begin{pmatrix} 0 & 0{,}3 \\ 0 & 0 \\ 0{,}1 & 0{,}4 \end{pmatrix}

(la première colonne de RR mène à l’abonnement, la seconde au départ). Le calcul donne :

Point d’entréeProbabilité de s’abonnerProbabilité de partirClics moyens avant absorption
Accueil0,1120,8883,03
Recherche0,1500,8503,58
Article0,1670,8332,39

Un visiteur qui arrive directement sur un article (depuis un moteur de recherche, par exemple) s’abonne plus souvent que celui qui arrive par l’accueil. Et le coefficient NArticle,Article≈1,67N_{\text{Article},\text{Article}} \approx 1{,}67 est bien le nombre moyen de pages « Article » calculé à l’exercice 3 du chapitre 2.

0,000,250,500,751,00probabilité d’absorptionentrée : Accueilentrée : Rechercheentrée : Article0,1120,888 · 3,03 clics en moyenne0,1500,850 · 3,58 clics en moyenne0,1670,833 · 2,39 clics en moyennes’abonnepart
Quelle que soit la porte d'entrée, la grande majorité des visiteurs part ; mais ceux qui arrivent par un article s'abonnent environ une fois et demie plus souvent que ceux qui arrivent par l'accueil.
import numpy as np
# États transitoires : Accueil, Recherche, Article ; absorbants : Abonné, Départ
Q = np.array([[0.0, 0.3, 0.4],
[0.3, 0.0, 0.7],
[0.3, 0.0, 0.2]])
R = np.array([[0.0, 0.3],
[0.0, 0.0],
[0.1, 0.4]])
N = np.linalg.inv(np.eye(3) - Q) # matrice fondamentale
k = N @ np.ones(3) # clics moyens avant absorption
B = N @ R # probabilités d'absorption
print(np.round(k, 2)) # [3.03 3.58 2.39]
print(np.round(B, 3)) # ligne Accueil : [0.112 0.888]
assert np.allclose(B.sum(axis=1), 1)

Le lien avec les processus de décision markoviens

Section intitulée « Le lien avec les processus de décision markoviens »

Regardez à nouveau l’équation des temps moyens : ki=1+∑jpij kjk_i = 1 + \sum_j p_{ij}\, k_j. Remplacez « 1 » par une récompense r(i)r(i) reçue dans l’état ii et ajoutez un facteur d’actualisation γ\gamma : vous obtenez

V(i)=r(i)+γ∑jpij V(j),V(i) = r(i) + \gamma \sum_j p_{ij}\, V(j),

l’équation de Bellman qui donne la valeur d’un état sous une politique fixée. Un processus de décision markovien, c’est une chaîne de Markov dont un agent choisit les transitions par ses actions, et l’évaluation d’une politique se résout exactement comme nos probabilités d’absorption : par conditionnement sur le premier pas, soit en résolvant un système linéaire, soit en itérant. Le cours d’Apprentissage par renforcement part de là.

  • Dans une chaîne finie, on finit toujours par quitter les classes transitoires ; la question est dans quelle classe fermée et en combien de temps.
  • Conditionnement sur le premier pas : hi=∑jpijhjh_i = \sum_j p_{ij} h_j (probabilité d’atteindre une cible), ki=1+∑jpijkjk_i = 1 + \sum_j p_{ij} k_j (temps moyen), avec les conditions aux bords.
  • Forme canonique P=(QR0I)P = \begin{pmatrix} Q & R \\ 0 & I \end{pmatrix} ; matrice fondamentale N=(I−Q)−1N = (I - Q)^{-1}, dont le coefficient NijN_{ij} est le nombre moyen de passages en jj depuis ii.
  • Temps moyens d’absorption k=N1k = N\mathbf 1 ; probabilités d’absorption B=NRB = NR.
  • Ruine du joueur équitable : gain avec probabilité i/Ki/K, durée moyenne i(K−i)i(K - i). Un léger désavantage par partie devient un fort désavantage global.
  • L’équation des temps moyens a la même forme que l’équation de Bellman des processus de décision markoviens.

Exercice · Petit contre gros

facile

Vous jouez à pile ou face équilibré, un euro par lancer, avec 2 € contre un adversaire qui en a 8. Quelle est votre probabilité de ruiner votre adversaire ? Combien de lancers dure la partie en moyenne ?

Voir la solution

Ici K=10K = 10 et i=2i = 2. Dans le cas équitable, hi=i/K=2/10=0,2h_i = i/K = 2/10 = 0{,}2 : vous gagnez une fois sur cinq. La durée moyenne vaut ki=i(K−i)=2×8=16k_i = i(K - i) = 2 \times 8 = 16 lancers. Le jeu est équitable (votre gain moyen est nul), mais le joueur le plus riche gagne le plus souvent.

En code

import numpy as np
K, p = 10, 0.5 # 10 € en jeu, pièce équilibrée
n = K - 1 # états transitoires 1, ..., 9
Q = np.diag([p] * (n - 1), 1) + np.diag([1 - p] * (n - 1), -1)
R = np.zeros((n, 2))
R[0, 0] = 1 - p # de 1 € vers la ruine (0)
R[-1, 1] = p # de 9 € vers la victoire (K)
N = np.linalg.inv(np.eye(n) - Q) # matrice fondamentale
i = 2 # vous partez avec 2 €
print((N @ R)[i - 1, 1]) # 0.2 : probabilité de ruiner l'adversaire
print(N.sum(axis=1)[i - 1]) # 16.0 lancers en moyenne

Exercice · Une souris dans un labyrinthe

moyen

Une souris se déplace entre deux salles, 1 et 2. Depuis la salle 1, elle y reste avec probabilité 0,2, passe en salle 2 avec probabilité 0,4 et tombe dans un piège (T) avec probabilité 0,4. Depuis la salle 2, elle passe en salle 1 avec probabilité 0,3, reste avec probabilité 0,2 et trouve le fromage (C) avec probabilité 0,5. Le piège et le fromage sont absorbants.

Calculez, depuis chaque salle, la probabilité de trouver le fromage et le nombre moyen de pas avant absorption.

Voir la solution

Notons h1,h2h_1, h_2 les probabilités de trouver le fromage :

  • h1=0,2 h1+0,4 h2h_1 = 0{,}2\,h_1 + 0{,}4\,h_2, soit 0,8 h1=0,4 h20{,}8\,h_1 = 0{,}4\,h_2, donc h2=2 h1h_2 = 2\,h_1 ;
  • h2=0,3 h1+0,2 h2+0,5h_2 = 0{,}3\,h_1 + 0{,}2\,h_2 + 0{,}5, soit 0,8 h2=0,3 h1+0,50{,}8\,h_2 = 0{,}3\,h_1 + 0{,}5.

En substituant, 1,6 h1=0,3 h1+0,51{,}6\,h_1 = 0{,}3\,h_1 + 0{,}5, d’où h1=0,5/1,3=5/13≈0,385h_1 = 0{,}5/1{,}3 = 5/13 \approx 0{,}385 et h2=10/13≈0,769h_2 = 10/13 \approx 0{,}769.

Pour les temps moyens :

  • k1=1+0,2 k1+0,4 k2k_1 = 1 + 0{,}2\,k_1 + 0{,}4\,k_2 ;
  • k2=1+0,3 k1+0,2 k2k_2 = 1 + 0{,}3\,k_1 + 0{,}2\,k_2, donc k2=(1+0,3 k1)/0,8k_2 = (1 + 0{,}3\,k_1)/0{,}8.

En substituant dans la première : 0,8 k1=1+0,5 (1+0,3 k1)=1,5+0,15 k10{,}8\,k_1 = 1 + 0{,}5\,(1 + 0{,}3\,k_1) = 1{,}5 + 0{,}15\,k_1, d’où k1=1,5/0,65=30/13≈2,31k_1 = 1{,}5/0{,}65 = 30/13 \approx 2{,}31 pas, puis k2=55/26≈2,12k_2 = 55/26 \approx 2{,}12 pas.

On peut vérifier avec la matrice fondamentale : Q=(0,20,40,30,2)Q = \begin{pmatrix} 0{,}2 & 0{,}4 \\ 0{,}3 & 0{,}2 \end{pmatrix}, N=(I−Q)−1N = (I - Q)^{-1} a pour sommes de lignes 30/1330/13 et 55/2655/26.

En code

import numpy as np
# États transitoires : salles 1 et 2 ; absorbants : piège T, fromage C
Q = np.array([[0.2, 0.4],
[0.3, 0.2]])
R = np.array([[0.4, 0.0],
[0.0, 0.5]])
N = np.linalg.inv(np.eye(2) - Q)
B = N @ R
k = N.sum(axis=1)
print(B[:, 1]) # [0.3846 0.7692] : trouver le fromage
print(k) # [2.3077 2.1154] : pas avant absorption
print(5/13, 10/13, 30/13, 55/26) # 0.3846 0.7692 2.3077 2.1154

Exercice · La ruine au casino

difficile

On joue avec une probabilité de gain p≠12p \neq \tfrac12 à chaque partie, et on note r=q/pr = q/p.

  1. Vérifiez que hi=1−ri1−rKh_i = \dfrac{1 - r^i}{1 - r^K} satisfait les équations hi=p hi+1+q hi−1h_i = p\,h_{i+1} + q\,h_{i-1} et les conditions h0=0h_0 = 0, hK=1h_K = 1.
  2. Retrouvez la probabilité 0,360 donnée dans le chapitre pour p=0,4p = 0{,}4, i=3i = 3, K=5K = 5.
  3. À la roulette, en misant sur une couleur, on gagne avec une probabilité légèrement inférieure à 1/2. Prenons p=0,49p = 0{,}49. Vous arrivez avec 50 € et comptez partir dès que vous aurez doublé votre mise (ou tout perdu). Quelle est votre probabilité de réussir ?
Voir la solution
  1. Les conditions aux bords sont immédiates : h0=0h_0 = 0 et hK=1h_K = 1. Pour l’équation, il suffit de vérifier que rir^i la satisfait (une constante la satisfait aussi, et l’équation est linéaire) : p ri+1+q ri−1=ri−1(pr2+q)p\,r^{i+1} + q\,r^{i-1} = r^{i-1}(p r^2 + q). Or pr2=q2/pp r^2 = q^2/p, donc pr2+q=q (q+p)/p=q/p=rp r^2 + q = q\,(q + p)/p = q/p = r, et on obtient bien rir^i.
  2. r=0,6/0,4=1,5r = 0{,}6/0{,}4 = 1{,}5, donc h3=1−1,531−1,55=1−3,3751−7,59375=−2,375−6,59375≈0,360h_3 = \dfrac{1 - 1{,}5^3}{1 - 1{,}5^5} = \dfrac{1 - 3{,}375}{1 - 7{,}59375} = \dfrac{-2{,}375}{-6{,}59375} \approx 0{,}360.
  3. r=0,51/0,49r = 0{,}51/0{,}49, i=50i = 50, K=100K = 100. Comme 1−r100=(1−r50)(1+r50)1 - r^{100} = (1 - r^{50})(1 + r^{50}), on a h50=11+r50h_{50} = \dfrac{1}{1 + r^{50}}. Or r50≈7,39r^{50} \approx 7{,}39, donc h50≈0,119h_{50} \approx 0{,}119. Avec un désavantage de seulement 1 point par partie, vous n’avez qu’environ 12 % de chances de doubler votre mise, contre 50 % dans un jeu équitable. C’est le principe du casino.

En code

import numpy as np
def h_formule(i, K, p):
r = (1 - p) / p
return (1 - r**i) / (1 - r**K)
def h_systeme(i, K, p):
"""Résout h_j = p h_{j+1} + q h_{j-1} avec h_0 = 0 et h_K = 1."""
n = K - 1
Q = np.diag([p] * (n - 1), 1) + np.diag([1 - p] * (n - 1), -1)
b = np.zeros(n); b[-1] = p
return np.linalg.solve(np.eye(n) - Q, b)[i - 1]
print(h_formule(3, 5, 0.4), h_systeme(3, 5, 0.4)) # 0.3602 0.3602
print(h_formule(50, 100, 0.49), h_systeme(50, 100, 0.49)) # 0.1192 0.1192
print((0.51 / 0.49) ** 50) # 7.391 = r^50