<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1A.data - Décorrélation de variables aléatoires - correction
On construit des variables corrélées gaussiennes et on cherche à construire des variables décorrélées en utilisant le calcul matriciel. (correction)
Step1:  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 .....
Step2:  Q2
Step3:  a est la matrice de covariance.
Corrélation de matrices
Q3
Step4:  Q4
Step5:  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$ 
Step6:  C'est presque l'identité aux erreurs de calcul près.
Q7
np.diag(l) construit une matrice diagonale à partir d'un vecteur.
Step7:  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.
Step8:  On vérifie qu'on ne s'est pas trompé.
Step9:  Décorrélation
Step10:  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 
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Explanation: 1A.data - Décorrélation de variables aléatoires - correction
On construit des variables corrélées gaussiennes et on cherche à construire des variables décorrélées en utilisant le calcul matriciel. (correction)
End of explanation
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]
    
li = [ combinaison () for i in range (0,100) ]
mat = np.matrix(li)
mat[:5]
Explanation: 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 .....
End of explanation
npm = mat
t   = npm.transpose ()
a   = t @ npm 
a  /= npm.shape[0]
a
Explanation: Q2
End of explanation
cov = a
var = np.array([cov[i,i]**(-0.5) for i in range(cov.shape[0])])
var.resize((3,1))
varvar = var @ var.transpose()
varvar
cor = np.multiply(cov, varvar)
cor
Explanation: a est la matrice de covariance.
Corrélation de matrices
Q3
End of explanation
def correlation(npm):
    t   = npm.transpose ()
    a   = t @ npm 
    a  /= npm.shape[0]
    var = np.array([cov[i,i]**(-0.5) for i in range(cov.shape[0])])
    var.resize((3,1))
    varvar = var @ var.transpose()
    return np.multiply(cov, varvar)
correlation(npm)
Explanation: Q4
End of explanation
L,P = np.linalg.eig(a)
P.transpose() @ P
Explanation: 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é ?
End of explanation
np.diag(L)
Explanation: C'est presque l'identité aux erreurs de calcul près.
Q7
np.diag(l) construit une matrice diagonale à partir d'un vecteur.
End of explanation
def square_root_matrix(M):
    L,P = np.linalg.eig(M)
    L = L ** 0.5
    root = P @ np.diag(L) @ P.transpose()
    return root
    
root = square_root_matrix(cov)
root
Explanation: 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.
End of explanation
root @ root - cov
Explanation: On vérifie qu'on ne s'est pas trompé.
End of explanation
np.linalg.inv(cov)
Explanation: Décorrélation
End of explanation
def simultation (N, cov) :
    # simule un échantillon de variables corrélées
    # N : nombre de variables
    # cov : matrice de covariance
    # ...
    return M
Explanation: 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 :
End of explanation
<END_TASK>