Décorrélation de variables aléatoires

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

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

[1]:
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. L’exemple suivant vous évitera peut-être quelques erreurs.

[7]:
a = np.array([[0, 1], [2, 3]])
b = a.copy()  # remplacé b = a dans l'exemple qui suit.
b[0, 0] = 44444444
print(a)  # et comparer le résultat ici
[[0 1]
 [2 3]]
[6]:
a = np.array([[0, 1], [2, 3]])
b = a
b[0, 0] = 44444444
print(a)  # et comparer le résultat ici
[[44444444        1]
 [       2        3]]

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.

[5]:
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{split}\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}\end{split}\]

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 :

[6]:
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.


Notebook on github