User Tools

Site Tools


Sidebar

* [[http://www.labri.fr/perso/melancon|Me as a researcher]] --- * [[start|Home]] * [[proj_techno:start|Projets technologiques - Licence 3 Informatique]] 4TIN601U * [[proj_CMI_L2:start|Projet de programmation - CMI ISI]] 4TCM401U * [[MIAGE:processus_stoch_simulation|Processus stochastiques et simulation - MIAGE et e-MIAGE]] 4TYE814U / 4TYE808U ---- * **Fête de la Science** - [[mathc2+:analyse|"Analyse de réseau appliquée aux réseau sociaux"]] ---- * Master U de Bx * [[http://www.labri.fr/perso/melancon/Visual_Analytics_Course/|Visual Analytics]] * [[e-miage_ubx_i|e-MIAGE U de Bx]] * [[estia:estia|ESTIA DataViz / Data Science]] * [[Enseignements passés]] ---- * [[http://www.labri.fr/perso/melancon|Research]] ---- * [[admin:Site admin]]

A PCRE internal error occured. This might be caused by a faulty plugin
miage_solution:solution_bonus_malus_tp

p ====== Master 4TYE814U/4TYE808U MIAGE & e-MIAGE -- Processus stochastiques et simulation ====== ===== Séance de travaux dirigé ===== ==== Exercice -- Bonus Malus ==== * <color purple/#dedede>Calculez une valeur approchée de la distribution stationnaire de cette chaîne:</color> * <color purple/#dedede>A l'aide de la matrice</color> * <color purple/#dedede>En simulant la chaîne (loi des grands nombres)</color> --- **Solution** On donne d'abord une solution par calcul matriciel. <code python> import random import numpy # parametre du modele gouvernant la loi de Poisson mu = 0.5 def poisson(k, mu): return numpy.exp(-mu) * mu**k / numpy.math.factorial(k) ########################################## # construction de la matrice de transition mat_transition = numpy.zeros((15,15)) # entrees au dessus de la diagonale for i in range(15): for j in range(i+1, 14): mat_transition[i,j] = poisson(j-i, mu) # entrees sous la diagonale for i in range(1, 15): mat_transition[i, i-1] = poisson(0, mu) # entrees en derniere colonne for i in range(15): s = sum(numpy.asarray(mat_transition[i])) mat_transition[i, 14] = 1 - s mat_transition[0,0] = poisson(0, mu) ########################################## # construction de la distribution initiale # on suppose qu'un assure debute avec un coefficient malus max dist_init = [0.0 for i in range(15)] dist_init[14] = 1.0 ########################################## # on calcule les puissances successives de la matrice # et on observe les distributions de probabilites atteinte # depuis la distribution initiale choisie # !!! attention !!! l'operateur ** prend la puissance # de chacune des entrees, ca n'est pas la meme chose # il faut faire le calcul des puissances a l'aide d'une boucle # on initialise une matrice P a 1 (matrice identite) P = numpy.identity(15) for i in range(1000): P = numpy.dot(P, mat_transition) if i in [5, 10, 50, 100, 500, 999]: print(numpy.dot(dist_init, P)) </code> Les différentes distributions $\pi_5, \pi_{10}, \pi_{50}, \pi_{100}, \pi_{500}, \pi_{999}$ sont: ^ $n$ ^ $\pi_n$ ^ | 0 | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] | | 5 | [0, 0, 0, 0, 0, 0, 0, 0, 0.0497, 0.0322, 0.1528, 0.1300, 0.2231, 0.2054, 0.2065] | | 10 | [0, 0, 0, 0.0040, 0.0026, 0.0227, 0.0198, 0.0619, 0.0634, 0.1120, 0.1196, 0.1499, 0.1521, 0.1528, 0.1385] | | 50 | [0.1186, 0.0811, 0.0769, 0.0734, 0.0711, 0.0696, 0.0683, 0.0667, 0.0647, 0.0621, 0.0587, 0.0546, 0.0498, 0.0446, 0.0390 ] | | 100 | [0.1813, 0.1183, 0.1049, 0.0915, 0.0801, 0.0703, 0.0619, 0.0546, 0.0482, 0.0425, 0.0374, 0.0329, 0.0287, 0.0250, 0.0216] | | 500 | [0.1948, 0.1264, 0.1109, 0.0954, 0.0819, 0.0704, 0.0604, 0.0519, 0.0446, 0.0383, 0.0329, 0.0283, 0.0243, 0.0208, 0.0179] | | 999 | [0.1948, 0.1264, 0.1109, 0.0954, 0.0819, 0.0704, 0.0604, 0.0519, 0.0446, 0.0383, 0.0329, 0.0283, 0.0243, 0.0208, 0.0179] | On comprend que les distributions $\pi_{500}$ et les suivantes approchent la distribution stationnaire. Par conséquent, selon ce modèle, 20% des assurés sont en classe de tarif minimale (bonus-malus 0.5, un peu moins de 2% des assurés sont au coefficient maximal, etc. N.B. Les entrées de la partie supérieure gauche de la puissance 5ème de la matrice sont: $$ M^5 = \left[ \begin{matrix} 0.4089 & 0.2315 & 0.1580 & 0.0992 & 0.0551 & 0.0275 & 0.0124 & 0.0049 & \ldots \\ 0.3831 & 0.1971 & 0.1751 & 0.1037 & 0.0677 & 0.0385 & 0.0197 & 0.0092 & \ldots \\ 0.2770 & 0.2411 & 0.1255 & 0.1418 & 0.0860 & 0.0594 & 0.0355 & 0.0188 & \ldots \\ 0.2463 & 0.0821 & 0.2223 & 0.1052 & 0.1328 & 0.0834 & 0.0588 & 0.0354 & \ldots \\ 0.0821 & 0.2052 & 0.0513 & 0.2138 & 0.1037 & 0.1326 & 0.0834 & 0.0588 & \ldots \\ 0.0821 & 0.0000 & 0.2052 & 0.0513 & 0.2138 & 0.1037 & 0.1326 & 0.0834 & \ldots \\ 0.0000 & 0.0821 & 0.0000 & 0.2052 & 0.0513 & 0.2138 & 0.1037 & 0.1326 & \ldots \\ 0.0000 & 0.0000 & 0.0821 & 0.0000 & 0.2052 & 0.0513 & 0.2138 & 0.1037 & \ldots \\ \ldots \end{matrix} \right] $$ On observe bien $m^{(5)}_{0,0} \sim 0.4089$. ---- <code python> import random import numpy # parametre du modele gouvernant la loi de Poisson mu = 0.5 def poisson(k, mu): return numpy.exp(-mu) * mu**k / numpy.math.factorial(k) ########################################## # construction de la matrice de transition mat_transition = numpy.zeros((15,15)) # entrees au dessus de la diagonale for i in range(15): for j in range(i+1, 14): mat_transition[i,j] = poisson(j-i, mu) # entrees sous la diagonale for i in range(1, 15): mat_transition[i, i-1] = poisson(0, mu) # entrees en derniere colonne for i in range(15): s = sum(numpy.asarray(mat_transition[i])) mat_transition[i, 14] = 1 - s mat_transition[0,0] = poisson(0, mu) ########################################## # construction dela distribution initiale # on suppose qu'un assure debute avec un coefficient malus max dist_init = [0.0 for i in range(15)] dist_init[14] = 1.0 ########################################## # marche aleatoire nb_pas = 1000000 # fonction qui choisit aleatoirement un entier # parmi 0, 1, 2, ..., k # avec des probabilites pour chacun de ces entiers # donnes par une dist de probabilites [p_0, p_1, ..., p_k] def choix_alea_entier(probs): x = random.random() i = 0 s = probs[0] while s < x: i += 1 s += probs[i] return i def transition(etat, mat_transition): probs = mat_transition[etat] return choix_alea_entier(probs) frequences = [0.0 for i in range(15)] etat = choix_alea_entier(dist_init) for i in range(nb_pas): frequences[etat] += 1.0 etat = transition(etat, mat_transition) print(map(lambda x: x / nb_pas, frequences)) </code> Les fréquences $f$ de passage calculées par cette marche (comptant $10^6 = 1$ millions de pas) approche (à deux décimales près) la distribution obtenue avec l'approche matricielle. | $f$ | [0.1958, 0.1265, 0.1108, 0.0952, 0.0817, 0.0702, 0.0605, 0.0522, 0.0447, 0.0381, 0.0327, 0.027, 0.024, 0.0209, 0.0180] | --- [[miage:td_graphe_convergence|Retourner au TD]]

miage_solution/solution_bonus_malus_tp.txt · Last modified: 2017/01/18 11:57 by melancon