.. _decorrelationrst: =============================================== 1A.data - Décorrélation de variables aléatoires =============================================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/td1a_dfnp/decorrelation.ipynb|*` On construit des variables corrélées gaussiennes et on cherche à construire des variables décorrélées en utilisant le calcul matriciel. .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: Ce TD appliquera le calcul matriciel aux vecteurs de variables normales `corrélées `__ ou aussi `décomposition en valeurs singulières `__. Création d’un jeu de données ---------------------------- Q1 ~~ La première étape consiste à construire des variables aléatoires normales corrélées dans une matrice :math:`N \times 3`. On cherche à construire cette matrice au format `numpy `__. Le programme suivant est un moyen de construire un tel ensemble à l’aide de combinaisons linéaires. Complétez les lignes contenant des ``....``. .. code:: ipython3 import random import numpy as np def combinaison () : x = random.gauss(0,1) # génère un nombre aléatoire y = random.gauss(0,1) # selon une loi normale z = random.gauss(0,1) # de moyenne null et de variance 1 x2 = x y2 = 3*x + y z2 = -2*x + y + 0.2*z return [x2, y2, z2] # mat = [ ............. ] # npm = np.matrix ( mat ) Q2 ~~ A partir de la matrice ``npm``, on veut construire la matrice des corrélations. .. code:: ipython3 npm = ... # voir question précédente t = npm.transpose () a = t * npm a /= npm.shape[0] A quoi correspond la matrice ``a`` ? Corrélation de matrices ~~~~~~~~~~~~~~~~~~~~~~~ Q3 ~~ Construire la matrice des corrélations à partir de la matrice ``a``. Si besoin, on pourra utiliser le module `copy `__. .. code:: ipython3 import copy b = copy.copy (a) # remplacer cette ligne par b = a b[0,0] = 44444444 print(b) # et comparer le résultat ici :: --------------------------------------------------------------------------- NameError Traceback (most recent call last) in () 1 import copy ----> 2 b = copy.copy (a) # remplacer cette ligne par b = a 3 b [0,0] = 44444444 4 print(b) # et comparer le résultat ici NameError: name 'a' is not defined Q4 ~~ Construire une fonction qui prend comme argument la matrice ``npm`` et qui retourne la matrice de corrélation. Cette fonction servira plus pour vérifier que nous avons bien réussi à décorréler. .. code:: ipython3 def correlation(npm): # .......... return "....." Un peu de mathématiques ----------------------- Pour la suite, un peu de mathématique. On note :math:`M` la matrice ``npm``. :math:`V=\frac{1}{n}M'M` correspond à la matrice des *covariances* et elle est nécessairement symétrique. C’est une matrice diagonale si et seulement si les variables normales sont indépendantes. Comme toute matrice symétrique, elle est diagonalisable. On peut écrire : .. math:: \frac{1}{n}M'M = P \Lambda P' :math:`P` vérifie :math:`P'P= PP' = I`. La matrice :math:`\Lambda` est diagonale et on peut montrer que toutes les valeurs propres sont positives (:math:`\Lambda = \frac{1}{n}P'M'MP = \frac{1}{n}(MP)'(MP)`). On définit alors la racine carrée de la matrice :math:`\Lambda` par : .. math:: \begin{array}{rcl} \Lambda &=& diag(\lambda_1,\lambda_2,\lambda_3) \\ \Lambda^{\frac{1}{2}} &=& diag\left(\sqrt{\lambda_1},\sqrt{\lambda_2},\sqrt{\lambda_3}\right)\end{array} On définit ensuite la racine carrée de la matrice :math:`V` : .. math:: V^{\frac{1}{2}} = P \Lambda^{\frac{1}{2}} P' On vérifie que :math:`\left(V^{\frac{1}{2}}\right)^2 = P \Lambda^{\frac{1}{2}} P' P \Lambda^{\frac{1}{2}} P' = P \Lambda^{\frac{1}{2}}\Lambda^{\frac{1}{2}} P' = V = P \Lambda P' = V`. Calcul de la racine carrée -------------------------- Q6 ~~ Le module `numpy `__ propose une fonction qui retourne la matrice :math:`P` et le vecteur des valeurs propres :math:`L` : :: L,P = np.linalg.eig(a) Vérifier que :math:`P'P=I`. Est-ce rigoureusement égal à la matrice identité ? Q7 ~~ Que fait l’instruction suivante : ``np.diag(L)`` ? Q8 ~~ Ecrire une fonction qui calcule la racine carrée de la matrice :math:`\frac{1}{n}M'M` (on rappelle que :math:`M` est la matrice ``npm``). Voir aussi `Racine carrée d’une matrice `__. Décorrélation ------------- ``np.linalg.inv(a)`` permet d’obtenir l’inverse de la matrice ``a``. Q9 ~~ Chaque ligne de la matrice :math:`M` représente un vecteur de trois variables corrélées. La matrice de covariance est :math:`V=\frac{1}{n}M'M`. Calculer la matrice de covariance de la matrice :math:`N=M V^{-\frac{1}{2}}` (mathématiquement). Q10 ~~~ Vérifier numériquement. Simulation de variables corrélées --------------------------------- Q11 ~~~ A partir du résultat précédent, proposer une méthode pour simuler un vecteur de variables corrélées selon une matrice de covariance :math:`V` à partir d’un vecteur de lois normales indépendantes. Q12 ~~~ Proposer une fonction qui crée cet échantillon : .. code:: ipython3 def simultation (N, cov) : # simule un échantillon de variables corrélées # N : nombre de variables # cov : matrice de covariance # ... return M Q13 ~~~ Vérifier que votre échantillon a une matrice de corrélations proche de celle choisie pour simuler l’échantillon.