import numpy as np
import numpy.linalg as lin
import matplotlib.pylab as plt
import plotly.graph_objects as go
np.set_printoptions(precision=3, linewidth=150, suppress=True)
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
np.random.seed(0)
Exercice : Nuage de points en 3D¶
On a des résultats de mesures et on sait qu'on doit avoir une relation quadratique entre x et z :
$$ z = \alpha \, x^2 + \beta \, x + \gamma $$
Comment trouver ces 3 coefficients ?
Bien sûr on va faire une analyse en composante principale mais attention, cela ne marche que pour les relations linéaires (ca nous donne un vecteur). Aussi il faut introduire une nouvelle variable pour que notre équation soit linéaire.
Comment écrire notre équation pour qu'elle soit linéaire suivant 2 variables ?
réponse :¶
...
Données de l'expérience¶
Fabriquer un nuage de point 2D avec l'équation
$$ z = -1.3 \, x^2 + 0.2 \, x + 1.45 + U(-1,1)$$
où U est la loi uniforme qui simule du bruit.
N = 50
x = ... # x varie entre -3 et 3
z = ...
nuage = np.array([x,z])
plt.plot(nuage[0], nuage[1], 'x')
plt.title('Un nuage de points')
plt.axis('equal');
Calculs pour trouver les caractéristiques de notre nuage¶
Fabriquer à partir de notre nuage de points 2D un nuage de points 3D en introduisant la nouvelle variable qu'on a choisit.
Le nouveau nuage s'appelle nuage3D
.
fig = go.Figure(data=[go.Scatter3d(x=nuage3D[0], y=nuage3D[1], z=nuage3D[2], mode='markers')])
fig.show()
Calculer la matrice de covariance de notre nuage et ses vecteurs propres (on stockera les vecteurs propres dans la variable vec
).
fig = go.Figure(data=[go.Scatter3d(x=nuage3D[0], y=nuage3D[1], z=nuage3D[2], mode='markers'),
go.Scatter3d(x=[0,-5*vec[0,0]], y=[0,-5*vec[1,0]], z=[0,-5*vec[2,0]]),
go.Scatter3d(x=[0,vec[0,1]], y=[0,vec[1,1]], z=[0,vec[2,1]])])
fig.show()
Que peut-on déduire de notre premier vecteur propre ?
réponse¶
...
Créer un nuage de point en 2D qui ne prend plus en compte l'impact du coefficient que l'on vient de trouver.
On appelle ce nouveau nuage nuage2D
(ce n'est pas le même que notre nuage
initial).
plt.plot(nuage2D[0], nuage2D[1], 'x')
plt.axis('equal');
print("Les coefficients de z fonction polynomiale de degré 2 en x sont :\n")
print(f"alpha = {alpha}")
print(f"beta = {beta}")
print(f"gamma = {gamma}")
Vous pouvez tout relancer en changer la valeur de la graine de l'aléatoire. Vous allez voir que parfois le bruit perturbe bien plus les résultats.