Skip to content
Snippets Groups Projects

Linear regression w/ normal equation & gradient descent

Merged Ghost User requested to merge develop into main
2 files
+ 894
0
Compare changes
  • Side-by-side
  • Inline
Files
2
{
"cells": [
{
"cell_type": "markdown",
"id": "1234512c-1cf4-48e0-bd5b-655ffae2fdc9",
"metadata": {},
"source": [
"# Une droite de régression avec l’équation normale"
]
},
{
"cell_type": "markdown",
"id": "82361175-55ff-440a-9a4c-db10d3cc8dd8",
"metadata": {},
"source": [
"Dans le précédent TD, nous avons calculé la droite de régression des moindres carrés à la main. Il existe toutefois une méthode plus rapide et tout aussi efficace pour obtenir le coefficient directeur et l’ordonnée à l’origine d’une droite de régression, l’équation normale :\n",
"\n",
"$$\\hat{\\theta} = \\left(X^TX\\right)^{-1}X^Ty$$\n",
"\n",
"Si cette équation se résoud très facilement avec Python, nous essaierons, dans un premier temps, de la mettre en application à partir d’un exemple très simple."
]
},
{
"cell_type": "markdown",
"id": "df07ebda-a797-4c77-b249-7431438485f3",
"metadata": {},
"source": [
"## Mise en place des termes"
]
},
{
"cell_type": "markdown",
"id": "daffa490-2887-4533-8212-1007eedafc36",
"metadata": {},
"source": [
"Considérons deux points de coordonnées $(3;2)$ et $(5;1)$ que nous répartissons dans deux matrices, $A$ pour les coordonnées sur l’axe des abscisses et $B$ pour celles sur l’axe des ordonnées, toutes deux de dimensions $(2, 1)$ :\n",
"\n",
"$$ A =\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 \\\\\n",
" 5 \\\\\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"$$ B =\n",
" \\left[ {\\begin{array}{cc}\n",
" 2 \\\\\n",
" 1 \\\\\n",
" \\end{array} } \\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "12f6d0dc-db36-4031-9999-858f079c6911",
"metadata": {},
"source": [
"### Résolution avec l’équation réduite"
]
},
{
"cell_type": "markdown",
"id": "0346c97c-d585-4eaf-bb44-3c97db9dd878",
"metadata": {},
"source": [
"Comme nous disposons de deux points qui sont des solutions de la droite, il est possible de résoudre la droite de régression avec l’équation réduite :\n",
"\n",
"$$y = mx + b$$\n",
"\n",
"Les deux termes à calculer sont le coefficient directeur $m$ et l’ordonnée à l’origine $b$."
]
},
{
"cell_type": "markdown",
"id": "b7724320-86f0-4ac8-a844-51892d5c185a",
"metadata": {},
"source": [
"#### Le coefficient directeur"
]
},
{
"cell_type": "markdown",
"id": "81f64e45-7063-49d7-9f14-b6336ea6bc56",
"metadata": {},
"source": [
"Le coefficient directeur en calculant le rapport entre la différence des coordonnées sur l’axe des ordonnées et celle sur l’axe des abscisses :\n",
"\n",
"$$m = \\frac{\\Delta y}{\\Delta x}$$\n",
"\n",
"Comme nous connaissons les coordonnées des deux points, nous obtenons pour $m$ :\n",
"\n",
"$$\\begin{eqnarray}\n",
"m &=& \\frac{2 - 1}{3 - 5} \\\\\n",
"&=& \\frac{1}{-2} \\\\\n",
"&=& -0.5\n",
"\\end{eqnarray}$$"
]
},
{
"cell_type": "markdown",
"id": "b5920ac4-9523-4eaf-bf3d-107ded395362",
"metadata": {},
"source": [
"#### L’ordonnée à l’origine"
]
},
{
"cell_type": "markdown",
"id": "8c9f5764-b458-4afc-9fde-8fad17cf5aee",
"metadata": {},
"source": [
"Pour obtenir $b$, retenons les coordonnées du premier point $(3;2)$, qui nous indiquent que lorsque $x$ vaut $3$, alors $y$ vaut $2$. De là nous déduisons l’équation réduite suivante, pour un coefficient directeur à $-0.5$ :\n",
"\n",
"$$\\begin{eqnarray}\n",
"2 &=& -0.5 \\times 3 + b \\\\\n",
"b &=& 3.5\n",
"\\end{eqnarray}$$\n",
"\n",
"L’équation réduite vaut :\n",
"\n",
"$$y = - 0.5x + 3.5$$"
]
},
{
"cell_type": "markdown",
"id": "af4c12ee-55b8-4da1-89fb-48548357f606",
"metadata": {},
"source": [
"### Première tentative de résolution avec l’équation normale"
]
},
{
"cell_type": "markdown",
"id": "29f60a96-df2e-4993-9bbe-c2f7f47f19a2",
"metadata": {},
"source": [
"Maintenant que nous avons calculé $m$ et $b$ avec l’équation réduite, on s’attend évidemment à obtenir les mêmes résultats avec l’équation normale.\n",
"\n",
"Essayons de traduire simplement la formule dans une première tentative, étape par étape. La première consiste à obtenir la transposée de $A$, qui devient une matrice de dimensions $(1, 2)$ :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 \\\\\n",
" 5 \\\\\n",
" \\end{array} } \\right]^\\top =\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 & 5\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"La seconde étape implique de calculer le produit matriciel entre la transposée de $A$ et $A$ :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 & 5\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 \\\\\n",
" 5 \\\\\n",
" \\end{array} } \\right]\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" (3 \\times 3) + (5 \\times 5)\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 34\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$\n",
"\n",
"Poursuivons en calculant maintenant l’inverse de la matrice obtenue précédemment :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" 34\n",
" \\end{array} } \\right]^{-1} =\n",
" \\left[ {\\begin{array}{cc}\n",
" 0.02941176\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"Multiplions à présent cette matrice, de dimensions $(1, 1)$, avec la transposée de $A$ pour obtenir une matrice de dimensions $(1, 2)$ :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" 0.02941176\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 3 & 5\n",
" \\end{array} } \\right] =\n",
" \\left[ {\\begin{array}{cc}\n",
" 0.08823529 & 0.14705882\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"La dernière étape consiste à calculer le produit de la matrice précédente avec $B$. Et le résultat du produit matriciel entre une matrice $(1, 2)$ et une autre $(2, 1)$ renvoie une matrice carrée de dimensions $(1, 1)$ :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" \\left[ {\\begin{array}{cc}\n",
" 0.08823529 & 0.14705882\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 2 \\\\\n",
" 1 \\\\\n",
" \\end{array} } \\right]\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" (0.08823529 \\times 2) + (0.14705882 \\times 1)\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 0.32352941\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$\n",
"\n",
"Or, nous aurions besoin d’une matrice de dimensions $(2,2)$ au moment d’effectuer le produit matriciel avec $B$, et ce afin d’obtenir $m$ et $b$. Il nous manque clairement une dimension. D’autant plus que, à bien réfléchir, dans la géométrie euclidienne, on a besoin de deux points pour tracer une droite. Comment faire pour calculer le coefficient directeur et l’ordonnée à l’origine d’une droite qui n’en comporte qu’un seul ?\n",
"\n",
"La solution consiste à rajouter une dimension à $A$, de telle manière que le produit n’en soit pas affecté. On en revient toujous à l’équation réduite d’une droite $y = \\theta x$ où $x$ est notre matrice $A$ et $\\theta$ la matrice qui devra contenir $m$ et $b$. Or, dans notre exemple, $\\theta$ ne pourra être constitué que d’un élément, ce qui ne nous permettra pas de retrouver la formule canonique $y = mx + b$, mais seulement $y = mx$ avec en prime une fausse estimation de $m$. Pour que le produit matriciel fonctionne, nous allons fixer la nouvelle dimension de notre matrice initiale $A$ à $1$ pour obtenir :\n",
"\n",
"$$y = mx + b \\times 1$$\n",
"\n",
"D’un point de vue mathématique, la matrice $A^\\prime$ prendra l’aspect suivant :\n",
"\n",
"$$\n",
" A^\\prime = \n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 3 \\\\\n",
" 1 & 5 \\\\\n",
" \\end{array} } \\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "4dba77b7-68d9-4c35-84a6-222f10fba946",
"metadata": {},
"source": [
"## La transposée d’une matrice"
]
},
{
"cell_type": "markdown",
"id": "ab0ca909-50ce-45ec-8f34-95bb14b751fd",
"metadata": {},
"source": [
"Si l’on reprend toutes les étapes du calcul de l’équation normale, nous devons d’abord trouver la transposée de $A^\\prime$. $A^\\prime$ est une matrice carrée de dimensions $(2, 2)$. Pour obtenir sa transposée, il suffit de tracer une diagonale entre le premier élément de la première ligne ($1$) et le dernier élément de la deuxième ligne ($5$), puis d’effectuer un pivot autour de cet axe. Les nombres $1$ et $3$ inversent ainsi leur position :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 3 \\\\\n",
" 1 & 5 \\\\\n",
" \\end{array} } \\right]^\\top =\n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 1 \\\\\n",
" 3 & 5 \\\\\n",
" \\end{array} } \\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6db59b4c-dbc8-42f2-aa85-6168cb33bc35",
"metadata": {},
"source": [
"## Un produit matriciel"
]
},
{
"cell_type": "markdown",
"id": "4394b362-f9ed-4212-8bce-df0af0c201a9",
"metadata": {},
"source": [
"Calculer le produit entre deux matrices demande un peu de doigté. Dans notre exemple, le produit matriciel entre la transposée de $A^\\prime$ et $A^\\prime$ se résoud ainsi :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 1 \\\\\n",
" 3 & 5 \\\\\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 3 \\\\\n",
" 1 & 5 \\\\\n",
" \\end{array} } \\right]\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" (1 \\times 1) + (1 \\times 1) & (1 \\times 3) + (1 \\times 5) \\\\\n",
" (3 \\times 1) + (5 \\times 1) & (3 \\times 3) + (5 \\times 5) \\\\\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 2 & 8 \\\\\n",
" 8 & 34 \\\\\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$\n",
"\n",
"Afin de bien comprendre la mécanique à l’œuvre, remplaçons les valeurs par des abstractions :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" a & b \\\\\n",
" c & d \\\\\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" e & f \\\\\n",
" g & h \\\\\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"L’enchaînement des opérations correspond à effectuer les rapports suivants :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" (a \\times e) + (b \\times g) & (a \\times f) + (b \\times h) \\\\\n",
" (c \\times e) + (d \\times g) & (c \\times f) + (d \\times h) \\\\\n",
" \\end{array} } \\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "5f9e44d8-bd76-42dc-89b1-e1323980b4b9",
"metadata": {},
"source": [
"## L’inverse d’une matrice"
]
},
{
"cell_type": "markdown",
"id": "2adc7f8f-47d1-4b09-8d31-29acde821097",
"metadata": {},
"source": [
"La formule qui régit le calcul de l’inverse d’une matrice implique de trouver son déterminant et la transposée de sa comatrice :\n",
"\n",
"$$\n",
" A^{-1} = \\frac{1}{det(A)} ^\\top{com(A)}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6a122045-f4ae-413f-8421-26ee65214b9f",
"metadata": {},
"source": [
"### Le déterminant d’une matrice"
]
},
{
"cell_type": "markdown",
"id": "4f481948-e7c0-4fc3-b3a4-4c7de6a085f8",
"metadata": {},
"source": [
"Le déterminant d’une matrice s’obtient en effectuant la différence entre les produits des éléments de chaque diagonale. Soit la matrice suivante :\n",
"\n",
"$$\n",
" \\left[ {\\begin{array}{cc}\n",
" a & b \\\\\n",
" c & d \\\\\n",
" \\end{array} } \\right]\n",
"$$\n",
"\n",
"Son déterminant vaut :\n",
"\n",
"$$(a \\times d) - (b \\times c)$$\n",
"\n",
"Pour notre exemple, le déterminant de la matrice vaut :\n",
"\n",
"$$\n",
" det \\left[ {\\begin{array}{cc}\n",
" 2 & 8 \\\\\n",
" 8 & 34 \\\\\n",
" \\end{array} } \\right] = (2 \\times 34) - (8 \\times 8) = 4\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "881e56c8-47ad-439b-81f0-680d84dbb3e4",
"metadata": {},
"source": [
"### La transposée de la comatrice"
]
},
{
"cell_type": "markdown",
"id": "10881b0a-3344-4a6a-87fc-2cf25d9f93ab",
"metadata": {},
"source": [
"Et pour la transposée de sa comatrice, on intervertit les éléments de la première diagonale et on multiplie les autres par $-1$ :\n",
"\n",
"$$\n",
" ^\\top{com \\left[ {\\begin{array}{cc}\n",
" 2 & 8 \\\\\n",
" 8 & 34 \\\\\n",
" \\end{array} } \\right] } = \n",
" \\left[ {\\begin{array}{cc}\n",
" 34 & -8 \\\\\n",
" -8 & 2 \\\\\n",
" \\end{array} } \\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0acb17e8-415e-4c5e-9504-c54f1b888b8a",
"metadata": {},
"source": [
"### Résolution de l’inverse de la matrice"
]
},
{
"cell_type": "markdown",
"id": "3c5ac4b5-f22a-4ccf-b1bf-7d201fb83a2b",
"metadata": {},
"source": [
"Nous obtenons alors pour l’inverse de $A$ :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" A^{-1} = \\frac{1}{4} \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 34 & -8 \\\\\n",
" -8 & 2 \\\\\n",
" \\end{array} } \\right]\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" \\frac{34}{4} & \\frac{-8}{4} \\\\\n",
" \\frac{-8}{4} & \\frac{2}{4} \\\\\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 8.5 & -2 \\\\\n",
" -2 & 0.5 \\\\\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6a4d7ac3-200e-4732-9d5f-90becc66744f",
"metadata": {},
"source": [
"## Seconde tentative de résolution avec l’équation normale"
]
},
{
"cell_type": "markdown",
"id": "3804ef5b-1093-430a-9f1a-f9eec684744b",
"metadata": {},
"source": [
"Toutes les briques sont posées pour achever la résolution de l’équation normale. Les deux ultimes étapes consistent à effectuer des produits matriciels.\n",
"\n",
"Le premier est entre $A^{-1}$ et la transposée de $A^\\prime$ :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" \\left[ {\\begin{array}{cc}\n",
" 8.5 & -2 \\\\\n",
" -2 & 0.5 \\\\\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 1 & 1 \\\\\n",
" 3 & 5 \\\\\n",
" \\end{array} } \\right]\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" (8.5 \\times 1) + (-2 \\times 3) & (8.5 \\times 1) + (-2 \\times 5) \\\\\n",
" (-2 \\times 1) + (0.5 \\times 3) & (-2 \\times 1) + (0.5 \\times 5) \\\\\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 2.5 & -1.5 \\\\\n",
" -0.5 & 0.5 \\\\\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$\n",
"\n",
"Et le second entre cette matrice et $B$ :\n",
"\n",
"$$\n",
"\\begin{eqnarray}\n",
" \\theta &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 2.5 & -1.5 \\\\\n",
" -0.5 & 0.5 \\\\\n",
" \\end{array} } \\right] \\times\n",
" \\left[ {\\begin{array}{cc}\n",
" 2 \\\\\n",
" 1 \\\\\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" (2.5 \\times 2) + (-1.5 \\times 1) \\\\\n",
" (-0.5 \\times 2) + (0.5 \\times 1) \\\\\n",
" \\end{array} } \\right] \\\\\n",
" &=&\n",
" \\left[ {\\begin{array}{cc}\n",
" 3.5 \\\\\n",
" -0.5 \\\\\n",
" \\end{array} } \\right]\n",
"\\end{eqnarray}\n",
"$$\n",
"\n",
"Le résultat est bien une matrice de dimensions $(2, 1)$ d’où nous pouvons établir l’équation réduite de la droite :\n",
"\n",
"$$y = -0.5x + 3.5$$"
]
},
{
"cell_type": "markdown",
"id": "3ab09c45-7e26-45ec-8d18-50e31e7517ee",
"metadata": {},
"source": [
"## Résolution avec Python"
]
},
{
"cell_type": "markdown",
"id": "dd92fdbe-1fc9-4fa6-821b-e479daa5dc73",
"metadata": {},
"source": [
"Reprenons tout d’abord les données du recensement des manchots en Antarctique :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c4a2c6a3-0c45-402c-a5ff-f59747bfd09c",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"\n",
"df = pd.read_csv(\"./files/penguin-census.csv\")\n",
"\n",
"coords = df.loc[:,[\"body_mass_g\",\"flipper_length_mm\"]]\n",
"coords = coords.dropna()\n",
"coords = coords.to_numpy()"
]
},
{
"cell_type": "markdown",
"id": "563528d7-4f2e-4488-94e2-f35e21178e8d",
"metadata": {},
"source": [
"Pour résoudre cette équation, nous avons besoin de connaître trois éléments pour mettre en place la formule :\n",
"- La fonction `np.linalg.inv()` pour obtenir l’inverse d’une matrice ;\n",
"- la syntaxe `X.T` pour la transposée d’une matrice ;\n",
"- et la méthode `.dot()` pour le produit matriciel.\n",
"\n",
"Essayons simplement de traduire la formule telle quelle :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3900967e-5fcd-420f-81e6-7a0ee5e4fd1b",
"metadata": {},
"outputs": [],
"source": [
"# copy as matrices\n",
"X = np.c_[coords[:, 0]]\n",
"Y = np.c_[coords[:, 1]]\n",
"\n",
"theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)\n",
"\n",
"theta"
]
},
{
"cell_type": "markdown",
"id": "b8ac3f59-fe15-4570-8218-88ea9bb24114",
"metadata": {},
"source": [
"Une seule valeur est contenue dans `theta` alors qu’on nous en avait promis deux : le coefficient directeur et l’ordonnée à l’origine. Nous nous retrouvons dans la situation décrite plus haut, lorsqu’il nous manquait une dimension dans notre espace.\n",
"\n",
"Rajoutons une dimension avec des valeurs fixées à $1$ :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5874cbbd-6362-4d73-a6c9-806bac151e8d",
"metadata": {},
"outputs": [],
"source": [
"X = np.c_[\n",
" # x0 = 1\n",
" np.ones(coords[:, 0].shape),\n",
" # x1 = x\n",
" coords[:, 0]\n",
"]"
]
},
{
"cell_type": "markdown",
"id": "e2639665-d954-4c66-a9be-73ff6ec94c1b",
"metadata": {},
"source": [
"Effectuons de nouveau le calcul de $\\theta$ :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fe9af970-e6aa-4d0b-aa49-f824e0ccd7e1",
"metadata": {},
"outputs": [],
"source": [
"theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)\n",
"\n",
"theta"
]
},
{
"cell_type": "markdown",
"id": "f3691d5b-e1f6-4983-9fa5-928503c1af71",
"metadata": {},
"source": [
"Vérifions que les résultats coïncident bien avec ceux de la méthode des moindres carrés :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6477c60b-7f5c-4b4a-a1eb-fb735d6b0a8a",
"metadata": {},
"outputs": [],
"source": [
"# slope and intercept from the method of least squares\n",
"m = 0.015275915608037293\n",
"b = 136.72955927266202\n",
"\n",
"print(\n",
" theta[0].round(4) == round(b, 4),\n",
" theta[1].round(4) == round(m, 4),\n",
" sep=\"\\n\"\n",
")"
]
},
{
"cell_type": "markdown",
"id": "b5304e64-5d0e-4952-bda4-46c2ebcc4204",
"metadata": {},
"source": [
"Graphiquement, aucune surprise, le résultat est cohérent :"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4fd7de2e-e39a-4494-bdd7-2a75603ba040",
"metadata": {},
"outputs": [],
"source": [
"# slope and intercept\n",
"m = theta[1]\n",
"b = theta[0]\n",
"\n",
"# points\n",
"X = coords[:, 0]\n",
"Y = coords[:, 1]\n",
"\n",
"# predictions\n",
"Y_pred = [ float(m * x + b) for x in X ]\n",
"\n",
"# vizualisation\n",
"ax = plt.subplots()\n",
"\n",
"ax = sns.lineplot(x=X, y=Y_pred, color=\"fuchsia\")\n",
"ax = sns.scatterplot(x=X, y=Y, color=\"seagreen\")\n",
"\n",
"ax.set(xlabel=\"Body mass (g)\", ylabel=\"Flipper length (mm)\")\n",
"\n",
"sns.despine()\n",
"\n",
"plt.show()"
]
}
],
"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.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading