<marco />
← Tutti gli articoli
22 min di lettura

Regressione lineare: esercizi con soluzioni

aiprogrammazioneesercizi

Questi esercizi ripassano la serie sulla regressione lineare: la retta e i minimi quadrati, la forma matriciale, la discesa del gradiente e quanto fidarsi dei minimi quadrati. Sono in ordine di difficoltà, e quasi tutti si fanno con carta e penna.

Ogni soluzione è nascosta: aprila solo dopo averci provato davvero. Per farti un'intuizione prima di partire, o per controllare un risultato, c'è anche il lab interattivo sulla regressione lineare: muovi la retta a mano e aggiungi punti per vedere come cambia.

Conti a mano

Un sito misura il tempo di caricamento di quattro pagine di dimensioni diverse:

Dimensione xx (MB) Tempo yy (s)
1 2
2 3
3 5
4 6

Esercizio 1: la retta

Calcola con i minimi quadrati la pendenza mm e l'intercetta qq della retta y^=m⋅x+q\hat{y} = m\cdot x + q. Che significato hanno i due numeri in questo contesto?

Soluzione

Le medie sono xˉ=2,5\bar{x} = 2{,}5 e yˉ=4\bar{y} = 4.

x−xˉx - \bar{x} y−yˉy - \bar{y} prodotto (x−xˉ)2(x - \bar{x})^{2}
−1,5 −2 3 2,25
−0,5 −1 0,5 0,25
0,5 1 0,5 0,25
1,5 2 3 2,25
somma 7 5
m=7/5=1,4q=yˉ−m xˉ=4−1,4⋅2,5=0,5\begin{aligned} m &= 7 / 5 = 1{,}4 \\ q &= \bar y - m\,\bar x = 4 - 1{,}4 \cdot 2{,}5 = 0{,}5 \end{aligned}
  • m=1,4m = 1{,}4 s/MB: ogni megabyte in più costa 1,4 secondi di caricamento, cioè la banda.
  • q=0,5q = 0{,}5 s: il tempo per una pagina di zero byte, cioè la latenza fissa (DNS, connessione, prima risposta del server). A differenza del prezzo delle case, qui l'intercetta ha un significato fisico.

Esercizio 2: quanto è buona?

Per la retta dell'esercizio 1 calcola i residui, l'errore quadratico medio (MSE) e l'R².

Soluzione
xx (MB) yy (s) y^=1,4x+0,5\hat{y} = 1{,}4x + 0{,}5 (s) residuo y−y^y - \hat{y} (s) residuo² (s²)
1 2 1,9 0,1 0,01
2 3 3,3 −0,3 0,09
3 5 4,7 0,3 0,09
4 6 6,1 −0,1 0,01

1. I residui. Per ogni pagina si calcola la previsione della retta e la si sottrae al tempo vero. Per la prima: y^=1,4⋅1+0,5=1,9\hat y = 1{,}4 \cdot 1 + 0{,}5 = 1{,}9 s, quindi il residuo è 2−1,9=0,12 - 1{,}9 = 0{,}1 s. Le altre righe della tabella si ottengono allo stesso modo.

2. La somma dei residui.

0,1−0,3+0,3−0,1=0 s0{,}1 - 0{,}3 + 0{,}3 - 0{,}1 = 0 \ \text{s}

Non è un caso. Nel minimo la derivata dell'MSE rispetto all'intercetta è zero, e quella derivata è proprio la somma degli errori: 2n∑(y^i−yi)=0\frac{2}{n}\sum (\hat y_i - y_i) = 0 (la formula è nel primo articolo). Quindi, quando il modello ha l'intercetta, i residui dei minimi quadrati sommano sempre a zero. Per lo stesso motivo la somma dei residui non serve a misurare quanto è buona una retta: vale zero anche quando la retta è pessima.

3. L'MSE. Si sommano i quadrati dei residui, ultima colonna della tabella, e si divide per il numero di pagine, n=4n = 4:

0,01+0,09+0,09+0,01=0,20 s2MSE=0,20/4=0,05 s2\begin{aligned} 0{,}01 + 0{,}09 + 0{,}09 + 0{,}01 &= 0{,}20 \ \text{s}^2 \\ \text{MSE} = 0{,}20 / 4 &= 0{,}05 \ \text{s}^2 \end{aligned}

L'unità è s² perché i residui, in secondi, sono stati elevati al quadrato. La radice, 0,05≈0,22\sqrt{0{,}05} \approx 0{,}22 s, torna in secondi: la retta sbaglia di circa due decimi di secondo.

4. Il termine di confronto: prevedere sempre la media. Per dire se 0,20 s² è tanto o poco serve un confronto. Il modello più semplice possibile ignora la dimensione della pagina e prevede sempre il tempo medio:

yˉ=(2+3+5+6)/4=4 s\bar y = (2 + 3 + 5 + 6) / 4 = 4 \ \text{s}

I suoi errori sono molto più grandi:

yy (s) residuo y−yˉy - \bar y (s) residuo² (s²)
2 −2 4
3 −1 1
5 +1 1
6 +2 4
somma 10

5. L'R². Confronta l'errore della retta con quello della media, misurati entrambi come somma dei quadrati dei residui:

R2=1−errore della rettaerrore della media=1−0,2010=1−0,02=0,98\begin{aligned} R^2 &= 1 - \frac{\text{errore della retta}}{\text{errore della media}} \\ &= 1 - \frac{0{,}20}{10} = 1 - 0{,}02 = 0{,}98 \end{aligned}

Si legge così: la retta lascia solo il 2% dell'errore che si avrebbe prevedendo sempre la media, cioè spiega il 98% della variabilità dei tempi. Dividendo s² per s² l'unità sparisce: l'R² è un numero puro, e per questo si può confrontare anche tra problemi con unità diverse. Si ottiene lo stesso risultato confrontando gli MSE invece delle somme, perché entrambi vengono divisi per lo stesso nn: 1−0,05/2,5=0,981 - 0{,}05/2{,}5 = 0{,}98.

Esercizio 3: previsioni

Usa la retta per stimare il tempo di caricamento di una pagina da 2,5 MB e di una da 10 MB. Di quale delle due ti fidi di più, e perché?

Soluzione
  • 2,5 MB: 1,4⋅2,5+0,5=41{,}4 \cdot 2{,}5 + 0{,}5 = 4 s. È esattamente yˉ\bar{y}: la retta dei minimi quadrati passa sempre per il punto medio (xˉ,yˉ)(\bar{x}, \bar{y}).
  • 10 MB: 1,4⋅10+0,5=14,51{,}4 \cdot 10 + 0{,}5 = 14{,}5 s.

La prima è un'interpolazione, dentro l'intervallo osservato (1–4 MB). La seconda è un'estrapolazione, oltre il doppio del valore più grande mai visto. Nulla garantisce che la relazione resti lineare: con pagine grandi potrebbero entrare in gioco compressione, cache o limiti di banda diversi. In più, l'incertezza della stima cresce allontanandosi da xˉ\bar{x}.

Forma matriciale

Esercizio 4: le equazioni normali a mano

Scrivi la matrice XX e il vettore YY per i dati dell'esercizio 1, calcola X⊤XX^{\top}X e X⊤YX^{\top}Y, e risolvi le equazioni normali X⊤Xθ=X⊤YX^{\top}X \theta = X^{\top}Y. Devi ritrovare i risultati dell'esercizio 1.

SoluzioneX=[11121314]Y=[2356]X = \begin{bmatrix} 1 & 1 \\ 1 & 2 \\ 1 & 3 \\ 1 & 4 \end{bmatrix} \qquad Y = \begin{bmatrix} 2 \\ 3 \\ 5 \\ 6 \end{bmatrix} X⊤X=[N∑x∑x∑x2]=[4101030]X^\top X = \begin{bmatrix} N & \sum x \\ \sum x & \sum x^2 \end{bmatrix} = \begin{bmatrix} 4 & 10 \\ 10 & 30 \end{bmatrix} X⊤Y=[∑y∑xy]=[1647]X^\top Y = \begin{bmatrix} \sum y \\ \sum xy \end{bmatrix} = \begin{bmatrix} 16 \\ 47 \end{bmatrix}

Per una 2×2 l'inversa si scrive direttamente: scambi la diagonale, cambi segno al resto, dividi per il determinante.

det⁡(X⊤X)=4⋅30−10⋅10=20\det(X^\top X) = 4 \cdot 30 - 10 \cdot 10 = 20 (X⊤X)−1=120[30−10−104](X^\top X)^{-1} = \frac{1}{20} \begin{bmatrix} 30 & -10 \\ -10 & 4 \end{bmatrix} θ^=120[30⋅16−10⋅47−10⋅16+4⋅47]=120[1028]=[0,51,4]\begin{aligned} \hat\theta &= \frac{1}{20} \begin{bmatrix} 30 \cdot 16 - 10 \cdot 47 \\ -10 \cdot 16 + 4 \cdot 47 \end{bmatrix} \\[6pt] &= \frac{1}{20} \begin{bmatrix} 10 \\ 28 \end{bmatrix} = \begin{bmatrix} 0{,}5 \\ 1{,}4 \end{bmatrix} \end{aligned}

θ0=q=0,5\theta _0 = q = 0{,}5 e θ1=m=1,4\theta _1 = m = 1{,}4, come prima.

Esercizio 5: invertibile o no?

Per ciascuna matrice dei regressori, X⊤XX^{\top}X è invertibile? Se no, perché?

  1. Colonne: 11, superficie in m², superficie in piedi quadrati.
  2. Colonne: 11, xx, x2x^{2}, con x=1,2,3,4x = 1, 2, 3, 4.
  3. Colonne: 11, "è al piano terra" (1 o 0), "non è al piano terra" (1 o 0).
  4. Colonne: 11, superficie, età, con solo 2 appartamenti.
Soluzione
  1. No. La terza colonna è la seconda moltiplicata per 10,764: colonne linearmente dipendenti.
  2. Sì. x2x^{2} non è una combinazione lineare di 11 e xx: le tre colonne sono indipendenti.
  3. No. Le due colonne sommate danno sempre 1, cioè la colonna dell'intercetta. È la classica trappola delle variabili dummy: con l'intercetta, per una variabile a kk categorie si usano k−1k - 1 colonne.
  4. No. N=2<d=3N = 2 < d = 3: X⊤XX^{\top}X è 3×3 ma ha rango al massimo 2. Un piano per due punti si può far passare in infiniti modi.

Esercizio 6: lineare o no?

Quali di questi modelli si possono stimare con la regressione lineare, cioè con le equazioni normali?

  1. y=θ0+θ1⋅x+θ2⋅x2y = \theta _0 + \theta _1\cdot x + \theta _2\cdot x^{2}
  2. y=θ0+θ1log⁡(x)y = \theta_0 + \theta_1 \log(x)
  3. y=θ0 eθ1xy = \theta_0 \, e^{\theta_1 x}
  4. y=θ0+θ1⋅x1+θ2⋅x1⋅x2y = \theta _0 + \theta _1\cdot x_1 + \theta _2\cdot x_1\cdot x_2
  5. y=θ0+x/θ1y = \theta _0 + x / \theta _1
Soluzione

"Lineare" si riferisce ai parametri, non alle variabili. Conta solo che yy sia una somma di θj\theta _j moltiplicati per qualcosa di noto.

  1. Sì. Regressori 1,x,x21, x, x^{2}. È una parabola, ma lineare in θ\theta.
  2. Sì. Il regressore è log⁡(x)\log(x), calcolabile dai dati.
  3. Non così com'è, perché θ1\theta _1 sta in un esponente. Ma prendendo il logaritmo: log⁡y=log⁡θ0+θ1x\log y = \log \theta_0 + \theta_1 x diventa lineare nei parametri log⁡θ0\log \theta_0 e θ1\theta _1. Attenzione: minimizzare l'errore su log⁡y\log y non è la stessa cosa che minimizzarlo su yy.
  4. Sì. x1⋅x2x_1\cdot x_2 è un regressore come un altro, un'interazione.
  5. Non direttamente, perché θ1\theta _1 è al denominatore. Si può stimare β=1/θ1\beta = 1/\theta _1 con il regressore xx, e poi ricavare θ1=1/β\theta _1 = 1/\beta.

Discesa del gradiente

Esercizio 7: due passi a mano

Modello senza intercetta y=θ⋅xy = \theta \cdot x, dati (1,2)(1, 2) e (2,3)(2, 3), funzione di costo J(θ)=1N∑(y−θx)2J(\theta ) = \tfrac{1}{N} \sum (y - \theta x)^{2}.

  1. Trova il valore ottimo θ∗\theta^* annullando la derivata.
  2. Partendo da θ=0\theta = 0 con α=0,1\alpha = 0{,}1, fai tre passi di discesa del gradiente.
  3. Cosa succede con α=0,5\alpha = 0{,}5? Qual è il learning rate massimo per cui converge?
Soluzione

La derivata è

dJdθ=−2N∑ixi (yi−θxi)\frac{dJ}{d\theta} = -\frac{2}{N} \sum_{i} x_i \, (y_i - \theta x_i)

1. Ponendola a zero: ∑xy−θ⋅∑x2=0\sum xy - \theta \cdot \sum x^{2} = 0, cioè θ∗=∑xy/∑x2=8/5=1,6\theta^* = \sum xy / \sum x^2 = 8/5 = 1{,}6.

2. Con N=2N = 2:

Passo θ\theta residui y−θxy - \theta x ∑x⋅residuo\sum x \cdot \text{residuo} dJ/dθdJ/d\theta nuovo θ\theta
1 0 2; 3 8 −8 0,8
2 0,8 1,2; 1,4 4 −4 1,2
3 1,2 0,8; 0,6 2 −2 1,4

La distanza da θ∗=1,6\theta^* = 1{,}6 si dimezza a ogni passo: 1,6 → 0,8 → 0,4 → 0,2.

3. Sviluppando, l'errore si moltiplica a ogni passo per 1−α⋅2⋅∑x2/N=1−5α1 - \alpha \cdot 2\cdot \sum x^{2}/N = 1 - 5\alpha. Con α=0,1\alpha = 0{,}1 il fattore è 0,5, da cui il dimezzamento. Con α=0,5\alpha = 0{,}5 è −1,5-1{,}5: l'errore cambia segno e cresce del 50% a ogni passo, e θ\theta vale 0 → 4 → −2 → 7. Diverge.

Converge se ∣1−5α∣<1|1 - 5\alpha | < 1, cioè 0<α<0,40 < \alpha < 0{,}4. Il valore più veloce è α=0,2\alpha = 0{,}2, che dà fattore zero e arriva a θ∗\theta^* in un passo solo. Funziona solo perché il problema ha un parametro: con più parametri le direzioni hanno pendenze diverse e nessun α\alpha va bene per tutte, ed è il motivo per cui si normalizza.

Esercizio 8: normalizzare un dato nuovo

Un modello è stato addestrato su una feature con valori 2,4,4,4,5,5,7,92, 4, 4, 4, 5, 5, 7, 9, standardizzata. In spazio normalizzato i parametri stimati sono θ0=10\theta _0 = 10, θ1=3\theta _1 = 3.

  1. Calcola media e deviazione standard dei dati di addestramento.
  2. Prevedi yy per un nuovo dato con x=9x = 9.
  3. Un collega normalizza il nuovo dato usando media e deviazione standard del solo nuovo dato. Cosa ottiene?
  4. Riscrivi il modello nelle unità originali, come y=m⋅x+qy = m\cdot x + q.
Soluzione

1. μ=40/8=5\mu = 40 / 8 = 5. Gli scarti al quadrato sono 9,1,1,1,0,0,4,169, 1, 1, 1, 0, 0, 4, 16, con somma 32: σ=32/8=2\sigma = \sqrt{32/8} = 2.

2. z=(9−5)/2=2z = (9 - 5) / 2 = 2, quindi y^=10+3⋅2=16\hat{y} = 10 + 3\cdot 2 = 16.

3. Con un solo dato la media è 9 e la deviazione standard è 0: z=0/0z = 0/0, che dà NaN. Anche con più dati nuovi il risultato sarebbe sbagliato, perché lo "zero" e l'"uno" della scala non sarebbero più quelli imparati dal modello. Media e deviazione standard fanno parte del modello: si usano sempre quelle di addestramento.

4. y^=θ0+θ1⋅(x−μ)/σ\hat{y} = \theta _0 + \theta _1\cdot (x - \mu )/\sigma, quindi:

m=θ1/σ=3/2=1,5q=θ0−m μ=10−1,5⋅5=2,5\begin{aligned} m &= \theta_1 / \sigma = 3 / 2 = 1{,}5 \\ q &= \theta_0 - m\,\mu = 10 - 1{,}5 \cdot 5 = 2{,}5 \end{aligned}

Controllo: 1,5⋅9+2,5=161{,}5 \cdot 9 + 2{,}5 = 16. Nota anche che θ0=10\theta _0 = 10 è la media delle yy: con le feature centrate, l'intercetta è il valore previsto per il dato medio.

Proprietà dello stimatore

Esercizio 9: correttezza (e quando salta)

  1. Supponi Y=Xθ0+EY = X\theta _0 + E, con XX nota e E[ε(i)]=0\mathbb{E}[\varepsilon (i)] = 0. Dimostra che E[θ^]=θ0\mathbb{E}[\hat{\theta}] = \theta _0.
  2. Ora supponi che il rumore abbia media c≠0c \ne 0, per esempio un sensore starato che misura sempre 0,3 in più. Il modello ha l'intercetta. Quali parametri restano corretti?
Soluzione

1.

θ^=(X⊤X)−1X⊤Y=(X⊤X)−1X⊤(Xθ0+E)=θ0+(X⊤X)−1X⊤EE[θ^]=θ0+(X⊤X)−1X⊤ E[E]=θ0+0=θ0\begin{aligned} \hat\theta &= (X^\top X)^{-1} X^\top Y \\ &= (X^\top X)^{-1} X^\top (X\theta_0 + E) \\ &= \theta_0 + (X^\top X)^{-1} X^\top E \\[8pt] \mathbb{E}[\hat\theta] &= \theta_0 + (X^\top X)^{-1} X^\top \, \mathbb{E}[E] \\ &= \theta_0 + 0 = \theta_0 \end{aligned}

XX non è casuale, quindi esce dal valore atteso.

2. Ora E[E]=c 1\mathbb{E}[E] = c\,\mathbf{1}, dove 1\mathbf{1} è il vettore di uni, che è proprio la prima colonna di XX. Quindi 1=Xe1\mathbf{1} = X e_1, con e1=[1,0,…,0]⊤e_1 = [1, 0, \dots , 0]^{\top}:

E[θ^]=θ0+(X⊤X)−1X⊤X e1 c=θ0+c e1\begin{aligned} \mathbb{E}[\hat\theta] &= \theta_0 + (X^\top X)^{-1} X^\top X \, e_1 \, c \\ &= \theta_0 + c\, e_1 \end{aligned}

Solo l'intercetta è distorta, di esattamente cc; le pendenze restano corrette. L'intercetta "assorbe" l'errore costante. Senza intercetta nel modello, invece, la distorsione finirebbe nelle pendenze.

Esercizio 10: cosa cambia l'incertezza?

Su 10 appartamenti, l'errore standard del prezzo al m² è 0,068 k€/m². Con un solo regressore vale Var⁡(m^)=λ2/∑(x−xˉ)2\operatorname{Var}(\hat m) = \lambda^2 / \sum (x - \bar x)^2. Stima l'errore standard se:

  1. raccogli 40 appartamenti, con superfici distribuite come prima;
  2. il rumore sui prezzi ha deviazione standard doppia;
  3. raccogli sempre 10 appartamenti, ma con superfici in un intervallo largo la metà.
Soluzione

L'errore standard è la radice: λ/∑(x−xˉ)2\lambda \big/ \sqrt{\textstyle\sum (x - \bar x)^2}.

  1. Con 4 volte i dati, ∑(x−xˉ)2\sum (x - \bar{x})^{2} quadruplica: errore standard diviso per 4=2\sqrt{4} = 2, circa 0,034 k€/m².
  2. λ\lambda raddoppia: errore standard doppio, circa 0,136 k€/m².
  3. Ogni scarto x−xˉx - \bar{x} si dimezza, quindi ogni quadrato diventa un quarto: errore standard doppio, circa 0,136 k€/m².

Restringere l'intervallo delle superfici fa male quanto raddoppiare il rumore, e per compensarlo servirebbero 4 volte i dati.

Esercizio 11: vero o falso?

  1. Se R² = 0,99, allora xx causa yy.
  2. Aggiungere un regressore, anche inutile, non può far aumentare l'MSE sui dati usati per la stima.
  3. Minimizzando la somma dei valori assoluti invece dei quadrati si ottiene la stessa retta.
  4. Un outlier con una xx lontana dalla media sposta la retta più di uno con la stessa distanza verticale ma xx vicina alla media.
  5. La discesa del gradiente su una regressione lineare può bloccarsi in un minimo locale.
  6. Normalizzare le feature cambia le previsioni del modello.
Soluzione
  1. Falso. R² misura quanto bene una retta riassume i dati, non il perché. Un terzo fattore può guidare entrambe le grandezze.
  2. Vero. Il nuovo modello può sempre mettere a zero il parametro in più e ritrovare il vecchio: il suo minimo non può essere più alto. Per questo un MSE più basso sui dati di stima non prova che il regressore serva, e va controllato su dati nuovi.
  3. Falso. Con il valore assoluto gli errori grandi pesano meno: la retta è più robusta agli outlier (è l'analogo della mediana rispetto alla media), ma non ha una formula chiusa.
  4. Vero. Un punto lontano da xˉ\bar{x} fa da leva sulla pendenza. Provalo nel lab: l'attico a 100 m² porta la pendenza da 2,06 a 4,02. Lo stesso sovrapprezzo su un appartamento da 78 m², proprio sulla media, lascia la pendenza a 2,06 e alza solo la retta.
  5. Falso. La funzione di costo è convessa: un solo minimo, globale. Con un learning rate adatto si arriva sempre lì.
  6. Falso, se fatto bene: cambiano i parametri, non le previsioni. Riportando i parametri nelle unità originali si ottiene la stessa retta (esercizio 8). Cambia solo la velocità della discesa del gradiente.

Al computer

Esercizio 12: tre modi, un risultato

Genera 50 punti con questo codice:

python
import numpy as np

rng = np.random.default_rng(42)
x = rng.uniform(0, 100, 50)
y = 3 + 0.5 * x + rng.normal(0, 4, 50)

Poi stima la retta in tre modi e verifica che diano lo stesso risultato:

  1. con le equazioni normali;
  2. con la discesa del gradiente su xx standardizzata, riportando poi i parametri nelle unità originali;
  3. con np.polyfit(x, y, 1).

Domanda bonus: il modello "vero" ha intercetta 3, perché la stima è lontana da 3 mentre la pendenza è vicinissima a 0,5?

Soluzione
python
# 1. equazioni normali
X = np.column_stack([np.ones(len(x)), x])
theta = np.linalg.solve(X.T @ X, X.T @ y)
print("equazioni normali:", theta.round(3))

# 2. discesa del gradiente con x standardizzata
mu, sigma = x.mean(), x.std()
Z = np.column_stack([np.ones(len(x)), (x - mu) / sigma])
t = np.zeros(2)
for k in range(1000):
    t = t + 0.1 * 2 / len(x) * Z.T @ (y - Z @ t)
m = t[1] / sigma
q = t[0] - m * mu
print("discesa del gradiente:", np.round([q, m], 3))

# 3. controprova con polyfit (restituisce prima la pendenza)
print("polyfit:", np.polyfit(x, y, 1).round(3))
Codice
equazioni normali: [2.075 0.505]
discesa del gradiente: [2.075 0.505]
polyfit: [0.505 2.075]

Bonus. È l'esercizio 10 in azione. L'intercetta è il valore della retta in x=0x = 0, al bordo dei dati, dove l'incertezza è massima. La pendenza invece è "fissata" da punti sparsi su tutto l'intervallo 0–100. L'errore standard dell'intercetta qui è circa 0,95, contro 0,016 della pendenza: 2,075 dista da 3 meno di un errore standard. Nessuna anomalia, solo rumore.