1A.data - Décorrélation de variables aléatoires#

Links: notebook, html, python, slides, GitHub

On construit des variables corrélées gaussiennes et on cherche à construire des variables décorrélées en utilisant le calcul matriciel.

from jyquickhelper import add_notebook_menu
add_notebook_menu()

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 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 .....

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.

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.

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)
<ipython-input-6-e4c5a44882a1> in <module>()
      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.

def correlation(npm):
    # ..........
    return "....."

Un peu de mathématiques#

Pour la suite, un peu de mathématique. On note M la matrice npm. 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 :

\frac{1}{n}M'M = P \Lambda P'

P vérifie P'P= PP' = I. La matrice \Lambda est diagonale et on peut montrer que toutes les valeurs propres sont positives (\Lambda = \frac{1}{n}P'M'MP = \frac{1}{n}(MP)'(MP)).

On définit alors la racine carrée de la matrice \Lambda par :

\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 V :

V^{\frac{1}{2}} = P \Lambda^{\frac{1}{2}} P'

On vérifie que \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 P et le vecteur des valeurs propres L :

::

L,P = np.linalg.eig(a)

Vérifier que 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 \frac{1}{n}M'M (on rappelle que 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 M représente un vecteur de trois variables corrélées. La matrice de covariance est V=\frac{1}{n}M'M. Calculer la matrice de covariance de la matrice 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 V à partir d’un vecteur de lois normales indépendantes.

Q12#

Proposer une fonction qui crée cet échantillon :

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.