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