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