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 . 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.
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 la matrice npm
. 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 :
vérifie . La matrice est diagonale et on peut montrer que toutes les valeurs propres sont positives ().
On définit alors la racine carrée de la matrice par :
On définit ensuite la racine carrée de la matrice :
On vérifie que .
Calcul de la racine carrée¶
Q6¶
Le module numpy propose une fonction qui retourne la matrice et le vecteur des valeurs propres :
L,P = np.linalg.eig(a)
Vérifier que . 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 (on rappelle que 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 représente un vecteur de trois variables corrélées. La matrice de covariance est . Calculer la matrice de covariance de la matrice (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 à 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.