Calcolare la regressione lineare o polinomiale dei dati in Python
Questo programma calcola una regressione lineare o polinomiale su alcuni dati forniti e visualizza il risultato tramite un grafico.
Utilizza due moduli esterni del linguaggio Python:
- numpy viene utilizzato per le operazioni matematiche e per calcolare i coefficienti del polinomio.
- matplotlib è usato per creare e visualizzare il grafico.
Pertanto, uno dei primi passi è importare queste librerie nel programma
import numpy as np
import matplotlib.pyplot as plt
Per prima cosa definisco due array `x` e `y` che rappresentano i dati osservati (5 coppie di valori).
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])
Poi calcolo la regressione polinomiale tramite il metodo polyfit(x,y,n) dove n è il grado del polinomio della funzione di regressione.
In questo caso opto per un polinomio di terzo grado.
coefficients = np.polyfit(x, y, 3)
La funzione np.polyfit(x, y, 3) calcola i coefficienti di un polinomio di terzo grado (quattro coefficienti) che meglio approssima i dati nei punti \(x\) e \(y\).
In questo caso i coefficienti sono i seguenti:
print(coefficients)
array([ 0.16666667, -1.57142857, 5.26190476, -2. ])
Una volta generati i coefficienti, li utilizzo per definire una funzione polinomiale usando il metodo poly1d()
polynomial = np.poly1d(coefficients)
Poi genero i valori previsti dalla curva polinomiale per gli stessi valori \(x\).
y_pred_poly = polynomial(x)
Infine, visualizzo un grafico che mostra i punti dei dati osservati come scatter plot (punti blu) e la curva del polinomio di terzo grado in verde.
plt.figure(figsize=(8, 6))
plt.scatter(x, y, color='blue', label='Dati osservati') # Punti osservati
plt.plot(np.linspace(min(x), max(x), 100), polynomial(np.linspace(min(x), max(x), 100)), color='green', label='Curva polinomiale di terzo grado')
plt.title("Regressione polinomiale di terzo grado", fontsize=14)
plt.xlabel("x", fontsize=12)
plt.ylabel("y", fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
Questa sequenza mi permette di visualizzare il grafico della curva che approssima i punti.
Il risultato è un grafico che illustra come il polinomio di terzo grado si adatta ai dati.
E per ottenere una regressione lineare?
Basta modificare il grado del polinomio che approssima i dati.
coefficients = np.polyfit(x, y, 1)
In questo caso la funzione np.polyfit(x, y, 1) calcola i coefficienti di un polinomio di primo grado (due coefficienti) che approssima i dati nei punti \(x\) e \(y\) con una retta di regressione.
E ovviamento man mano che aumento il grado della regressione il grafico approssima meglio i punti
Ad esempio, se imposto un polinomio di grado 6
coefficients = np.polyfit(x, y, 6)
La curva della regressione passa esattamente per i punti osservati.
E così via.