Comment effectuer l’interpolation avec NumPy : guide complet

NumPy est une bibliothèque Python puissante pour le calcul numérique, utilisée dans de nombreuses situations d’analyse de données et de calcul scientifique. En particulier, l’interpolation, qui permet de combler les lacunes des données, est une technique importante dans l’analyse des données. Cet article explique en détail les bases et les applications de l’interpolation avec NumPy. Il s’agit d’un guide pratique destiné à un large éventail d’utilisateurs, des débutants aux utilisateurs avancés.

Sommaire

Concept de base de l’interpolation

L’interpolation est une méthode permettant d’estimer des points de données inconnus en se basant sur des points de données connus. Elle est utilisée pour compléter des données manquantes ou augmenter la résolution des données. Les méthodes d’interpolation les plus fondamentales incluent l’interpolation linéaire, l’interpolation par spline, et l’interpolation polynomiale. En comprenant ces méthodes, vous pouvez améliorer la qualité des données et effectuer des analyses plus précises.

Fonctions d’interpolation dans NumPy

NumPy dispose de plusieurs fonctions puissantes pour réaliser des interpolations. Ces fonctions vous permettent d’effectuer des interpolations efficaces sur divers types de données.

numpy.interp

Il s’agit de la fonction de base pour effectuer une interpolation linéaire sur des données unidimensionnelles. Son utilisation est simple : il suffit de spécifier les points de données connus et les points à interpoler pour calculer les valeurs interpolées.

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)  # Sortie : [0.5, 2.5]

scipy.interpolate

Étant donné que NumPy lui-même dispose de fonctions d’interpolation limitées, il est recommandé d’utiliser également le module interpolate de SciPy. Cela permet d’utiliser des méthodes d’interpolation plus complexes, telles que l’interpolation multidimensionnelle ou non linéaire.

scipy.interpolate.interp1d

Cette fonction génère une fonction d’interpolation pour des données unidimensionnelles. Il est possible de spécifier différentes méthodes d’interpolation, telles que l’interpolation linéaire ou par 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)

En utilisant ces fonctions, les possibilités d’interpolation avec NumPy sont considérablement étendues.

Interpolation de données unidimensionnelles

L’interpolation de données unidimensionnelles est une méthode de base pour estimer de nouveaux points de données entre des points connus. Elle peut être facilement réalisée avec NumPy ou SciPy.

Interpolation linéaire

La méthode d’interpolation la plus simple est l’interpolation linéaire. Elle consiste à relier les points de données connus par des lignes droites et à estimer les points sur ces lignes. Elle peut être réalisée avec la fonction interp de 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)  # Sortie : [0.5, 2.5]

Interpolation non linéaire

Dans l’interpolation non linéaire, les points de données sont interpolés en utilisant des méthodes autres que linéaires. Avec la fonction interp1d de SciPy, il est possible d’effectuer des interpolations quadratiques ou par spline, par exemple.

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)

Exemple d’interpolation quadratique

L’interpolation quadratique consiste à relier les points de données connus par des fonctions quadratiques (paraboles). Cela permet d’obtenir des résultats d’interpolation plus lisses.

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='Données originales')
plt.plot(x_new, y_new_quadratic, '-', label='Interpolation quadratique')
plt.legend()
plt.show()

L’interpolation de données unidimensionnelles est un outil puissant pour combler les lacunes des données. En maîtrisant l’interpolation linéaire et non linéaire, vous pouvez améliorer la précision de vos analyses de données.

Interpolation de données bidimensionnelles

L’interpolation de données bidimensionnelles est cruciale dans des domaines tels que le traitement d’images et les systèmes d’information géographique. Cet article explique comment effectuer efficacement l’interpolation de données bidimensionnelles à l’aide de NumPy et SciPy.

Interpolation linéaire

L’interpolation linéaire de données bidimensionnelles se fait avec la fonction interp2d de SciPy. Cette fonction permet d’interpoler de nouveaux points sur un plan bidimensionnel à partir de points de données connus.

import numpy as np
from scipy.interpolate import interp2d
import matplotlib.pyplot as plt

# Données connues
x = [0, 1, 2]
y = [0, 1, 2]
z = [[0, 1, 4], [1, 2, 5], [4, 5, 8]]

# Créer la fonction d'interpolation
f = interp2d(x, y, z, kind='linear')

# Nouveaux points de données
x_new = np.linspace(0, 2, 10)
y_new = np.linspace(0, 2, 10)
z_new = f(x_new, y_new)

# Tracer
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolation linéaire')
plt.show()

Interpolation par spline

L’interpolation par spline est utilisée pour obtenir des résultats plus lisses. Elle est effectuée avec la classe RectBivariateSpline de SciPy.

from scipy.interpolate import RectBivariateSpline

# Données connues
x = [0, 1, 2]
y = [0, 1, 2]
z = [[0, 1, 4], [1, 2, 5], [4, 5, 8]]

# Créer la fonction d'interpolation par spline
spline = RectBivariateSpline(x, y, z)

# Nouveaux points de données
x_new = np.linspace(0, 2, 10)
y_new = np.linspace(0, 2, 10)
z_new = spline(x_new, y_new)

# Tracer
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolation par spline')
plt.show()

Avantages de l’interpolation par spline

L’interpolation par spline est utilisée pour conserver la continuité et la douceur des données. Elle est particulièrement efficace pour les données dont les variations sont faibles.

En comprenant et en appliquant l’interpolation de données bidimensionnelles, vous pouvez améliorer la précision et la fiabilité de vos analyses de données.

Exemples pratiques : Complétion des données manquantes

Les données manquantes sont un problème courant dans l’analyse des données. L’interpolation peut être utilisée pour compléter ces données manquantes, ce qui améliore la précision des analyses.

Exemple de données manquantes

Il se peut qu’un jeu de données contienne des valeurs manquantes (NaN), comme illustré ci-dessous. Ces valeurs peuvent être complétées par interpolation.

import numpy as np
import pandas as pd
from scipy.interpolate import interp1d

# Exemple de jeu de données avec valeurs manquantes
data = {'x': [0, 1, 2, 3, 4, 5], 'y': [0, np.nan, 4, np.nan, 16, 25]}
df = pd.DataFrame(data)
print("Jeu de données avec valeurs manquantes :\n", df)

Interpolation des données unidimensionnelles

Pour compléter les valeurs manquantes dans les données unidimensionnelles, il suffit de créer une fonction d’interpolation basée sur les données non manquantes et de l’utiliser pour compléter les valeurs manquantes.

# Données sans valeurs manquantes
x = df['x'][df['y'].notna()]
y = df['y'][df['y'].notna()]

# Créer la fonction d'interpolation (interpolation linéaire)
f = interp1d(x, y, kind='linear', fill_value="extrapolate")

# Compléter les valeurs manquantes
df['y'] = df['y'].combine_first(pd.Series(f(df['x'])))
print("Jeu de données complété :\n", df)

Interpolation des données bidimensionnelles

Pour compléter les données manquantes dans les données bidimensionnelles, par exemple dans des données d’image, des méthodes plus avancées sont nécessaires. Ici, nous utilisons la fonction griddata pour effectuer l’interpolation bidimensionnelle.

from scipy.interpolate import griddata

# Exemple de données bidimensionnelles
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]])

# Points sans valeurs manquantes
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])])

# Interpolation
grid_x, grid_y = np.mgrid[0:4:5j, 0:4:5j]
z_new = griddata(points, values, (grid_x, grid_y), method='cubic')

# Tracer
plt.imshow(z_new, extent=(0, 4, 0, 4), origin='lower', cmap='viridis')
plt.colorbar()
plt.title('Interpolation cubique des données manquantes')
plt.show()

Importance de la complétion des données manquantes

Compléter les données manquantes correctement permet d’améliorer considérablement les résultats de l’analyse des données. L’interpolation est une méthode puissante pour combler les lacunes tout en maintenant la continuité des données.

Méthodes d’interpolation par spline

L’interpolation par spline est une méthode avancée qui permet de maintenir la douceur des données tout en les interpolant. Elle est particulièrement efficace lorsque les données présentent peu de variations brusques. Cet article explique comment implémenter l’interpolation par spline avec NumPy et SciPy.

Concept de base de l’interpolation par spline

L’interpolation par spline utilise des polynômes pour interpoler les données entre les points. Cela génère des courbes lisses et continues. La forme la plus courante de l’interpolation par spline est l’interpolation par spline cubique.

Interpolation par spline pour des données unidimensionnelles

Pour effectuer une interpolation par spline sur des données unidimensionnelles, vous pouvez utiliser la fonction CubicSpline de SciPy. Voici un exemple de son utilisation de base.

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline

# Données connues
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([0, 1, 8, 27, 64, 125])

# Créer la fonction d'interpolation par spline
cs = CubicSpline(x, y)

# Nouveaux points de données
x_new = np.linspace(0, 5, 100)
y_new = cs(x_new)

# Tracer
plt.plot(x, y, 'o', label='Données originales')
plt.plot(x_new, y_new, '-', label='Interpolation spline cubique')
plt.legend()
plt.title('Interpolation spline cubique (1D)')
plt.show()

Interpolation par spline pour des données bidimensionnelles

L’interpolation par spline bidimensionnelle peut être effectuée avec la fonction RectBivariateSpline de SciPy. Voici un exemple de son utilisation de base.

from scipy.interpolate import RectBivariateSpline

# Données connues
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]])

# Créer la fonction d'interpolation par spline
spline = RectBivariateSpline(x, y, z)

# Nouveaux points de données
x_new = np.linspace(0, 4, 50)
y_new = np.linspace(0, 4, 50)
z_new = spline(x_new, y_new)

# Tracer
X, Y = np.meshgrid(x_new, y_new)
plt.contourf(X, Y, z_new, cmap='viridis')
plt.colorbar()
plt.title('Interpolation spline bivariée (2D)')
plt.show()

Avantages de l’interpolation par spline

L’interpolation par spline permet de maintenir la continuité et la douceur des données, rendant ainsi les résultats d’analyse plus naturels et fiables. Elle est particulièrement utile pour les ensembles de données complexes.

En comprenant et en appliquant l’interpolation par spline, vous pouvez considérablement améliorer la précision et la fiabilité de vos analyses de données.

Exemples d’applications de l’interpolation

L’interpolation est largement utilisée dans l’analyse des données et l’apprentissage automatique. Voici quelques exemples d’applications concrètes.

Interpolation dans le traitement d’images

Dans le traitement d’images, l’interpolation est essentielle pour le redimensionnement, la rotation, et la déformation des images. Par exemple, lors de l’agrandissement d’une image, il est nécessaire d’estimer de nouvelles valeurs entre les pixels.

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import zoom

# Créer une image exemple
image = np.arange(100).reshape((10, 10))

# Agrandir l'image par un facteur de 2
zoomed_image = zoom(image, 2)

# Tracer
plt.subplot(1, 2, 1)
plt.title('Image originale')
plt.imshow(image, cmap='gray')

plt.subplot(1, 2, 2)
plt.title('Image zoomée')
plt.imshow(zoomed_image, cmap='gray')

plt.show()

Interpolation dans les systèmes d’information géographique (SIG)

Les systèmes d’information géographique utilisent l’interpolation pour compléter des données topographiques ou météorologiques. Par exemple, des données de température peuvent être interpolées pour estimer la distribution de température sur une zone géographique.

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# Données des points de mesure
points = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
values = np.array([15, 20, 25, 30])

# Grille d'interpolation
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:100j]
grid_z = griddata(points, values, (grid_x, grid_y), method='cubic')

# Tracer
plt.imshow(grid_z.T, extent=(0,1,0,1), origin='lower', cmap='viridis')
plt.colorbar(label='Température')
plt.title('Interpolation de température')
plt.scatter(points[:,0], points[:,1], color='red')
plt.show()

Prétraitement des données dans l’apprentissage automatique

Dans le prétraitement des données pour l’apprentissage automatique, l’interpolation est utilisée pour compléter les valeurs manquantes des données. Par exemple, les valeurs manquantes des capteurs peuvent être interpolées pour améliorer la précision du modèle.

import numpy as np
import pandas as pd
from scipy.interpolate import interp1d

# Créer des données de capteurs
time = np.arange(0, 10, 0.5)
sensor_data = np.sin(time)
sensor_data[::5] = np.nan  # Insérer des valeurs manquantes

# Compléter les valeurs manquantes
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)

# Tracer
plt.plot(time, sensor_data, 'o', label='Données originales')
plt.plot(time, sensor_data_interp, '-', label='Données interpolées')
plt.legend()
plt.title('Interpolation des données de capteurs')
plt.show()

Importance des applications

L’interpolation joue un rôle crucial dans la résolution de nombreux problèmes réels. Il est important de choisir et d’appliquer la méthode d’interpolation appropriée pour améliorer la qualité des données et obtenir des résultats d’analyse plus précis.

Exercices et solutions

Pour approfondir votre compréhension de l’interpolation, essayez de résoudre les exercices ci-dessous. Chaque problème est suivi d’un exemple de solution pour vous aider dans votre apprentissage autonome.

Exercice 1 : Interpolation linéaire de données unidimensionnelles

Pour le jeu de données ci-dessous, effectuez une interpolation linéaire et trouvez les valeurs interpolées pour 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]

Solution

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)  # Sortie : [3. 5. 7.]

Exercice 2 : Interpolation par spline bidimensionnelle

Pour le jeu de données ci-dessous, effectuez une interpolation par spline et trouvez les valeurs interpolées pour le nouveau maillage x_new et 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)

Solution

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('Interpolation spline bivariée')
plt.show()

Exercice 3 : Complétion des données manquantes

Complétez les valeurs manquantes du jeu de données ci-dessous par interpolation linéaire.

data = {'x': [0, 1, 2, 3, 4, 5], 'y': [0, np.nan, 4, np.nan, 16, 25]}

Solution

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("Jeu de données complété :\n", df)

Résumé

L’interpolation est une technique clé dans l’analyse des données et l’apprentissage automatique. En vous attaquant à des problèmes concrets, vous pouvez approfondir votre compréhension et améliorer vos compétences en appliquant cette technique dans divers domaines.

Résumé

L’interpolation avec NumPy est une technique très importante dans les domaines de l’analyse des données et de l’apprentissage automatique. Cet article a détaillé les concepts de base de l’interpolation, les méthodes spécifiques pour les données unidimensionnelles et bidimensionnelles, l’interpolation par spline, des exemples pratiques, des applications concrètes et des exercices pour pratiquer cette technique.

Comprendre et appliquer correctement l’interpolation permet de compléter les données manquantes, d’améliorer la résolution des données et d’effectuer des interpolations d’images ou de données géographiques avec une plus grande précision. Continuez à appliquer ces techniques pour améliorer la qualité de vos données.

Sommaire