Petits exposés variés Xavier Dupré http ://www.xavierdupre.fr/ Table des matières 0.0.1 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 0.0.8 0.0.9 0.0.10 0.0.11 0.0.12 0.0.13 Enoncé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Algorithme et convergence . . . . . . . . . . . . . . . . . . . . . . . . Méthode du second ordre . . . . . . . . . . . . . . . . . . . . . . . . Minimisation avec gradient stochastique . . . . . . . . . . . . . . . . Premier exemple : optimisation d’une fonction quadratique . . . . . Court rappel sur l’estimateur du maximum de vraisemblance . . . . Second exemple : proportion de mâles chez les poissons . . . . . . . . Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Premier exemple, fonction quadratique . . . . . . . . . . . . . . . . . Second exemple, proportion de mâles et de femelles chez les poissons Simulation d’une série (Xi )i . . . . . . . . . . . . . . . . . . . . . . . Estimation des paramètres avec une méthode du premier degré . . . Estimation des paramètres avec une méthode du second degré . . . . Index 0.0.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 5 7 9 9 13 14 14 17 17 18 22 25 Enoncé Lorsqu’on doit trouver le minimum d’une fonction définie sur un espace vectoriel, le premier réflexe consiste à dériver la fonction puis à l’annuler de manière à obtenir un système d’équation. Il reste ensuite à déterminer si les zéros de la dérivée correspondent à un minimum ou à un maximum. Cependant, il n’est pas toujours possible de résoudre le système d’équation obtenu. Par exemple, la fonction f (x) = cos(x)+ex a pour dérivée f 0 (x) = − sin(x) = ex . Résoudre l’équation f 0 (x) = 0 est impossible. C’est pourquoi il existe des méthodes de résolution approchées qui déterminent numériquement le minimum de la fonction. Il existe des algorithmes permettant de trouver une solution approchée à condition toutefois que la fonction à maximiser ou minimiser soit dérivable. Plusieurs variantes sont proposées regroupées sous le terme de descente de gradient ou méthode de Newton. Par la suite, on cherchera à minimiser une fonction g. Maximiser cette même fonction revient à minimiser la fonction −g. 0.0.2 Algorithme et convergence ∗ Soit g : ℝd −→ ℝ une fonction dérivable dont il faut trouver x = arg min g (x). L’algorithme suivant x∈ℝ propose une méthode permettant à partir d’un x0 ∈ ℝd quelconque de se rapprocher petit à petit du TABLE DES MATIÈRES 3 minimum x∗ comme le montre le schéma 0.1 dans le cas où g (x) = x2 . Algorithme 0.1 : descente de gradient de Newton Soit g : ℝd −→ ℝ une fonction dérivable et minorée. On cherche à déterminer le minimum de la fonction g. Soit x0 ∈ ℝd . Soit (t )t⩾0 une suite réelle positive vérifiant : ∞ ∞ X X t = ∞ et 2t < ∞ t=0 t=0 Etape A : initialisation t ←− 0 Etape B : mise à jour t ←− t + 1 ∂g (xt ) xt ←− xt−1 − t ∂x Etape C : condition d’arrêt Si f (xt ) ≈ f (xt−1 ), l’algorithme s’arrête, sinon on retourne à l’étape B. On note xt l’abscisse à l’itération t. ∂g (xt ) On note le gradient de g (x) = x2 . ∂x L’abscisse à l’itération t + 1 sera : ∂g (xt ) xt+1 = xt − εt ∂x εt est le pas de gradient à l’itération t. Figure 0.1 : Minimisation par descente de gradient. A chaque itération, on se déplace dans le sens opposé à celui du gradient, direction le minimum est susceptible de se trouver. L’étape C détermine si l’algorithme doit continuer à chercher le minimum de la fonction g ou si la valeur approchée est satisfaisante puisque, aux alentours de ce minimum, le gradient est presque nul et la suite (xt ) presque constante. La condition f (xt ) ≈ f (xt−1 ) peut par exemple être interprétée comme une différence f (xt )−f (xt−1 ) relative d’une itération à la suivante : f (xt−1 ) < A où A est une constante positive petite. Plus elle est petite, plus la précision sera grande. Il est aussi possible d’arrêter l’algorithme dès que f (xt ) > f (xt−1 ) mais la suite (f (xt ))t n’est pas toujours décroissante, c’est pourquoi la condition d’arrêt précédente est préférable. 0 La suite (t )t doit vérifier quelques contraintes comme la suite t = 1+t . Ces contraintes assurent la TABLE DES MATIÈRES 4 convergence de l’algorithme vers un minimum de la fonction comme le montre le théorème suivant. Théorème 0.2 : convergence de la méthode de Newton (Bottou1991) Soit une fonction continue g : W ∈ ℝM −→ ℝ, de classe C 1 . On suppose les hypothèses suivantes vérifiées : H1 arg min g (W ) = {W ∗ } est un singleton W ∈ℝq H2 ∀ε > 0, inf |W −W ∗ |>ε (W − W ∗ )0 .∇g (W ) > 0 H3 ∃ (A, B) ∈ ℝ2 tels que ∀W ∈ ℝp , k∇g (W )k2 ⩽ A2 + B 2 kW − W ∗ k2 P P 2 H4 la suite (εt )t⩾0 vérifie, ∀t > 0, εt ∈ ℝ∗+ et εt = +∞, εt < +∞ t⩾0 t⩾0 Alors la suite (Wt )t⩾0 construite de la manière suivante : W0 ∈ ℝM et ∀t ⩾ 0, Wt+1 = Wt − εt ∇g (Wt ) vérifie lim Wt = W ∗ t−→+∞ L’hypothèse H1 implique que le minimum de la fonction g est unique et l’hypothèse H2 implique que le demi-espace défini par l’opposé du gradient contienne toujours le minimum de la fonction g. Démonstration (théorème 0.2) : Partie A (démonstration de 0.2) P P 2 ut < +∞ εt < +∞, ut ∼ ε2t x2 , on a Soit la suite ut = ln 1 + ε2t x2 avec x ∈ ℝ, comme t⩾0 Par conséquent, si vt = eut alors T Q t⩾0 T →∞ vt −→ D ∈ ℝ t=1 Partie B (démonstration de 0.2) On pose ht = kWt − W ∗ k2 Donc : ht+1 − ht = kWt − εt ∇g (Wt ) − W ∗ k2 − kWt − W ∗ k2 (0.1) Par conséquent : ht+1 − ht = −2εt (Wt − W ∗ )0 ∇g (Wt ) + ε2t k ∇C (Wt )k2 ⩽ ε2t k ∇g (Wt )k2 ⩽ ε2t A2 + B 2 ht {z } | >0 D’où : ht+1 − ht 1 + ε2t B 2 ⩽ ε2t A2 On pose πt = t Y k=1 1 + ε2k B 2 −1 alors, en multipliant des deux côtés par πt+1 , on obtient : TABLE DES MATIÈRES 5 πt+1 ht+1 − πt ht ⩽ ε2t A2 πt+1 q q q X X X ε2t A2 Π −→ 0 ε2t A2 Π ⩽ ε2t A2 πt+1 ⩽ d’où πq+1 hq+1 − πp hp ⩽ t=p t=p Comme la série P t=p t−→∞ (πt+1 ht+1 − πt ht ) vérifie le critère de Cauchy, elle est convergente. Par conséquent : t lim πq+1 hq+1 = 0 = lim Πhq+1 q→∞ q→∞ D’où : lim hq = 0 q→∞ (0.2) Partie C (démonstration de 0.2) P La série (ht+1 − ht ) est convergente car Πht ∼ πt ht . t ε2t t⩾0 P k ∇g (Wt )k2 l’est aussi (d’après H3). D’après (0.1), la série P εt (Wt − W ∗ )0 ∇g (Wt ) est donc convergente. Or d’après les hypothèses (H2, H4), t⩾0 elle ne peut l’être que si : lim Wt = W ∗ t→∞ (0.3) (0.2) u t Ce théorème peut être étendu dans le cas où la fonction g n’a plus un seul minimum global mais plusieurs minima locaux (voir [?]), dans ce cas, la suite (Wt ) converge vers un mimimum local. Une généralisation de ce théorème est présentée dans [?]. Si ce théorème prouve la convergence de la méthode de Newton, il ne précise pas à quelle vitesse cette convergence s’effectue et celle-ci peut parfois être très lente. Plusieurs variantes ont été développées regroupées sous le terme de méthodes de quasi-Newton, ou méthodes du second ordre, dans le but d’améliorer la vitesse de convergence. 0.0.3 Méthode du second ordre L’algorithme 0.1 fournit le canevas des méthodes d’optimisation du second ordre. Seule la mise à jour des coefficients (étape B) est différente : elle prend en compte les dernières valeurs des coefficients ainsi que les derniers gradients calculés. Ce passé va être utilisé pour estimer une direction de recherche pour le minimum différente de celle du gradient, cette direction est appelée gradient conjugué (voir [?]). La figure 0.2 est couramment employée pour illustrer l’intérêt des méthodes d’optimisation du second ordre ou méthode de gradient conjugué. Le problème consiste à trouver le minimum d’une fonction quadratique, par exemple, G (x, y) = 3x2 +y 2 . Tandis que le gradient est orthogonal aux lignes de niveaux de la fonction G, le gradient conjugué se dirige plus sûrement vers le minimum global. Ces techniques sont basées sur une approximation du second degré de la fonction à minimiser. On note toujours g : ℝd −→ ℝ la fonction à minimiser. Au voisinage de x0 , un développement limité donne : g (x) = g (x0 ) + ∂g (x0 ) ∂ 2 g (x0 ) (x − x0 ) + (x − x0 )0 (x − x0 ) + o kx − x0 k2 ∂x ∂x2 TABLE DES MATIÈRES 6 . . gradient gradient conjugué . Figure 0.2 : Gradient et gradient conjugué sur une ligne de niveau de la fonction G (x, y) = 3x2 + y 2 , le gradient est orthogonal aux lignes de niveaux de la fonction G, mais cette direction est rarement orientée vers le minimum à moins que le point (x, y) se situe sur un des axes des ellipses, le gradient conjugué agrège les derniers déplacements et propose une direction de recherche plus plausible pour le minimum de la fonction. 2 g(x0 ) Par conséquent, sur un voisinage de x0 , la fonction g (x) admet un minimum local si ∂ ∂x est définie 2 1 positive strictement . Une matrice symétrique définie strictement positive est inversible, et le minimum est atteint pour la valeur : xmin −1 1 ∂ 2 g (x0 ) ∂g (x0 ) = x0 + 2 ∂x2 ∂x (0.4) Néanmoins, pour un réseau de neurones, le calcul de la dérivée seconde est coûteux, son inversion également. C’est pourquoi les dernières valeurs des coefficients et du gradient sont utilisées afin d’approcher cette dérivée seconde ou directement son inverse. Une méthode couramment employée est l’algorithme BFGS (Broyden-Fletcher-Goldfarb-Shano, voir [?], [?]). Ces méthodes proposent une estimation de la dérivée seconde (ou de son inverse) utilisée en (0.4). Dans les méthodes du premier ordre, une itération permet de calculer les poids xt+1 à partir des poids xt et du gradient gt . Si ce gradient est petit, on peut supposer que gt+1 est presque égal au produit de la dérivée seconde par gt . Cette relation est mise à profit pour construire une estimation de la dérivée seconde. Cette matrice notée Bt dans l’algorithme 0.3 est d’abord supposée égale à l’identité puis actualisée à chaque itération en tenant de l’information apportée par chaque déplacement. Algorithme 0.3 : algorithme BFGS Soit g : ℝd −→ ℝ une fonction dérivable et minorée. On cherche à déterminer le minimum de la fonction g. Soit x0 ∈ ℝd . Le nombre de paramètres de la fonction f est d. n est un entier strictement positif. Etape A : initialisation Le premier jeu de coefficients x0 du réseau de neurones est choisi aléatoirement. t ←− 0 E0 ←− f (x0 ) B0 ←− Id i ←− 0 Etape B : calcul du gradient gt ←− ∂f ∂x (xt ) ct ←− Bt gt 1. Rappel : ∂ 2 g (x0 ) ∂ 2 g (x0 ) est définie positive strictement ⇐⇒ ∀Z ∈ ℝN , Z 6= 0 =⇒ Z 0 Z>0 2 ∂x ∂x2 TABLE DES MATIÈRES 7 Etape C : recherche de ∗ ∗ ←− 0 faire ∗ ∗ ←− 2 xt+1 ←− xt − ∗ ct tant que (fxt+1 ⩾ Et et ∗ 0) si ∗ ≈ 0 et Bt 6= Id alors Bt ←− Id i ←− t retour à l’étape B. fin si Etape D : mise à jour des coefficients xt+1 ←− xt − ∗ ct Et+1 ←− f (xt+1 ) t ←− t + 1 Etape E : mise à jour de la matrice Bt 0 B 0 si t − i ⩾ nd ou gt−1 t−1 gt−1 ⩽ 0 ou gt−1 Bt−1 (gt − gt−1 ) ⩽ 0 alors Bt ←− Id i ←− t sinon st ←− xt − xt−1 dt ←− gt − gt−1 d0t Bt−1 dt st s0t st d0t Bt−1 + Bt−1 dt s0t − Bt ←− Bt−1 + 1 + d0t st s0t dt d0t st fin si Etape F : terminaison t ≈ 1 alors l’apprentissage a convergé sinon retour à l’étape B. si EEt−1 Lorsque la matrice Bt est égale à l’identité (Id ), le gradient conjugué est égal au gradient. Au fur et à mesure des itérations, cette matrice toujours symétrique évolue en améliorant la convergence de l’optimisation. Néanmoins, la matrice Bt doit être "nettoyée" (égale à l’identité) fréquemment afin d’éviter qu’elle n’agrège un passé trop lointain. Elle est aussi nettoyée lorsque le gradient conjugué semble trop s’éloigner du véritable gradient et devient plus proche d’une direction perpendiculaire. L’algorithme DFP (Davidon-Fletcher-Powell, voir [?], [?]) est aussi un algorithme de gradient conjugué qui propose une approximation différente de l’inverse de la dérivée seconde. Pour appliquer cette méthode, il suffit de remplacer la mise à jour de la matrice Bt dans l’étape E de l’algorithme 0.3 par la suivante : Bt ←− Bt−1 + 0.0.4 dt d0t Bt−1 st s0t Bt−1 − d0t st s0t Bt−1 st (0.5) Minimisation avec gradient stochastique La méthode du gradient stochastique s’applique lorsque la fonction à minimiser est une somme de fonctions dérivables et minorées. g(x) = N X ei (x) i=1 (0.6) TABLE DES MATIÈRES 8 Compte tenu des courbes d’erreurs très "accidentées" (figure 0.3) dessinées par ces fonctions, il existe une multitude de minima locaux. De ce fait, l’apprentissage global converge rarement vers le minimum global de la fonction d’erreur lorsqu’on applique les algorithmes basés sur le gradient global. L’optimisation avec gradient stochastique est une solution permettant de mieux explorer ces courbes d’erreurs. De plus, les méthodes de gradient conjugué nécessite le stockage d’une matrice trop grande parfois pour des fonctions ayant quelques milliers de paramètres (g : ℝ1000 −→ ℝ). C’est pourquoi l’apprentissage avec gradient stochastique est souvent préféré à des méthodes du second ordre trop coûteuses en calcul et en espace mémoire. En contrepartie, la convergence est plus lente. La démonstration de cette convergence nécessite l’utilisation de quasi-martingales et est une convergence presque sûre (voir [?]). Figure 0.3 : Exemple de minima locaux. Algorithme 0.4 : optimisation stochastique N P Soit g = ei (x), ∀i, ei : ℝd −→ ℝ une fonction dérivable et minorée. On cherche à déterminer le i=1 minimum de la fonction g. Soit x0 ∈ ℝd . Soit (t )t⩾0 une suite réelle positive vérifiant : ∞ ∞ X X t = ∞ et 2t < ∞ t=0 t=0 Etape A : initialisation t ←− 0 N P E0 ←− ei (x0 ) i=1 Etape B : récurrence xt,0 ←− W0 pour t0 = 0 à N − 1 faire i ←− nombrealéatoire dans {1, . . . , N } i 0 g ←− ∂e ∂x xt,t xt,t0 +1 ←− xt,t0 − t g fin pour Et+1 ←− xt,N N P ←− ei (xt+1 ) t ←− t + 1 xt+1 i=1 Etape C : terminaison t si EEt−1 ≈ 1 alors l’apprentissage a convergé sinon retour à l’étape B. En pratique, il est utile de converser le meilleur jeu de coefficients : x∗ = arg min Eu car la suite (Eu )u⩾0 u⩾0 n’est pas une suite constamment décroissante. TABLE DES MATIÈRES 0.0.5 9 Premier exemple : optimisation d’une fonction quadratique La figure 0.2 illustre un exemple pour lequel l’utilisation d’un algorithme d’optimisation du second degré est pertinente et pour le vérifier concrètement, on choisit la fonction suivante : f (x, y) = x4 + x3 + y2 + y 100 (0.7) Le miminum est atteint pour (x, y) = − 34 , − 12 . Toutefois, du fait du coefficient très faible devant les termes en y 2 et y, l’utilisation d’un algorithme de descente de gradient du premier ordre doit converger très lentement contrairement à une méthode du second ordre, ce que le programme décrit au paragraphe 0.0.9 montrera numériquement. 0.0.6 Court rappel sur l’estimateur du maximum de vraisemblance La méthode de l’estimateur du maximum de vraisemblance est une méthode permettant d’estimer les paramètres d’une densité. Par exemple, on mesure les tailles d’une trentaine de personnes pour obtenir un échantillon (X1 , . . . , Xn ). On calcule pour cet échantillon l’espérance (ou la moyenne) et l’écart-type : v u n n X p u1X 1 µ = 𝔼 (X) = Xi et σ = 𝕍 (X) = t (Xi − 𝔼 (X))2 n n i=1 (0.8) i=1 Ces valeurs apparaissent souvent en statistiques, elles proviennent d’une hypothèse faite sur la loi que suivent les variables de l’échantillon (X1 , . . . , Xn ) : une loi normale de moyenne µ et d’écart-type σ. On suppose alors que toutes les variables Xi sont indépendantes et suivent la même loi normale de moyenne µ et d’écart-type σ pour l’instant inconnus. Cela signifie aussi que la densité de la variable Xi a pour expression : (x − µ)2 1 √ exp − f (x) = 2σ 2 2πσ ! (0.9) Cette expression permet par exemple de calculer la probabilité d’un événement comme le fait que les tailles des n personnes soient inférieures à 1,80 mètres et supérieures à 1,60 mètres. Notons A cet événement. ℙ (A) = ℙ (1, 6 ⩽ X1 ⩽ 1, 8 et ... et 1, 6 ⩽ Xn ⩽ 1, 8) (0.10) Etant donné que les variables de l’échantillon sont toutes indépendantes. Il est possible d’écrire que : ℙ (A) = ℙ (1, 6 ⩽ X1 ⩽ 1, 8) × ... × ℙ (1, 6 ⩽ Xn ⩽ 1, 8) = n Y ℙ (1, 6 ⩽ Xi ⩽ 1, 8) (0.11) i=1 On utilise maintenant le fait que Xi a pour densité f : n Z Y "Z n Y ! # (x − µ)2 1 √ exp − dx ℙ (A) = f (x)dx = 2σ 2 2πσ 1,6 1,6 i=1 i=1 ! ! Z 1,8 Z 1,8 1 (x1 − µ)2 1 (xn − µ)2 √ = ... exp − ... √ exp − dx1 ...dxn 2σ 2 2σ 2 2πσ 2πσ 1,6 1,6 1,8 1,8 (0.12) (0.13) TABLE DES MATIÈRES 10 Cette dernière écriture fait référence à la densité d’un vecteur de variables aléatoires et indépendantes 2 1 comme par exemple le vecteur (X1 , . . . , Xn ). Puisque la densité d’une variable Xi est f (x) = √2πσ exp − (x−µ) , 2σ 2 la densité de l’échantillon (X1 , . . . , Xn ) est : n Y f (x1 , ..., xn ) = f (xi ) (0.14) i=1 = 1 √ 2πσ n Y n i=1 (xn − µ)2 exp − 2σ 2 ! (0.15) On utilise pour cela le fait que la densité d’un ensemble de variables indépendantes est le produit des densités. En fait, cela revient à construire la probabilité infinitésimale dP correspondant au fait que chaque variables Xi appartient à l’intervalle [xi , xi + dxi ]. A partir de cette densité, on construit la vraisemblance 2 L égale à la valeur de la densité f obtenue en remplaçant les xi par les valeurs observées des variables Xi . L (X1 , ..., Xn ) = 1 √ 2πσ n Y n i=1 (Xn − µ)2 exp − 2σ 2 ! (0.16) Plutôt que d’avoir un produit, on préfère la log-vraisemblance (ou log-likelihood) : ! X n 1 (Xn − µ)2 log L (X1 , ..., Xn ) = n log √ + − 2σ 2 2πσ i=1 n 1 1 X = n log √ − 2 (Xn − µ)2 2σ 2πσ (0.17) i=1 n 1 1 X = n log √ − n log σ − 2 (Xn − µ)2 2σ 2π i=1 (0.18) On cherche maintenant à maximiser cette fonction par rapport à µ et σ. En dérivant et en cherchant à annuler les dérivées partielles, on obtient le système d’équations suivant : ∂L ∂µ ∂L ∂σ n 1 P (Xi − µ) =0 σ 2 i=1 n n 1 P = − + 3 (Xi − µ)2 = 0 σ σ i=1 = (0.19) On résoud d’abord la première équation puis la seconde pour obtenir : n n i=1 i=1 1X 1X µ = Xi et (σ ∗ )2 = (Xi − µ)2 n n ∗ (0.20) On retrouve la moyenne et la variance de l’échantillon (X1 , . . . , Xn ). La loi normale la plus appropriée pour modéliser cet échantillon a pour paramètre µ∗ et σ ∗ . Et la loi la plus appropriée est celle qui maximise l’expression (0.16). La figure 0.4 suggère que la courbe qui maximise cette expression est celle qui épouse 2. La vraisemblance est souvent noté L pour likelihood en anglais. TABLE DES MATIÈRES 11 au mieux la forme de l’histogramme de l’échantillon 3 . Si cet histogramme est l’ensemble des couples (tj , hj )1⩽j⩽k , on peut presque écrire que : n Y i=1 f (Xi ) ≈ k Y [f (tj )]hj (0.21) j=1 Cette dernière expression montre que la fonction f doit éviter d’être nulle en tj lorsque hj n’est pas nulle. C’est pour cela que la meilleure courbe f est celle qui épouse au mieux la forme de l’histogramme. Lorsqu’on cherche les meilleurs paramètres d’une densité à l’aide de la méthode de l’estimateur de maximum de vraisemblance, cela revient à choisir une forme de densité 4 et à chercher les paramètres qui font que cette courbe épouse au mieux la vraie distribution des variables observées. L’histogramme est une approximation de cette distribution. Figure 0.4 : Ce graphique contient un histogramme qui approche la densité de l’échantillon (X1 , . . . , Xn ). La première courbe en trait d’union est celle de la densité d’une loi normale de paramètres tirés au hasard. De manière évidente, l’expression (0.16) calculée pour la courbe de ce graphique est inférieure au résultat obtenu pour une même courbe mais centrée sur l’histogramme. Et le calcul du paragraphe 0.0.6 montre que la meilleure courbe épouse la forme de l’histogramme. L’estimateur du maximum de vraisemblance est ce qu’on appelle une méthode paramétrique. Il existe des méthodes non paramétriques comme la méthode des noyaux qui ne fait pas d’hypothèse sur la forme de la densité. D’autres méthodes encore ne s’intéressent qu’à une partie de la densité, plus précisément les queues de distributions. Par exemple, lors de la construction d’une plateforme pétrolière, il est important de connaître la hauteur de la plus grande vague pour placer la plateforme juste au-dessus. Le coût de construction est plus élevé lorsque la plateforme est surélevée mais elle est hors de portée des vagues qui ne peuvent plus l’emporter. A partir de séries de mesures de hauteurs de vagues, les statisticiens s’intéressent non plus à la distribution de cette hauteur mais à la distribution de la hauteur maximale, c’est-à-dire la probabilité d’événements très rares. La méthode de l’estimateur du maximum de vraisemblance n’est plus applicable lorsqu’on s’intéresse aux queues de distributions. La densité calculée par ce moyen est proche de la véritable distribution à proximité de la moyenne, là où il y a beaucoup de données. Mais elle est peu précise lorsqu’il y a peu de données car, même si on fait des erreurs, elles sont peu nombreuses. 3. Un histogramme de l’échantillon (X1 , . . . , Xn ) est une liste de couples de valeurs (tj , hj )1⩽j⩽k où (tj )j est une suite croissante de ℝ et hj est un nombre entier positif égal au nombre de variables Xi appartenant à l’intervalle [tj , tj+1 [. Autrement dit : n 1X 11 hj = n i=1 {Xi ∈[tj , tj+1 [} 4. Une forme de densité ou plus exactement un modèle, loi normale, loi de Poisson, ... une loi dépendant d’un ou plusieurs paramètres. TABLE DES MATIÈRES 12 Les événements rares forment une branche à part dans la théorie statistique, elle prend de plus en plus d’importance en assurance par exemple car on cherche de plus en plus à estimer la probabilité d’événements rares comme les catastrophes naturels. Pour aller plus loin : L’expression (0.21) équivaut à la suivante : (0.21) ⇐⇒ n X k X log f (Xi ) ≈ hi log f (tj ) i=1 (0.22) j=1 Et si on note g la véritable densité de l’échantillon (X1 , . . . , Xn ), l’expression (0.22) converge vers une limite lorsque n −→ ∞ : n 1X log f (Xi ) −→ n→∞ n Z i=1 g(x) log f (x)dx = 𝔼g (log f ) (0.23) ℝ R Or l’expression − ℝ g(x) log f (x)dx est aussi appelée distance de Kullback-Leiber entre deux densités. La densité f cherchée est celle qui minimise cette distance : Problème 0.5 : distance de Kullback-Leiber Soit l’ensemble RF des fonctions définies sur l’ensemble D ⊂ ℝ. Toute fonction f ∈ F vérifie ∀x ∈ D, f (x) > 0 et D f = 1. Soit g ∈ F . On cherche la fonction f ∗ solution du problème : Z ∗ f = arg min − g(x) log f (x)dx f ∈F D Théorème 0.6 : distance de Kullback-Leiber La solution du problème d’optimisation 0.5 est f ∗ = g. On peut démontrer ce théorème lorsque l’ensemble D est un sous-ensemble fini de ℕ. La fonction g est P définie par une liste de couple (j, gj )j∈D et j∈D gj = 1. C’est un histogramme. La fonction f est définie P de même : (j, fj )j∈D et j∈D fj = 1. La distance de Kullback-Leiber entre f et g s’écrit : X − gj log fj (0.24) j∈D On cherche à démontrer que quelque soit la fonction f choisie, elle vérifie : X gj log fj ⩽ gj log gj (0.25) gj (log fj − log gj ) ⩽ 0 (0.26) j∈D ⇐⇒ X X j∈D j∈D ⇐⇒ X j∈D gj log fj ⩽0 gj (0.27) TABLE DES MATIÈRES Comme la fonction x −→ log x est concave et que X j∈D P j∈D gj 13 =1: X X fj fj ⩽ log gj = log fj ⩽ 0 gj log gj gj j∈D (0.28) j∈D Cette dernière inégalité suffit à démontrer que la disbribution qui minimise la distance de Kullback-Leiber à une autre distribution est elle-même. Cette démonstration convient pour un ensemble D fini. Il reste à l’adapter pour un ensemble dénombrable et plus généralement pour une densité définie sur ℝ, ce qui sort du cadre de ce document 5 . 0.0.7 Second exemple : proportion de mâles chez les poissons Un biologiste cherche à étudier la population d’une certaine espèce de poissons. Plus exactement, il voudrait savoir quelle est la proportion de mâles et de femelles. Il a réussi à récupérer une base de données contenant les tailles des poissons de cette espèce capturés par les pêcheurs sur une année entière. Malheureusement, les pêcheurs n’ont pas distingué les mâles des femelles. Pour estimer cette proportion, le biologiste dispose de deux informations : 1. La taille moyenne des mâles est différente de la taille moyenne des femelles, elle est même supérieure. 2. La taille des mâles est distribuée selon une loi normale, il en est de même pour les femelles. A partir de ces deux informations (ou hypothèses), le biologiste suppose que la distribution des tailles des poissons suit un mélange de loi normales : αm (x − µm )2 f (x) = √ exp − 2 2σm 2πσm ! αf (x − µf )2 +√ exp − 2σf2 2πσf ! (0.29) On sait d’après les hypothèses de modélisation que αm + αf = 1, αm > 0, αf > 0 et µm > µf . Il reste à estimer ces paramètres. La méthode choisie est celle de l’estimateur du maximum de vraisemblance. On note les tailles mesurées par les pêcheurs (X1 , . . . , XN ). On cherche donc à calculer : α ∗ ∗ , µ∗m , σm , µ∗f , σf∗ = arg max α,µm ,σm ,µf ,σf N Y i=1 (Xi − µm )2 α √ exp − 2 2σm 2πσm ! (Xi − µf )2 1−α √ exp − 2σf2 2πσf + ! (0.30) On passe au logarithme, il faut donc maximiser la fonction g définie par : N X " (Xi − µm )2 α exp − g (α, µm , σm , µf , σf ) = log √ 2 2σm 2πσm i=1 ! (Xi − µf )2 1−α +√ exp − 2σf2 2πσf !# (Xi − µf )2 1−α +√ exp − 2σf2 2πσf !# (0.31) On note : " α (Xi − µm )2 h (Xi , α, µm , σm , µf , σf ) = log √ exp − 2 2σm 2πσm ! 5. Cette démonstration utilise l’inégalité de Jensen. Si f est une fonction convexe sur ℝ et X une variable aléatoire réelle, alors : 𝔼 (f (X)) ⩽ f (𝔼 (X)). TABLE DES MATIÈRES 14 Afin de trouver le maximum de la fonction h, on calcule les dérivées de h par rapport à α, µm , σm , µf , σf : ∂g (α, µm , σm , µf , σf ) = ∂α 1 N √ X 2πσm ∂g (α, µm , σm , µf , σf ) = ∂σm −µm )2 − (Xi2σ 2 m i=1 N X ∂g (α, µm , σm , µf , σf ) = ∂µm ∂g (α, µm , σm , µf , σf ) = ∂µf exp Xi −µm √ α 2 σm 2πσm − √ 1 2πσf 2 (Xi −µf ) exp − 2σ2 f (0.32) h (Xi , α, µm , σm , µf , σf ) −µm )2 exp − (Xi2σ 2 m (0.33) h (Xi , α, µm , σm , µf , σf ) i=1 2 (Xi −µf ) Xi −µf 1−α √ exp − N X σ2 2σ 2 2πσ f f f h (Xi , α, µm , σm , µf , σf ) 2 (Xi −µm )2 m) N (Xi −µ √ α exp − − X 3 2 σ 2σ 2πσ (0.34) i=1 m i=1 N X i=1 (Xi −µf ) σf3 m m 2 ∂g (α, µm , σm , µf , σf ) = ∂σf √1−α 2πσf √ α 2 2πσm −µm )2 exp − (Xi2σ 2 m h (Xi , α, µm , σm , µf , σf ) 2 2 Xi −µf ) (Xi −µf ) ( 1−α exp − 2σ2 − √2πσ2 exp − 2σ2 f f h (Xi , α, µm , σm , µf , σf ) f (0.35) (0.36) Annuler ces dérivées est impossible tout comme obtenir la solution exacte correspondant au maximum de la fonction f . Il faut utiliser un algorithme approché, par exemple, une méthode d’optimisation de Newton. Dans cet exemple, le calcul de la proportion des mâles et de femelles reposent sur le choix d’un modèle pour la densité et d’une méthode numérique pour estimer ces paramètres. Tout d’abord, on vérifie que la méthode numérique permettant d’estimer les paramètres du modèle (0.29) permet effectivement de les retrouver dans une situation où ils sont connus. On simule donc un échantillon de tailles de poissons générées aléatoirement selon la densité (0.29) avec des paramètres α, µm , σm , µf , σf puis on vérifie que l’algorithme 0.1 ou 0.3 convergent vers ces paramètres. Cette première étape, si elle est réussie, valide en quelque sorte la méthodologie proposée. Il est alors envisageable de considérer que les résultats obtenus avec des données réelles seront fiables. Remarque 0.7 : Algorithme Expectation-Maximisation Il existe un autre algorithme permettant d’estimer les paramètres d’une densité faite d’un mélange de lois normales, c’est l’algorithme Expectation-Maximisation (ou EM) établi par Dempster (voir [?]). Cet algorithme s’applique pour tout modèle contenant des informations cachées - pour cet exemple, c’est la proportion de mâles et de femelles. Il est souvent préféré à un algorithme d’optimisation classique comme ceux présentés dans ce chapitre : le paragraphe 0.0.12 montrera que le paramètre α liée à l’information cachée fait de la résistance à l’algorithme 0.1. 0.0.8 Correction 0.0.9 Premier exemple, fonction quadratique y2 + y . Pour cela, on crée la On cherche à tester l’algorithme BFGS pour la fonction f (x, y) = x4 + x3 + 100 classe optimisation_bfgs. Son constructeur prend entre autres comme paramètres f, derivee, args. – f(x, ...) est la fonction à minimiser, cette fonction retourne la valeur de f au point x. – derivee(x, ...) retourne un vecteur égal au gradient de la fonction f au point x. – args est une liste d’arguments supplémentaires hormis x dont les fonctions f et derivee ont besoin. Les deux fonctions f et derivee sont appelées par les méthodes erreur et gradient, elles-mêmes appelées par la méthode optimise qui implémente l’algorithme BFGS 0.3. Toutes ces méthodes utilisent l’objet TABLE DES MATIÈRES 15 array du module Numeric qui permet de stocker des vecteurs et des matrices. Le module Numeric définit également toutes les opérations matricielles dont l’algorithme BFGS a besoin. y2 + y Pour appliquer l’algorithme BFGS sur la fonction f (x, y) = x4 + x3 + , on définit les fonctions 100 suivantes : def fonction (x, a,b,c) : return x [0]**4 + a * x[0]**3 + b * x[1]**2 + c * x [1] def derivee (x, a,b,c) : return Num.array ( [4 * x[0]**3 + 3 * a * x[0]**2, b * 2 * x [1] + c] ) Puis on applique l’algorithme BFGS : opt = optimisation_bfgs (fonction, derivee, (1,0.01,0.01)) x0 = Num.array ( [ 3, 4] ) x = opt.optimise (x0) Ces extraits ainsi que l’algorithme BFGS sont présents dans le programme qui suit. # -*- coding: cp1252 -*import numpy as Num import psyco # pour les tableaux class optimisation_bfgs (object) : """optimisation à l’aide de l’algorithme BFGS""" def __init__ (self, f, derivee, args = None, \ epsilon = 0.1, erreur = 1e-5, maxiter = 100) : """initialisation @param f fonction à minimiser --> f (x, args) où x est un vecteur (Numeric.array) @param derivee dérivée de f --> derivee (x, args) @param args autres paramètres de la fonction @param epsilon coefficient devant le gradient @param erreur on s’arrête lorsque l’erreur ne décroît plus @param maxiter nombre d’itérations maximum """ self._f self._derivee self._epsilon self._erreur self._maxiter self._args = = = = = = f derivee epsilon erreur maxiter args 5 10 15 20 25 def erreur (self, x) : """calcule l’erreur""" return self._f (x, *self._args) 30 def gradient (self, x) : """calcule le gradient""" return self._derivee (x, *self._args) def identite (self, dim) : """retourne la matrice identité""" b = Num.array ( [ [ 0 for i in xrange (0, dim) ] for j in xrange (0,dim) ] ) for i in xrange (0, dim) : b [(i,i)] = 1 return b def optimise (self, xO, classic = False, pr = True) : 35 40 TABLE DES MATIÈRES """optimisation selon l’algorithme BFGS, x0 est le vecteur initiale, retourne la meilleure solution, si pr == True, affiche des résultats intermédiaires, classic == True, la matrice bt est mise à jour à chaque itération, équivaut à une descente de gradient du premier degré""" dim stop err bt id t iter old x gt_ xt_ nbt = = = = = = = = = = = = len (self.gradient (xO)) 1e-12 self.erreur (xO) self.identite (dim) True 0 0 err * (1.0 + self._erreur * 2) * 2 xO self.gradient (xO) xO 0 while (abs ((old - err) / err) > self._erreur or t == 0) and \ iter < self._maxiter : if pr : print "itération ", iter, " (", \ t,nbt, ") \t erreur : ", err, " (", old, ")" iter = iter + 1 gt = self.gradient (x) ct = Num.dot (bt, gt) e = abs (err) * 2 + 1 eps = self._epsilon * 2 while e > err and eps > stop : eps = eps / 2 xt = x - ct * eps e = self.erreur (xt) if eps < 1e-12 and t > 0 : bt = self.identite (dim) if t == 0 : nbt += 1 else : nbt = 0 t = 0 else : old = err x = xt err = e if not classic : gt = self.gradient (x) dt = gt - gt_ gbtg = Num.dot (Num.transpose (gt), Num.dot (bt, gt)) gbtd = Num.dot (Num.transpose (gt), Num.dot (bt, dt)) if (gbtg <= 0 or gbtd <= 0) and nbt < 2 : if t == 0 : nbt += 1 else : nbt = 0 bt = self.identite (dim) t = 0 else : t = t + 1 st = xt - xt_ dtbtdt = Num.dot (Num.transpose (dt), Num.dot (bt, dt)) dtst = Num.dot (Num.transpose (dt), st) stdt = Num.dot (Num.transpose (st), dt) stst = Num.outer (st, st) stdtbt = Num.dot (Num.outer (st, dt), bt) btdtst = Num.dot (bt, Num.outer (dt, st)) c = 1.0 + dtbtdt / dtst 16 45 50 55 60 65 70 75 80 85 90 95 100 105 TABLE DES MATIÈRES b b bt 17 = stst * (c / stdt) -= (stdtbt + btdtst) / dtst = bt + b 110 gt_ = gt xt_ = x return x 115 if __name__ == "__main__" : psyco.full () def fonction (x, a,b,c) : return x [0]**4 + a * x[0]**3 + b * x[1]**2 + c * x [1] def derivee (x, a,b,c) : return Num.array ( [4 * x[0]**3 + 3 * a * x[0]**2, b * 2 * x [1] + c] ) 120 opt = optimisation_bfgs (fonction, derivee, (1,0.01,0.01), \ maxiter = 2000, epsilon = 0.2, erreur = 1e-10) x0 = Num.array ( [ 3, 4] ) print "solution initiale : ", x0 x = opt.optimise (x0, classic = False) print "solution finale : ", x 125 Après exécution, on vérifie que la solution trouvée correspond bien à − 34 , − 21 . Pour comparer avec l’algorithme d’optimisation du premier degré, on remplace la ligne suivante : x = opt.optimise (x0, classic = False) Par : x = opt.optimise (x0, classic = True) Alors qu’il faut moins d’une centaine d’itérations à l’algorithme BFGS pour converger la solution, il en faut plus d’un millier à l’algorithme du premier ordre. 0.0.10 Second exemple, proportion de mâles et de femelles chez les poissons Pour vérifier la pertinence d’une méthode numérique, on cherche d’abord à vérifier qu’elle marche bien sur un échantillon (Xi )i dont on sait qu’il vérifie les hypothèses du problème à résoudre - la distribution des Xi est un mélange de deux lois normales. Une fois cette première étape validée, il est alors utilisé sur des données réelles ce qui ne sera pas fait ici. 0.0.11 Simulation d’une série (Xi )i Tout d’abord, on cherche à simuler une série (Xi )1⩽i⩽N où chaque Xi suit une loi de densité (voir figure 0.5) : ! ! (x − µf )2 α (x − µm )2 1−α exp − +√ exp − (0.37) f (x) = √ 2 2σm 2σf2 2πσm 2πσf On choisi par exemple N = 10000, α = 0, 55, µm = 0, 40, µf = 0, 35, σm = 0, 020, σ = 0, 015. Les mâles ont une taille moyenne de 40 cm et un écart-type de 2cm. Ceci signifie que 95% des mâles ont une taille comprises entre 36cm et 44cm. Les femelles ont une taille moyenne de 40 cm et un écart-type de 1, 5 cm. 130 TABLE DES MATIÈRES 18 Figure 0.5 : Distribution des tailles de poissons selon le mélange de lois (0.37) avec pour paramètres α = 0, 55, µm = 0, 40, µf = 0, 35, σm = 0, 020, σ = 0, 015. Ceci signifie que 95% des femelles ont une taille comprise entre 32cm et 38cm. Pour cela, on applique l’alogirthme suivant : Algorithme 0.8 : simulation d’une variable selon un mélange de deux lois normales On cherche à simuler une variable aléatoire X selon un mélange de deux lois normales : ! ! (x − µf )2 α (x − µm )2 1−α X∼√ exp − +√ exp − 2 2σm 2σf2 2πσm 2πσf où α ∈ [0, 1], µm , µf ∈ ℝ, σm , σf > 0. Etape A : choix de la composante normale Soit U ∼ U [0, 1], U est une variable aléatoire uniforme sur [0, 1]. Etape B : simulation loi normale On simule V selon une loi normale de moyenne nulle et de variance un. Autrement dit, soit A, B deux variables générées selon une loi uniforme sur [0, 1] (voir [?]) : p V = −2 log A cos(2πB) Etape C : construction de X On calcule : X = 11{U ⩽α} (σm V + µm ) + 11{U >α} (σf V + µf ) X est la valeur cherchée. Pour obtenir la série (Xi )1⩽i⩽N , il suffit de calculer N valeurs avec l’algorithme 0.8. 0.0.12 Estimation des paramètres avec une méthode du premier degré On implémente le premier algorithme 0.1 afin de retrouver les paramètres qui ont permis de simuler l’échantillon (Xi )1⩽i⩽N . On cherche donc à maximiser la fonction g définie par l’expression (0.31) dont le gradient est définie par les expressions (0.32) à (0.36). Il n’est pas toujours possible de choisir des valeurs initiales pour l’algorithme d’optimisation. Toutefois, dans le cas présent, les paramètres de la fonction g ont un sens presque physique. On peut donc choisir TABLE DES MATIÈRES 19 des valeurs sensées pour la solution initiale de manière à accélérer la convergence de l’algorithme : 1 α= 2 r µm p p = 𝔼 (Xi ) + 𝕍 (Xi ) µf = 𝔼 (Xi ) − 𝕍 (Xi ) σm = σf = 𝕍 (Xi ) 2 (0.38) L’algorithme converge alors en une dizaine d’itérations vers le résultat de la figure 0.6. La log-vraisemblance est très proche de celle obtenue avec le modèle initial et on remarque que pour cet exemple, elle est très peu sensible au paramètre α et beaucoup plus aux autres paramètres puisque le paramètre α n’a pas varié de sa valeur initiale 6 . Figure 0.6 : Comparaison de la distribution qui a servi à générer les données (α = 0, 55, µm = 0, 4, µf = 0, 35, σm = 0, 020, σ = 0, 15) avec la distribution qui a été estimée (α = 0, 50, µm = 0, 40, µf = 0, 35, σm = 0, 019, σ = 0, 016). Pour implémenter cet algorithme, on crée la classe poisson_loi. Cette classe permet de simuler un échantillon de taille (méthodes simulation, méthodes generate), de calculer la log-vraisemblance pour un échantillon (méthodes densite, log_densite, log_densite_list), de calculer le gradient pour un point x (méthode gradient) ou pour un échantillon méthodes gradient_total). Enfin, cette classe implémtente l’algorithme d’optimisation 0.1 par le biais de la méthode optimisation. La partie principale du programme consiste tout d’abord à créer une instance de cette classe afin de générer une série de 10000 tailles de poisson. Une seconde instance est ensuite créée qui estime ses coefficients à l’aide de la méthode optimisation. Le résultat est affiché puis les densités sont comparées graphiquement (méthode trace_densite). # -*- coding: cp1252 -*import random import math class poisson_loi (object) : """loi de distribution de la taille des poissons""" def __init__(self, alpha = 0.5, mm = 1, sm = 1, mf = 1, sf = 1) : """initialisation des paramètres de la loi""" self.alpha = alpha self.mm = mm self.sm = sm self.mf = mf self.sf = sf 5 10 15 6. Le résultat est le même si la valeur initiale pour α est différente : lors de l’optimisation, ce paramètre évolue très peu. TABLE DES MATIÈRES def init (self, l) : """initialisation de la classe avec une liste de variables""" m = 0 s = 0 for x in l : m += x s += x*x m /= len (l) s /= len (l) s -= m*m self.alpha = 0.5 self.sm = s / 2 self.sf = s / 2 self.sm = math.sqrt (self.sm) self.sf = math.sqrt (self.sf) self.mm = m + self.sm * 2 self.mf = m - self.sf * 2 def __str__(self) : """affichage""" s = "classe poisson_loi\n" s += "alpha = " + str (self.alpha) + "\n" s += "moyenne male = " + str (self.mm) + "\n" s += "sigma male = " + str (self.sm) + "\n" s += "moyenne femelle = " + str (self.mf) + "\n" s += "sigma femelle = " + str (self.sf) + "\n" return s def simulation (self) : """simule une taille de poisson""" u = random.uniform (0,1) v = random.gauss (0,1) if u <= self.alpha : return v * self.sm + self.mm else : return v * self.sf + self.mf def generate (self,N) : """simule N tailles de poisson""" return [ self.simulation () for i in xrange (0,N) ] def trace_densite (self, autre = None) : """trace la courbe de la densité, si autre != None, en trace une autre""" xa = min (self.mm, self.mf) - 3.0 * max (self.sm, self.sf) xb = max (self.mm, self.mf) + 3.0 * max (self.sm, self.sf) n = 100 x = [ xa + (xb - xa) * i / n for i in xrange (0,n+1) ] y = [ self.densite (xa + (xb - xa) * i / n) for i in xrange (0,n+1) ] import pylab as pl pl.plot ( x, y, "b" ) if autre != None : xa = min (autre.mm, autre.mf) - 3.0 * max (autre.sm, autre.sf) xb = max (autre.mm, autre.mf) + 3.0 * max (autre.sm, autre.sf) n = 100 x = [ xa + (xb - xa) * i / n for i in xrange (0,n+1) ] y = [ autre.densite (xa + (xb - xa) * i / n) for i in xrange (0,n+1) ] pl.plot (x, y, "r") pl.title ("Distribution des tailles de poisson") pl.xlabel ("x") pl.ylabel ("y") 20 20 25 30 35 40 45 50 55 60 65 70 75 pl.show() 80 TABLE DES MATIÈRES def densite (self, x) : """calcule de la densité au point x""" dpi = 1.0 / math.sqrt (math.pi * 2) xm = (x - self.mm) ** 2 / (2 * self.sm * self.sm) xm = math.exp (- xm) xf = (x - self.mf) ** 2 / (2 * self.sf * self.sf) xf = math.exp (- xf) return self.alpha * xm / self.sm + (1.0 - self.alpha) * xf / self.sf def log_densite (self, x) : """calcule de la log-densité au point x""" try : return math.log (self.densite (x)) except : print "---------- erreur -------------------------------------------" print x return 0 def log_densite_list (self, l) : """calcule la somme des log-densités au point x de l""" s = 0 for x in l : s += self.log_densite (x) s /= len (l) return s def gradient (self, x) : """calcul le gradient au point x, retourne un t-uple""" unpim = 1.0 / (math.sqrt (2 * math.pi) * self.sm) unpif = 1.0 / (math.sqrt (2 * math.pi) * self.sf) expm = math.exp ( - ( x - self.mm)**2 / (2 * (self.sm**2))) expf = math.exp ( - ( x - self.mf)**2 / (2 * (self.sf**2))) grada = unpim * expm - unpif * expf gradmm = (x - self.mm) / (self.sm** 2) * self.alpha * unpim * expm gradmf = (x - self.mf) / (self.sf** 2) * (1.0 - self.alpha) * unpif * expf gradsm = self.alpha * unpim * (x - self.mm) ** 2 / (self.sm ** 3) - \ self.alpha * unpim / self.sm gradsm *= expm gradsf = (1.0 - self.alpha) * unpif * (x - self.mf) ** 2 / (self.sf ** 3) - \ self.alpha * unpif / self.sf gradsf *= expf f = self.densite (x) return (grada / f, gradmm / f, gradsm / f, gradmf / f, gradsf / f) def gradient_total (self, l) : """calcul la somme des gradients pour tous les x de l""" g = [ 0.0 for i in range (0,5) ] for x in l : (a,b,c,d,e) = self.gradient (x) g [0] += a g [1] += b g [2] += c g [3] += d g [4] += e for i in range (0,len (g)) : g [i] /= len (l) return ( g [0], g [1], g [2], g [3], g [4] ) def optimisation (self, l, epsilon = 0.001, erreur = 1e-5) : """recherche du maximum de la fonction f""" self.init (l) de = self.log_densite_list (l) print "première densité : ", de dold = de / 2 nb = 0 21 85 90 95 100 105 110 115 120 125 130 135 140 145 TABLE DES MATIÈRES while abs (dold - de) / de > erreur : (a,b,c,d,e) = self.gradient_total (l) self.alpha += epsilon * a self.mm += epsilon * b self.sm += epsilon * c self.mf += epsilon * d self.sf += epsilon * e dold = de de = self.log_densite_list (l) nb += 1 print "itération ", nb, " densité ", de, " (", dold, ") abs (dold - de) / de, " epsilon = ", epsilon 22 150 155 ", \ if __name__ == "__main__" : # création d’une instance de la classe cl = poisson_loi (0.55, 0.40, 0.020, 0.35, 0.015) print cl # affichage #cl.trace_densite () # courbe densité 160 165 l = cl.generate (10000) cl2 = poisson_loi () print "-----------------------------------------------------------" print "log densité maximale ", cl.log_densite_list (l) (a,b,c,d,e) = cl.gradient_total (l) print "gradient idéal ", (a,b,c,d,e) print "-----------------------------------------------------------" (a,b,c,d,e) = cl2.gradient_total (l) print "gradient avant", (a,b,c,d,e) cl2.optimisation (l) (a,b,c,d,e) = cl2.gradient_total (l) print "gradient après ", (a,b,c,d,e) print "-----------------------------------------------------------" print cl2 cl2.trace_densite (cl) print "log vraisemblance : ", cl2.log_densite_list (l) 0.0.13 Estimation des paramètres avec une méthode du second degré Le second programme utilise l’algorithme BFGS pour déterminer le maximum de vraisemblance (voir figure 0.7). Cette méthode du second degré permet de corriger le fait que le gradient par rapport au paramètre α est plus faible que les dérivées partielles par rapport aux autres coefficients. On trouve cette fois-ci des valeurs proches du modèle qui a permis de simuler les observations. Ces méthodes sont très calculatoires et pour accélérer la vitesse de convergence de l’algorithme, il est possible d’utiliser le module pysco en utilisant ces deux lignes. import psyco psyco.full () La vitesse du programme est multipliée par trois ou quatre lorsque celui-ci passe la plus grande partie de son temps à faire des calculs. # -*- coding: cp1252 -*import poisson #import scipy.optimize.lbfgsb as Opt # optimisation import bfgs # optimisation 170 175 180 TABLE DES MATIÈRES 23 Figure 0.7 : Comparaison de la distribution qui a servi à générer les données (α = 0, 55, µm = 0, 4, µf = 0, 35, σm = 0, 020, σ = 0, 15) avec la distribution qui a été estimée (α = 0, 54, µm = 0, 40, µf = 0, 35, σm = 0, 020, σ = 0, 015). import numpy as Num import psyco # pour les tableaux def fonction_bfgs (x, cl, l) : """fonction retournant l’opposé de la log-vraisemblance de l’instance cl, fonction à minimiser""" cl.set (x) f = - cl.log_densite_list (l) #print f, "\t", x return f 5 10 15 def fonction_derivee_bfgs (x, cl, l) : """fonction retournant l’opposé de la log-vraisemblance de l’instance cl, fonction à minimiser""" cl.set (x) f = cl.gradient_total (l) return - Num.array (f) class poisson_loi_bfgs (poisson.poisson_loi) : """loi de distribution de la taille des poissons, optimisation à l’aide de l’algorithme BFGS""" 20 25 def __init__(self, alpha = 0.5, mm = 1, sm = 1, mf = 1, sf = 1) : """initialisation des paramètres de la loi""" poisson.poisson_loi.__init__(self, alpha, mm, sm, mf, sf) 30 def set (self, x) : """initialisation avec un tableau""" self.alpha = x [0] self.mm = x [1] self.sm = abs (x [2]) self.mf = x [3] self.sf = abs (x [4]) def get (self) : """retourne un tableau contenant les paramètres""" return Num.array ( (self.alpha, self.mm, self.sm, self.mf, self.sf) ) def __str__(self) : """affichage""" s = "classe poisson_loi BFGS\n" s += "alpha = " + str (self.alpha) + "\n" 35 40 45 TABLE DES MATIÈRES s += "moyenne male = " + str (self.mm) + "\n" s += "sigma male = " + str (self.sm) + "\n" s += "moyenne femelle = " + str (self.mf) + "\n" s += "sigma femelle = " + str (self.sf) + "\n" return s def optimisation (self, l, epsilon = 0.001) : """recherche du maximum de la fonction f""" self.init (l) x0 = self.get () print x0 opt = bfgs.optimisation_bfgs (fonction_bfgs, \ fonction_derivee_bfgs, \ args = (self, l)) x = opt.optimise (x0) #x = bfgs.Opt.fmin_l_bfgs_b ( fonction_bfgs, \ # x0, \ # fonction_derivee_bfgs, \ # args = (self, l)) self.set (x) print "optimisation terminée" print "valeur maximale : ", self.log_densite_list (l) print "message ", d 24 50 55 60 65 70 if __name__ == "__main__" : psyco.full () # création d’une instance de la classe cl = poisson.poisson_loi (0.55, 0.40, 0.020, 0.35, 0.015) print cl # affichage #cl.trace_densite () # courbe densité l = cl.generate (10000) cl2 = poisson_loi_bfgs () print "-----------------------------------------------------------" print "log densité maximale ", cl.log_densite_list (l) (a,b,c,d,e) = cl.gradient_total (l) print "gradient idéal ", (a,b,c,d,e) print "-----------------------------------------------------------" (a,b,c,d,e) = cl2.gradient_total (l) print "gradient avant", (a,b,c,d,e) cl2.optimisation (l) (a,b,c,d,e) = cl2.gradient_total (l) print "gradient après ", (a,b,c,d,e) print "-----------------------------------------------------------" print cl2 cl2.trace_densite (cl) print "log vraisemblance : ", cl2.log_densite_list (l) 75 80 85 90 95 Index H histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 A Algorithme algorithme BFGS . . . . . . . . . . . . . . . . . . . . . . . . . 6 descente de gradient de Newton . . . . . . . . . . . 3 optimisation stochastique . . . . . . . . . . . . . . . . . 8 simulation d’une variable selon un mélange de deux lois normales . . . . . . . . . . . . . . . . 18 apprentissage second ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 I indépendance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 inégalité de Jensen . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 J Jensen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 K Kullback-Leiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 B BFGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 L likelihood . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 log-vraisemblance. . . . . . . . . . . . . . . . . . . . . . . . .10, 19 C Cauchy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 condition d’arrêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 convergence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 vitesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 critère Cauchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 M méthode non-paramétrique . . . . . . . . . . . . . . . . . . . . . . . . 11 noyaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 paramétrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 second ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 module math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Numeric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 psyco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15, 22 random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 moyenne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 D descente gradient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 DFP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 distance Kullback-Leiber . . . . . . . . . . . . . . . . . . . . . . . . . . 12 distribution queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 N Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 noyau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 E écart-type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 échantillon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 EM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 emv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 énénement rare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 espérance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 estimateur du maximum de vraisemblance . 9, 13 Expectation-Maximisation. . . . . . . . . . . . . . . . . . . .14 O optimisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 BFGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 DFP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 stochastique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 valeurs initiale . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 ordre méthode du second ordre . . . . . . . . . . . . . . . . . . 5 F fonction quadratique . . . . . . . . . . . . . . . . . . . . . . . . . . 9 G gradient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 conjugué . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 descente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 3 stochastique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 P poisson. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Problème distance de Kullback-Leiber . . . . . . . . . . . . . . 12 25 Index programmes, exemples psyco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 algorithme BFGS . . . . . . . . . . . . . . . . . . . . . . . 15 BFGS, scipy . . . . . . . . . . . . . . . . . . . . . . . . . 15, 17 déterminer la taille des poissons . . . . . . . . . 22 simulation de tailles de poissons . . . . . . . . . 19 Q quasi-Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 R références Bottou1991 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5, 8 Broyden1967 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Davidon1959 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Dempster1977. . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Driancourt1996 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Fletcher1963 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Fletcher1993 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Moré1977 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Robert1996 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 remarque Algorithme Expectation-Maximisation . . . 14 S simulation mélange de lois normales . . . . . . . . . . . . . . . . . 17 stochastique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 8 T Théorème convergence de la méthode de Newton (Bottou1991) . . . . . . . . . . . . . . . . . . . . . . . . . 4 distance de Kullback-Leiber . . . . . . . . . . . . . . 12 V vague . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 variables indépendantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 variance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 vraisemblance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 19 Liens numéros Algorithme 0.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 0.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 0.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 0.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 démonstration théorème 0.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Problème 0.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Théorème 0.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 0.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 26 Table des matières 0.0.1 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 0.0.8 0.0.9 0.0.10 0.0.11 0.0.12 0.0.13 Index Enoncé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Algorithme et convergence . . . . . . . . . . . . . . . . . . . . . . . . Méthode du second ordre . . . . . . . . . . . . . . . . . . . . . . . . Minimisation avec gradient stochastique . . . . . . . . . . . . . . . . Premier exemple : optimisation d’une fonction quadratique . . . . . Court rappel sur l’estimateur du maximum de vraisemblance . . . . Second exemple : proportion de mâles chez les poissons . . . . . . . . Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Premier exemple, fonction quadratique . . . . . . . . . . . . . . . . . Second exemple, proportion de mâles et de femelles chez les poissons Simulation d’une série (Xi )i . . . . . . . . . . . . . . . . . . . . . . . Estimation des paramètres avec une méthode du premier degré . . . Estimation des paramètres avec une méthode du second degré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 5 7 9 9 13 14 14 17 17 18 22 25