Advertisement
Guest User

Untitled

a guest
Jan 10th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 5.52 KB | None | 0 0
  1. # TP 3 : Chaînes de Markov
  2.  
  3. Matteo STAIANO
  4.  
  5. ## 1 Historique d’une navigation web
  6.  
  7. #### 1)
  8.  
  9. $\begin{pmatrix}0.5&0.3&0.2\\0.2&0.8&0\\0.3&0.3&0.4\end{pmatrix}$. La matrice n’est pas strictement positive car nous avons $M_{2,3} = 0$. En mettant la matrice au carré, nous obtenons : $\begin{pmatrix}0.37&0.45&0.18\\0.26&0.7&0.04\\0.33&0.45&0.22\end{pmatrix}$. La matrice de transitions est donc primitive, et par conséquent irréductible.
  10.  
  11. #### 2)
  12.  
  13. $M^t = \begin{pmatrix}0.5&0.2&0.3\\0.3&0.8&0.3\\0.2&0&0.4\end{pmatrix}​$. Nous avons :
  14.  
  15. 0. $\begin{pmatrix}0\\1\\0\end{pmatrix}$
  16. 2. $M^t . \begin{pmatrix}0\\1\\0\end{pmatrix} = \begin{pmatrix}0.2\\0.8\\0\end{pmatrix}$.
  17. 3. $M^t . \begin{pmatrix}0.2\\0.8\\0\end{pmatrix} = \begin{pmatrix}0.26\\0.7\\0.04\end{pmatrix}$.
  18. 4. $M^t . \begin{pmatrix}0.26\\0.7\\0.04\end{pmatrix} = \begin{pmatrix}0.282\\0.65\\0.068\end{pmatrix}$.
  19.  
  20. #### 3)
  21.  
  22. Par résolution du système suivant :
  23.  
  24. $\begin{cases}a = 0.5a + 0.2b + 0.2c\\b = 0.3a+0.8b+0.3c\\c=0.2a+0.4c\\1=a+b+c\end{cases}$, nous obtenons $w = \begin{pmatrix}0.3\\0.6\\0.1\end{pmatrix}$.
  25.  
  26. #### 4)
  27.  
  28. $M^{10} = \begin{pmatrix}0.300195&0.599414&0.100391\\0.29987&0.600391&0.0997396\\0.300195&0.599414&0.100391\end{pmatrix}\\M^{20}=\begin{pmatrix}0.3&0.599999&0.1\\0.3&0.6&0.0999997\\0.3&0.599999&0.1\end{pmatrix}\\M^{100} = \begin{pmatrix}0.3&0.6&0.1\\0.3&0.6&0.1\\0.3&0.6&0.1\end{pmatrix}$
  29.  
  30. Il semble possible d’obtenir $w$ de façon approchée en élevant la matrice à une puissance très élevée et en multipliant ensuite celle-ci par un vecteur à 1 dimension, $\begin{pmatrix}1\\0\\0\end{pmatrix}$ par exemple.
  31.  
  32. ## Génération aléatoire de texte
  33.  
  34. ### Apprentissage de la chaîne de Markov
  35.  
  36. ```python
  37. def statistiques(s):
  38.    out = [[0 for i in range(256)] for j in range(256)]
  39.    for i in range(len(s) - 1):
  40.        if ord(s[i]) <= 255 and ord(s[i + 1]) <= 255:
  41.            out[ord(s[i])][ord(s[i + 1])] += 1
  42.  
  43.    return out
  44.  
  45.  
  46. def matriceProbas(mat):
  47.    out = [[0 for i in range(256)] for j in range(256)]
  48.    for i in range(256):
  49.        total = sum(mat[i])
  50.        if total > 0:
  51.            for j in range(256):
  52.                out[i][j] = mat[i][j] / total
  53.  
  54.    return out
  55. ```
  56.  
  57. La fonction  `statistiques(s)` prend en paramètre la chaîne de caractères du livre et retourne une matrice représentant le nombre de fois qu’un caractère est suivi par un autre en particulier.
  58.  
  59. La fonction `matriceProbas(mat)` prend en paramètre la matrice générée par `statistiques()` et retourne la probabilité pour chaque caractère d’être suivi par un autre en particulier.
  60.  
  61. ### Génération de texte
  62.  
  63. ```python
  64. def matriceProbasCumulees(mat):
  65.    out = [[0 for i in range(256)] for j in range(256)]
  66.    for i in range(256):
  67.        tmp = 0
  68.        for j in range(256):
  69.            out[i][j] = mat[i][j] + tmp
  70.            tmp = out[i][j]
  71.  
  72.    return out
  73. ```
  74.  
  75. La fonction `matriceProbasCumulees(mat)` prend la matrice de la fonction `matriceProbas(mat)` en paramètre et retourne la matrice des probabilités cumulées correspondant à notre texte.
  76.  
  77. Nous pouvons en profiter pour vérifier que les matrices générées sont bien stochastiques : la somme des probabilités sur chaque ligne de la matrice de probabilités est égale à 1 (ou 0 pour les caractères jamais présents dans le texte). De même, le dernier élément de chaque ligne de la matrice des probabilités cumulées est égal à 1 ou 0 (à une précision relative liée à l’arrondi automatique effectué par l’ordinateur, de l’ordre de $10^{-16}$).
  78.  
  79. ```python
  80. def successeur(mat, a):
  81.     r = uniform(0, 1)
  82.     for i in range(256):
  83.         if r > P[ord(a)][i]:
  84.             continue
  85.         return chr(i)
  86. ```
  87.  
  88. La fonction `successeur(mat, a)` prend la matrice des probabilités cumulées et un état (une lettre) pour générer un successeur.
  89.  
  90. ```python
  91. def generationAleatoire(mat, init, n):
  92.     out = ""
  93.     tmp = init
  94.     for i in range(n - 1):
  95.         tmp = successeur(mat, tmp)
  96.         out += tmp
  97.     return out
  98. ```
  99.  
  100. La fonction `generationAleatoire(mat, init, n)` génère une chaîne de caractères de n caractères en générant à chaque fois le successeur de l’état actuel avec la fonction `successeur()`.
  101.  
  102. Nous observons que malgré l’improbabilité de générer des phrases compréhensibles, on reconnaît souvent la consonance de certaines langues.
  103.  
  104. `germinal.txt`
  105.  
  106. **maloiraint sanemeuse  e chenet lais
  107. derchantoyait etoulluagene come l a hu isachoidesune blemen pe**
  108.  
  109. `lotr.txt`
  110.  
  111. **y    l. theal  l-
  112. t d s  pane  gho he hix!  there as, 'rksoncefrnd  us Evindowed  A biefid withtod**
  113.  
  114. `goethe.txt`
  115.  
  116. **n Welsohtell din  scheichte omaunen vimm on l ellltsicheice PHIhen Amend)
  117.  ierangsttegsaun dindich **
  118.  
  119. `quijote.txt`
  120.  
  121. **(smíalllalanide lguriónas cheso ntronco qulorice e po o,  de sotó con pujo (s a, las seizante**
  122.  
  123. ### Extensions
  124.  
  125. Si on prend en compte les deux derniers caractères, il s’agit toujours d’une chaîne de Markov, cachée. En effet, l’état courant ne dépend que de l’état précédent, agrégation de deux caractères. Les états sont donc toutes les combinaisons de deux caractères.
  126.  
  127. ```python
  128. def statistiques(s):
  129.     out = [[[0 for i in range(256)] for j in range(256)] for k in range(256)]
  130.     for i in range(len(s) - 1):
  131.         if ord(s[i]) <= 255 and ord(s[i + 1]) <= 255:
  132.             out[ord(s[i])][ord(s[i + 1])][ord(s[i + 2])] += 1
  133.  
  134.     return out
  135. ```
  136.  
  137. La complexité augmente d’un degré en raison du rajout d’une 3e dimension au tableau. Nous passons donc de $o(n^2)$ à $o(n^3)$.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement