NumPy è una potente libreria di calcolo numerico per Python, utilizzata in molte situazioni di analisi dei dati e calcoli scientifici. In particolare, l’interpolazione, che consente di colmare i gap nei dati, è una tecnica fondamentale nell’analisi dei dati. In questo articolo, esploreremo in dettaglio l’interpolazione con NumPy, partendo dalle nozioni di base fino alle applicazioni avanzate. Forniremo una guida pratica adatta a principianti e utenti avanzati.
Concetto di base dell’interpolazione
L’interpolazione è una tecnica per stimare i valori sconosciuti basandosi su punti di dati noti. Viene utilizzata per completare i dati mancanti o per aumentare la risoluzione dei dati. I metodi più semplici di interpolazione includono l’interpolazione lineare, spline e polinomiale. Comprendere questi metodi consente di migliorare la qualità dei dati e di ottenere analisi più precise.
Funzioni di interpolazione in NumPy
NumPy offre diverse funzioni potenti per eseguire l’interpolazione. Utilizzando queste funzioni, è possibile eseguire interpolazioni efficienti su vari formati di dati.
numpy.interp
Questa funzione di base esegue l’interpolazione lineare su dati unidimensionali. Il suo utilizzo è semplice: basta specificare i punti di dati noti e i punti da interpolare per ottenere i valori interpolati.
import numpy as np
x = [0, 1, 2]
y = [0, 1, 4]
x_new = [0.5, 1.5]
y_new = np.interp(x_new, x, y)
print(y_new) # Output: [0.5, 2.5]
scipy.interpolate
Poiché NumPy ha funzioni di interpolazione limitate, è consigliabile utilizzare anche il modulo interpolate
di SciPy. Questo permette di utilizzare metodi di interpolazione più complessi, come quelli non lineari e multidimensionali.
scipy.interpolate.interp1d
Questa funzione genera un’interpolazione per dati unidimensionali. È possibile scegliere tra diversi metodi di interpolazione, tra cui quello lineare e quello spline.
from scipy.interpolate import interp1d
x = [0, 1, 2]
y = [0, 1, 4]
f = interp1d(x, y, kind='quadratic')
x_new = np.linspace(0, 2, 10)
y_new = f(x_new)
print(y_new)
L’uso di queste funzioni amplia notevolmente le possibilità di interpolazione con NumPy.
Interpolazione su dati unidimensionali
L’interpolazione unidimensionale è il metodo di base per stimare nuovi punti di dati tra punti di dati noti. È facilmente realizzabile con NumPy e SciPy.
Interpolazione lineare
Il metodo più semplice di interpolazione è quello lineare. Questo metodo unisce i punti di dati noti con linee rette e stima i punti lungo queste linee. Può essere eseguito con la funzione interp
di NumPy.
import numpy as np
x = [0, 1, 2]
y = [0, 1, 4]
x_new = [0.5, 1.5]
y_new = np.interp(x_new, x, y)
print(y_new) # Output: [0.5, 2.5]
Interpolazione non lineare
L’interpolazione non lineare utilizza metodi diversi dalla semplice linea retta per stimare i valori tra i punti di dati. Con la funzione interp1d
di SciPy, è possibile eseguire interpolazioni quadratiche o spline.
from scipy.interpolate import interp1d
x = [0, 1, 2]
y = [0, 1, 4]
f_quadratic = interp1d(x, y, kind='quadratic')
x_new = np.linspace(0, 2, 10)
y_new_quadratic = f_quadratic(x_new)
print(y_new_quadratic)
Esempio di interpolazione quadratica
L’interpolazione quadratica utilizza una funzione quadratica (parabola) per collegare i punti di dati noti, ottenendo così un risultato più liscio.
import matplotlib.pyplot as plt
x = [0, 1, 2]
y = [0, 1, 4]
f_quadratic = interp1d(x, y, kind='quadratic')
x_new = np.linspace(0, 2, 10)
y_new_quadratic = f_quadratic(x_new)
plt.plot(x, y, 'o', label='Dati originali')
plt.plot(x_new, y_new_quadratic, '-', label='Interpolazione quadratica')
plt.legend()
plt.show()
L’interpolazione su dati unidimensionali è uno strumento potente per colmare i gap nei dati. Imparando a utilizzare l’interpolazione lineare e non lineare, è possibile migliorare la precisione dell’analisi dei dati.
Interpolazione su dati bidimensionali
L’interpolazione su dati bidimensionali è importante in vari campi, come l’elaborazione delle immagini e i sistemi di informazione geografica. In questo paragrafo esploreremo come eseguire l’interpolazione su dati bidimensionali utilizzando NumPy e SciPy.
Interpolazione lineare
L’interpolazione lineare su dati bidimensionali può essere eseguita utilizzando la funzione interp2d
di SciPy, che stima i nuovi punti in un piano bidimensionale a partire da dati noti.
import numpy as np
from scipy.interpolate import interp2d
import matplotlib.pyplot as plt
# Punti di dati noti
x = [0, 1, 2]
y = [0, 1, 2]
z = [[0, 1, 4], [1, 2, 5], [4, 5, 8]]
# Creazione della funzione di interpolazione
f = interp2d(x, y, z, kind='linear')
# Nuovi punti di dati
x_new = np.linspace(0, 2, 10)
y_new = np.linspace(0, 2, 10)
z_new = f(x_new, y_new)
# Plot
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolazione lineare')
plt.show()
Interpolazione spline
L’interpolazione spline fornisce risultati più lisci. Può essere eseguita utilizzando la classe RectBivariateSpline
di SciPy.
from scipy.interpolate import RectBivariateSpline
# Punti di dati noti
x = [0, 1, 2]
y = [0, 1, 2]
z = [[0, 1, 4], [1, 2, 5], [4, 5, 8]]
# Creazione della funzione di interpolazione spline
spline = RectBivariateSpline(x, y, z)
# Nuovi punti di dati
x_new = np.linspace(0, 2, 10)
y_new = np.linspace(0, 2, 10)
z_new = spline(x_new, y_new)
# Plot
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolazione spline')
plt.show()
Vantaggi dell’interpolazione spline
L’interpolazione spline viene utilizzata per mantenere la continuità e la liscezza dei dati, risultando particolarmente utile per dati che non presentano rapidi cambiamenti.
Comprendere l’interpolazione su dati bidimensionali e scegliere il metodo adeguato permette di migliorare la precisione e l’affidabilità delle analisi dei dati.
Esempi pratici: Completamento dei dati mancanti
In analisi dei dati, i dati mancanti sono un problema comune. Utilizzare l’interpolazione per completare questi dati migliora la precisione dell’analisi.
Esempio di dati mancanti
Nel seguente esempio, un set di dati contiene valori mancanti (NaN). Questi valori vengono completati utilizzando l’interpolazione.
import numpy as np
import pandas as pd
from scipy.interpolate import interp1d
# Esempio di set di dati con valori mancanti
data = {'x': [0, 1, 2, 3, 4, 5], 'y': [0, np.nan, 4, np.nan, 16, 25]}
df = pd.DataFrame(data)
print("Set di dati con valori mancanti:\n", df)
Interpolazione dei dati unidimensionali
Per completare i valori mancanti nei dati unidimensionali, prima rimuoviamo i valori mancanti e creiamo una funzione di interpolazione sui dati rimanenti. Successivamente, utilizziamo questa funzione per completare i valori mancanti.
# Dati senza valori mancanti
x = df['x'][df['y'].notna()]
y = df['y'][df['y'].notna()]
# Creazione della funzione di interpolazione (lineare)
f = interp1d(x, y, kind='linear', fill_value="extrapolate")
# Completamento dei valori mancanti
df['y'] = df['y'].combine_first(pd.Series(f(df['x'])))
print("Set di dati completato:\n", df)
Interpolazione dei dati bidimensionali
Per completare i valori mancanti nei dati bidimensionali, come nel caso di dati di immagini, sono necessari metodi più avanzati. In questo esempio, utilizziamo la funzione griddata
per completare i dati bidimensionali.
from scipy.interpolate import griddata
# Esempio di dati bidimensionali
x = np.arange(0, 5)
y = np.arange(0, 5)
z = np.array([[0, 1, 2, np.nan, 4],
[1, np.nan, 4, 9, 16],
[4, 9, np.nan, 25, 36],
[np.nan, 16, 25, 36, 49],
[16, 25, 36, 49, 64]])
# Dati senza valori mancanti
points = np.array([(i, j) for i in range(5) for j in range(5) if not np.isnan(z[i, j])])
values = np.array([z[i, j] for i in range(5) for j in range(5) if not np.isnan(z[i, j])])
# Completamento dei dati
grid_x, grid_y = np.mgrid[0:4:5j, 0:4:5j]
z_new = griddata(points, values, (grid_x, grid_y), method='cubic')
# Plot
plt.imshow(z_new, extent=(0, 4, 0, 4), origin='lower', cmap='viridis')
plt.colorbar()
plt.title('Interpolazione cubica dei dati mancanti')
plt.show()
Importanza del completamento dei dati mancanti
Completare correttamente i dati mancanti migliora significativamente i risultati dell’analisi dei dati. L’interpolazione è un potente strumento per colmare i gap nei dati preservando la continuità dei dati.
Metodo di interpolazione spline
L’interpolazione spline è una tecnica avanzata per mantenere la liscezza dei dati durante l’interpolazione. È particolarmente utile quando i dati non presentano rapidi cambiamenti. In questo paragrafo, esploreremo come implementare l’interpolazione spline utilizzando NumPy e SciPy.
Concetti base dell’interpolazione spline
L’interpolazione spline utilizza polinomi per interpolare tra i punti di dati, creando curve continue e lisce. La forma più comune di interpolazione spline è quella cubica.
Interpolazione spline su dati unidimensionali
Per eseguire l’interpolazione spline su dati unidimensionali, possiamo utilizzare la funzione CubicSpline
di SciPy. Ecco un esempio di base.
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline
# Punti di dati noti
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([0, 1, 8, 27, 64, 125])
# Creazione della funzione di interpolazione spline
cs = CubicSpline(x, y)
# Nuovi punti di dati
x_new = np.linspace(0, 5, 100)
y_new = cs(x_new)
# Plot
plt.plot(x, y, 'o', label='Dati originali')
plt.plot(x_new, y_new, '-', label='Interpolazione spline cubica')
plt.legend()
plt.title('Interpolazione spline cubica (1D)')
plt.show()
Interpolazione spline su dati bidimensionali
Per eseguire l’interpolazione spline su dati bidimensionali, possiamo utilizzare la funzione RectBivariateSpline
di SciPy. Ecco un esempio di base.
from scipy.interpolate import RectBivariateSpline
# Punti di dati noti
x = np.arange(5)
y = np.arange(5)
z = np.array([[0, 1, 8, 27, 64],
[1, 2, 9, 28, 65],
[8, 9, 16, 35, 72],
[27, 28, 35, 54, 91],
[64, 65, 72, 91, 128]])
# Creazione della funzione di interpolazione spline
spline = RectBivariateSpline(x, y, z)
# Nuovi punti di dati
x_new = np.linspace(0, 4, 50)
y_new = np.linspace(0, 4, 50)
z_new = spline(x_new, y_new)
# Plot
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolazione spline bivariata (2D)')
plt.show()
Vantaggi dell’interpolazione spline
L’interpolazione spline è utile per mantenere la continuità e la liscezza dei dati, migliorando la naturalezza e l’affidabilità dei risultati. È particolarmente vantaggiosa per set di dati complessi.
Comprendere l’interpolazione spline e applicarla correttamente può migliorare significativamente la precisione e l’affidabilità delle analisi dei dati.
Applicazioni dell’interpolazione
L’interpolazione trova ampio impiego in analisi dei dati e machine learning. Qui esamineremo alcuni esempi concreti di applicazioni dell’interpolazione.
Interpolazione nell’elaborazione delle immagini
In elaborazione delle immagini, l’interpolazione è essenziale per operazioni come il ridimensionamento, la rotazione e la distorsione. Ad esempio, quando si ingrandisce un’immagine, è necessario stimare i nuovi valori tra i pixel.
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import zoom
# Creazione di un'immagine di esempio
image = np.arange(100).reshape((10, 10))
# Ingrandire l'immagine del doppio
zoomed_image = zoom(image, 2)
# Plot
plt.subplot(1, 2, 1)
plt.title('Immagine originale')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Immagine ingrandita')
plt.imshow(zoomed_image, cmap='gray')
plt.show()
Interpolazione nei sistemi informativi geografici (GIS)
Nei sistemi GIS, l’interpolazione viene utilizzata per completare i dati topografici o meteorologici. Ad esempio, si può interpolare la temperatura tra i punti di osservazione per stimare la distribuzione della temperatura.
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
# Dati di punti di osservazione
points = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
values = np.array([15, 20, 25, 30])
# Griglia per l'interpolazione
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:100j]
grid_z = griddata(points, values, (grid_x, grid_y), method='cubic')
# Plot
plt.imshow(grid_z.T, extent=(0,1,0,1), origin='lower', cmap='viridis')
plt.colorbar(label='Temperatura')
plt.title('Interpolazione della temperatura')
plt.scatter(points[:,0], points[:,1], color='red')
plt.show()
Interpolazione nel preprocessing dei dati per il machine learning
Nel preprocessing dei dati per machine learning, l’interpolazione viene utilizzata per completare i valori mancanti nei dati sensoriali, migliorando la precisione dei modelli.
import numpy as np
import pandas as pd
from scipy.interpolate import interp1d
# Creazione di dati sensoriali
time = np.arange(0, 10, 0.5)
sensor_data = np.sin(time)
sensor_data[::5] = np.nan # Inserimento di valori mancanti
# Completamento dei valori mancanti
time_clean = time[~np.isnan(sensor_data)]
data_clean = sensor_data[~np.isnan(sensor_data)]
f = interp1d(time_clean, data_clean, kind='linear', fill_value="extrapolate")
sensor_data_interp = f(time)
# Plot
plt.plot(time, sensor_data, 'o', label='Dati originali')
plt.plot(time, sensor_data_interp, '-', label='Dati interpolati')
plt.legend()
plt.title('Interpolazione dei dati sensoriali')
plt.show()
Importanza delle applicazioni
L’interpolazione è utile per risolvere molti problemi del mondo reale. Scegliere e applicare correttamente il metodo di interpolazione aiuta a migliorare la qualità dei dati e ad ottenere risultati di analisi più accurati.
Esercizi e soluzioni
Per approfondire la comprensione dell’interpolazione, proviamo alcuni esercizi. Al termine di ogni problema, troverai la soluzione per aiutarti nell’auto-apprendimento.
Esercizio 1: Interpolazione lineare su dati unidimensionali
Per il set di dati seguente, eseguire l’interpolazione lineare e trovare i valori interpolati per x_new = [1.5, 2.5, 3.5]
.
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
x_new = [1.5, 2.5, 3.5]
Soluzione
import numpy as np
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
x_new = [1.5, 2.5, 3.5]
y_new = np.interp(x_new, x, y)
print(y_new) # Output: [3. 5. 7.]
Esercizio 2: Interpolazione spline su dati bidimensionali
Per il set di dati seguente, eseguire l’interpolazione spline e trovare i valori interpolati per una nuova griglia di punti x_new
e y_new
.
x = [0, 1, 2, 3, 4]
y = [0, 1, 2, 3, 4]
z = [[0, 1, 4, 9, 16],
[1, 2, 5, 10, 17],
[4, 5, 8, 13, 20],
[9, 10, 13, 18, 25],
[16, 17, 20, 25, 32]]
x_new = np.linspace(0, 4, 10)
y_new = np.linspace(0, 4, 10)
Soluzione
from scipy.interpolate import RectBivariateSpline
import numpy as np
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 2, 3, 4]
z = [[0, 1, 4, 9, 16],
[1, 2, 5, 10, 17],
[4, 5, 8, 13, 20],
[9, 10, 13, 18, 25],
[16, 17, 20, 25, 32]]
x_new = np.linspace(0, 4, 10)
y_new = np.linspace(0, 4, 10)
spline = RectBivariateSpline(x, y, z)
z_new = spline(x_new, y_new)
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolazione spline bivariata')
plt.show()
Esercizio 3: Completamento dei dati mancanti
Completa i valori mancanti nel seguente set di dati utilizzando l’interpolazione lineare.
data = {'x': [0, 1, 2, 3, 4, 5], 'y': [0, np.nan, 4, np.nan, 16, 25]}
Soluzione
import numpy as np
import pandas as pd
from scipy.interpolate import interp1d
data = {'x': [0, 1, 2, 3, 4, 5], 'y': [0, np.nan, 4, np.nan, 16, 25]}
df = pd.DataFrame(data)
x = df['x'][df['y'].notna()]
y = df['y'][df['y'].notna()]
f = interp1d(x, y, kind='linear', fill_value="extrapolate")
df['y'] = df['y'].combine_first(pd.Series(f(df['x'])))
print("Set di dati completato:\n", df)
Riepilogo
L’interpolazione è una tecnica fondamentale nell’analisi dei dati e nel machine learning. Risolvendo problemi reali, puoi approfondire la comprensione e migliorare l’applicabilità di questa tecnica.
Conclusione
L’interpolazione con NumPy è una tecnica essenziale nell’analisi dei dati e nel machine learning. In questo articolo, abbiamo esplorato il concetto di base dell’interpolazione, le tecniche di interpolazione per dati unidimensionali e bidimensionali, l’interpolazione spline, esempi pratici, applicazioni e problemi di esercizio.
Comprendere correttamente e applicare l’interpolazione consente di completare i dati mancanti, aumentare la risoluzione dei dati, migliorare l’elaborazione delle immagini e l’interpolazione dei dati GIS, e altro ancora. Applicando questa tecnica, possiamo migliorare continuamente la qualità dei nostri dati.