{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# La più semplice rete neurale, per trovare la retta che meglio modella un insieme di punti $(x,y)$\n",
"Luca Mari, aggiornamento maggio 2024 \n",
"\n",
"Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale. \n",
"\n",
"\n",
"[i file di questa attività: [linear.ipynb](linear.ipynb), [linearutils.py](linearutils.py)]\n",
"\n",
"**Obiettivi**: comprendere il funzionamento di base di una (molto) semplice rete neurale, per come specificato in Python mediante un modulo di alto livello come `PyTorch`, e poi anche comprendendo come la rete è addestrata e poi funziona \"a basso livello\". \n",
"**Precompetenze**: basi di Python; almeno qualche idea di analisi matematica.\n",
"\n",
"> Per eseguire questo notebook, supponiamo con VSCode, occorre:\n",
"> * installare un interprete Python\n",
"> * scaricare da https://code.visualstudio.com/download e installare VSCode\n",
"> * eseguire VSCode e attivare le estensioni per Python e Jupyter\n",
"> * ancora in VSCode:\n",
"> * creare una cartella di lavoro e renderla la cartella corrente\n",
"> * copiare nella cartella questo notebook e il file `linearutils.py` e aprire il notebook\n",
"> * creare un ambiente virtuale locale Python (Select Kernel | Python Environments | Create Python Environment | Venv, e scegliere un interprete Python):\n",
"> * installare i moduli Python richiesti, eseguendo dal terminale: \n",
"> `pip install torch matplotlib ipympl`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Supponiamo di disporre di un insieme di dati $(x_i, y_i)$, e da questo di voler costruire una funzione $f$ in grado di prevedere un $y$ per ogni $x$ dato, dunque tale che $y = f(x)$. Per ogni $x_i$, indicheremo dunque con $y_i$ il dato nel training set e con $\\hat y_i$ il valore previsto dal modello.\n",
"\n",
"Ipotizziamo che il modello $f$ da costruire sia una funzione lineare, dunque geometricamente una retta $y = k_0 + k_1 x$, così che il modello è una funzione $y = f_{k_0, k_1}(x)$ a due parametri, $k_0$ e $k_1$, di cui occorre stimare i valori: si tratta di un problema noto in statistica come *regressione lineare*.\n",
"\n",
"Il problema è così semplice che, come è noto, potrebbe essere risolto per via analitica, con il metodo dei minimi quadrati, dunque assumendo che la retta migliore sia quella che minimizza la sua distanza euclidea con i dati $(x_i, y_i)$. Noi risolveremo però il problema per via numerica, costruendo una semplice rete neurale, da addestrare mediante i dati $(x_i, y_i)$, considerati come il *training set*.\n",
"\n",
"Importiamo prima di tutto i moduli Python necessari."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib widget\n",
"from linearutils import get_params, plot, polyfit, train\n",
"import torch\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.animation import FuncAnimation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Costruiamo sinteticamente il training set, che supponiamo generato dalla sovrapposizione di valori disposti su una retta e di valori casuali estratti da una distribuzione normale standard, dunque a media 0 e deviazione standard 1, e quindi rappresentiamolo graficamente."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a888f7d81d6f4a8aad371f03caee64d2",
"version_major": 2,
"version_minor": 0
},
"image/png": "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Fbfuq2DHXblypQoLC9W3b1/NnDlTaWlpmjt3ri699FL94x//UL9+/eLy2ZL0zTffaOjQobrqqqt0zTXX6NVXX9Vdd92ls846S4WFhWHf/49//EOvv/66Jk+eLEkqKirSFVdcoTvvvFNPP/20Jk2apG+++UYPPvigbrrpJq1cudL/3nnz5mnChAk699xzVVRUpH379unxxx/Xhx9+qI0bN/qHRrz77rsaNWqU8vLyVFRUpPLyck2YMCEgqPG55ZZb/Mf97//+b23dulVPPvmkNm7cqA8//DCqjFWk91cw3333nQYNGqQdO3bov//7v5Wbm6sXX3wx4PwbYvPmzbr22mt16623aty4cZo7d65Gjx6tpUuXasiQIQH7Tpo0SW3bttV9992nyspKSdKLL76ocePGqaCgQLNnz9a3336rOXPmaODAgdq4caO6dOmia665RnfeeadeeeUV/x+qPq+88oouu+wynXzyyUHbt2zZMo0ZM0aDBg3S7NmzJUlffPGFPvzwQ/9/t8FEei9Ix/9NKigoUP/+/fXwww9r+fLl+t3vfqdu3brptttu8+8Xz3sBNmAAUZg7d64hyfjkk09C7uN2u42zzz7b//zbb7+ts8/LL79sSDI++OAD/7aHHnrIkGRs3bq1zv6dO3c2xo0bV2/bFi9ebEgyHnzwQf+277//3rjgggsMScbcuXOjblMwzz//vCHJeOSRR+q8VlNTYxiGYbz33nuGJOO9994LeH3r1q112jJz5kwj3H+K33//vdG1a1ejc+fOxjfffBP0Mw3DMPLz843s7GyjvLzcv+3//b//Z6SlpRljx471b3O73cbkyZPr/cxhw4YZnTt3rrPdd26nnHJKnesY6lx8982J3+1FF11kXHTRRWGPW1NTY5x22mlGQUFBwLl+++23RteuXY0hQ4bUex7BPvvEzzvxO7rooosMScaf//xn/7aqqirD4/EYo0aNqvdzDMMwJBnp6ekBn/Xss88akgyPx2NUVFT4t8+YMSOgXUePHjWys7ONnj17Gt99951/vzfffNOQZNx3333+bfn5+UZOTo5x8OBB/7Z3333XkBTwnf3jH/8wJBl/+ctfAtq5dOnSOttrfx/B7tVI769gHnvsMUOS8corr/i3VVZWGqeeemqd72HcuHFB773aOnfubEgy/vrXv/q3eb1eIycnJ+DfIN89MHDg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ohHPewH2QAYQDfLOO+/oyy+/1Pfff699+/Zp5cqVWrZsmTp37qzXX3/dP3A5KytLF154oR588EEdO3ZM7du317vvvqutW7fWOWbfvn0lSb/4xS903XXXqXHjxho+fHjExVqHDx+u888/X3fffbe2bdvmrwdWO4iJpk3BjB07Vn/+8581ffp0rVu3ThdccIEqKyu1fPlyTZo0SSNGjJDb7dbo0aP1xBNPyOVyqVu3bnrzzTcbPM4mLS1Nc+bM0fDhw5Wfn68JEyYoJydHX375pT777DP9/e9/l3S8m7SwsFADBgzQzTff7C/T4Xa7NWvWLEnHawB26NBBV199tXr37q0WLVpo+fLl+uSTT/S73/3O/5l9+/bVwoULNX36dJ177rlq0aJF2GzHZZddpk6dOunmm2/WHXfcoUaNGun5559X27ZttWPHjgaf+x//+EcVFhaqR48emjBhgtq3b6/du3frvffeU1ZWlt54442Q7+/Ro4fOO+88zZgxQwcOHFCrVq20YMECff/99w1qT6I0btxYs2fP1oQJE3TRRRdpzJgx/tIfXbp00c9//nP/vkVFRRo2bJgGDhyom266SQcOHNATTzyhHj16BATJF110kW655RYVFRWpuLhYl112mRo3bqzNmzdr0aJFevzxxwMmZYQTyf0VysSJE/Xkk09q7NixWr9+vXJycvTiiy+qWbNmUV+rE51++um6+eab9cknn6hdu3Z6/vnntW/fPs2dOzfse7OysjRnzhzdeOON6tOnj6677jr/vfrWW2/p/PPPD/hDLzs7W5dccokeeeQRHTp0SNdee23Yz/jJT36iAwcO6NJLL1WHDh20fft2PfHEE8rPz9eZZ54Z9D3R3AuRive9ABtI2fxjWJKvnILv0aRJE8Pj8RhDhgwxHn/88YAyFz67du0yrrzySqNly5aG2+02Ro8ebezZs8eQZMycOTNg3wceeMBo3769kZaWFlAiI5IyMIZhGOXl5caNN95oZGVlGW6327jxxhuNjRs31ilnEU2bgvn222+NX/ziF0bXrl2Nxo0bGx6Px7j66quN0tJS/z5ff/21MWrUKKNZs2bGySefbNxyyy1GSUlJg8rA+KxevdoYMmSIkZmZaTRv3tzo1auX8cQTTwTss3z5cuP88883mjZtamRlZRnDhw83Pv/8c//rVVVVxh133GH07t3bf5ze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",
"text/html": [
"\n",
"