Visualisation _ Cercles de niveau _ python
Dans cet article je vous montre comment représenter une fonction de ℝ² dans ℝ du point de vue de ses cercles de niveau. Voici quelques exemples de visualisations que vous serez capables de générer :
PS : Si vous avez déjà suivi le tutoriel “Visualisation 3D d’une fonction de ℝ² dans ℝ avec Python”, vous pouvez passer directement à la partie “Visualisation” de ce tutoriel car la préparation des données est la même.
Tout d’abord il y a quelques librairies python à installer/importer :
installation
pip install numpy
pip install matplotlib
importation
import numpy as np
import matplotlib.pyplot as plt
Préparation des données
Soit une fonction f de ℝ² dans ℝ. Pour tout couple (x, y) dans ℝ², on a
f(x, y) = 2*x² — x*y + 2*y²
On définit la fonction f en python :
def f(x, y):
return 2*x**2 - x*y + 2*y**2
On choisit un intervalle de valeurs dans l’ensemble des réels R pour x et y (je prendrai pour exemple [-100, 100] avec 100 valeurs pour chaque variable).
x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)
Nous allons ensuite créer un tableau de valeurs contenant tous les couples de valeur (xi, yi) pour xi parcourant x, et yi parcourant y, comme illustré ci-dessous.
X, Y = np.meshgrid(x, y)
Puis on calcule les valeurs de notre fonction f définie plus haut, et on stock ces valeurs dans une nouvelle variable Z :
Z = f(X,Y)
Après cela, nous n’avons qu’à afficher Z en fonction de X et Y :
Visualisation
fig = plt.figure()contours = plt.contour(X, Y, Z)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.show()
Bon c’est pas incroyable! Heureusement, on peut aller plus loin et choisir le nombre de cercles de niveau (levels : ici levels = 5 par défault), définir la taille de la figure (figsize), afficher les valeurs des cercles de niveau (plt.clabel), choisir la taille des caractères affichés sur les cercles de niveau (fontsize), ajouter une échelle de couleurs (colorbar), modifier l’échelle de couleur (cmap : je mets une liste de valeurs possibles pour cmap) ..
Un exemple plus complet
fig = plt.figure(figsize = (10,7))contours = plt.contour(Z, levels = 20, cmap = 'jet')plt.clabel(contours, inline = True, fontsize = 9)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.colorbar()plt.show()
C’est quand même plus beau!
Une variante des cercles de niveau
On peut également représenter les variations de notre fonction en 2D de manière continue, avec des intensités de couleurs. Ceci revient à regarder un graphique en 3 dimensions d’en haut.
fig = plt.figure(figsize = (10,7))plt.imshow(Z, extent = [-100,100,-100,100], origin = 'lower', cmap = 'hot', alpha = 1)plt.title("Cercles de niveau de notre fonction", fontsize=13)plt.xlabel('x', fontsize=11)plt.ylabel('y', fontsize=11)plt.colorbar()plt.show()
Conclusion
On a vu plusieurs manières de représenter une fonction de ℝ² dans ℝ avec ses cercles de niveau, cela peut être utile dans de nombreux cas comme par exemple la représentation de l’évolution d’une fonction de coût lors de la descente de gradient, comme sur le screen ci-dessous :
Si vous voulez aller plus loin et tracer l’évolution d’une fonction de coût pendant la descente de gradient, je vous suggère de jeter un œil à cet article!
Bonus
Les valeurs possibles de cmap :
‘Accent’, ‘Accent_r’, ‘Blues’, ‘Blues_r’, ‘BrBG’, ‘BrBG_r’, ‘BuGn’, ‘BuGn_r’, ‘BuPu’, ‘BuPu_r’, ‘CMRmap’, ‘CMRmap_r’, ‘Dark2’, ‘Dark2_r’, ‘GnBu’, ‘GnBu_r’, ‘Greens’, ‘Greens_r’, ‘Greys’, ‘Greys_r’, ‘OrRd’, ‘OrRd_r’, ‘Oranges’, ‘Oranges_r’, ‘PRGn’, ‘PRGn_r’, ‘Paired’, ‘Paired_r’, ‘Pastel1’, ‘Pastel1_r’, ‘Pastel2’, ‘Pastel2_r’, ‘PiYG’, ‘PiYG_r’, ‘PuBu’, ‘PuBuGn’, ‘PuBuGn_r’, ‘PuBu_r’, ‘PuOr’, ‘PuOr_r’, ‘PuRd’, ‘PuRd_r’, ‘Purples’, ‘Purples_r’, ‘RdBu’, ‘RdBu_r’, ‘RdGy’, ‘RdGy_r’, ‘RdPu’, ‘RdPu_r’, ‘RdYlBu’, ‘RdYlBu_r’, ‘RdYlGn’, ‘RdYlGn_r’, ‘Reds’, ‘Reds_r’, ‘Set1’, ‘Set1_r’, ‘Set2’, ‘Set2_r’, ‘Set3’, ‘Set3_r’, ‘Spectral’, ‘Spectral_r’, ‘Wistia’, ‘Wistia_r’, ‘YlGn’, ‘YlGnBu’, ‘YlGnBu_r’, ‘YlGn_r’, ‘YlOrBr’, ‘YlOrBr_r’, ‘YlOrRd’, ‘YlOrRd_r’, ‘afmhot’, ‘afmhot_r’, ‘autumn’, ‘autumn_r’, ‘binary’, ‘binary_r’, ‘bone’, ‘bone_r’, ‘brg’, ‘brg_r’, ‘bwr’, ‘bwr_r’, ‘cividis’, ‘cividis_r’, ‘cool’, ‘cool_r’, ‘coolwarm’, ‘coolwarm_r’, ‘copper’, ‘copper_r’, ‘cubehelix’, ‘cubehelix_r’, ‘flag’, ‘flag_r’, ‘gist_earth’, ‘gist_earth_r’, ‘gist_gray’, ‘gist_gray_r’, ‘gist_heat’, ‘gist_heat_r’, ‘gist_ncar’, ‘gist_ncar_r’, ‘gist_rainbow’, ‘gist_rainbow_r’, ‘gist_stern’, ‘gist_stern_r’, ‘gist_yarg’, ‘gist_yarg_r’, ‘gnuplot’, ‘gnuplot2’, ‘gnuplot2_r’, ‘gnuplot_r’, ‘gray’, ‘gray_r’, ‘hot’, ‘hot_r’, ‘hsv’, ‘hsv_r’, ‘inferno’, ‘inferno_r’, ‘jet’, ‘jet_r’, ‘magma’, ‘magma_r’, ‘nipy_spectral’, ‘nipy_spectral_r’, ‘ocean’, ‘ocean_r’, ‘pink’, ‘pink_r’, ‘plasma’, ‘plasma_r’, ‘prism’, ‘prism_r’, ‘rainbow’, ‘rainbow_r’, ‘seismic’, ‘seismic_r’, ‘spring’, ‘spring_r’, ‘summer’, ‘summer_r’, ‘tab10’, ‘tab10_r’, ‘tab20’, ‘tab20_r’, ‘tab20b’, ‘tab20b_r’, ‘tab20c’, ‘tab20c_r’, ‘terrain’, ‘terrain_r’, ‘twilight’, ‘twilight_r’, ‘twilight_shifted’, ‘twilight_shifted_r’, ‘viridis’, ‘viridis_r’, ‘winter’, ‘winter_r’