Académique Documents
Professionnel Documents
Culture Documents
on utilisait contour plot. Ici tout ce qu’on a faire c’est passe le tableau Z qui est un tableau de 100lignes et
100 colonnes
import matplotlib.pyplot as plt
import numpy as np
X = np.linspace(0, 5, 100)
Y = np.linspace(0, 5, 100)
X, Y = np.meshgrid(X, Y)
plt.imshow(f(X, Y))
plt.colorbar()
plt.title('f(x, y) = sin(x) + cos(y) * np.cos(x) ')
plt.show()
Exercice : graphe
Modifier le code de l’exercice précédent afin d’afficher sur une seule et même figure les différentes
variables qu’on a pour notre dateset de la fleur d’iris.
#Solution
import matplotlib.pyplot as plt
from sklearn.Dataset s importload_iris
iris = load_iris()
x = iris.data
n = x.shape[1]
plt.figure(figsize=(12, 8))
…#Code ici
plt.show()
III.1. Interpolation
Lors de l’acquisition des signaux, il arrive parfois qu’il manque des
données, dûà la fréquence d’échantillonnage ou aux caractéristiques
descapteursutilisés. Ce qui va nous produire des Dataset s qui
manquent de valeurs. Nous pouvons résoudre le problème en
supprimant les valeurs manquantes mais l’analyse devient donc très
peu satisfaisante. L’idéale est de réaliser une interpolation afin de
compléter les données manquantes.
Interpoler un signal est parfois très utile s'il vous manque des données dans un Dataset. Mais c'est une
technique dangereuse, qui peut parfois transformer la réalité des choses ! Il faut donc déterminer la
méthode d’interpolation (linéaire, cubique, quadratique, …) qui correspond mieux aux données de notre
Dataset.
Imaginons que nous ayons un capteur qui nous donne les points suivants :
import matplotlib.pyplot as plt
import numpy as np
Si nous souhaitons placer plus de point entre les points bleus, nous allons
donc faire une interpolation en utilisant le module interpol1d qui est
l’intérieur du package scipy.interpolate. Cette fonction va nous
permettre de générer une autre fonction f( ) qui est notre fonction
d’interpolation. L’attribut kind permet de définir le typez
d’interpolation que souhaite effectuer. L‘interpolation plus basique
est l’interpolation linéaire qui trace une ligne entre deux points et
c’est elle que nous nous utiliserons dans cet exemple. On peut donc
utiliser cette nouvelle fonction f( ) en lui définissant un nouvel axe
pour lequel on peu décider d’avoir 30 points ou plus au lieu de 10.
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
Il est important d’afficher le signal original et le signal interpolé pour se rassurer que le signal interpolé
est conforme au signal d’origine. Ainsi, le choix du type d’interpolation est important.
Si nous utilisons une interpolation linéaire, on se rend bien compte que le résultat n’est pas vraiment
conforma à la réalité.
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
Il faut donc prendre une interpolation qui va permettre de suivre qu maximum le signal d’origine. Ici on
peut utiliser l’interpolation cubique.
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate importinterp1d
Ici, on obtient une interpolation qui reflète plus la réalité. On peut aussi utiliser la fonction plot pour avoir
des traits continus plutôt que des points.
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate importinterp1d
Vous pouvez avoir une description de tous les types d’interpolation (linear, nearest, zero, slinear,
quadratic, cubic, previous, next) sur le site internet de scipyhttps://scipy.org/. Vous pourrez également
faire des interpolations en 2D.
III.2. Optimisation
Les problèmes d’optimisation renvoient le plus souvent aux notions d’optimisation. On trouve beaucoup
de fonctions dans le module optimize. Certaines permettent de faire des minimisations locales, ou
globales, d'autres permette de développer des modèles statistiques avec la méthode des moindres carrés.
On trouve également des fonctions pour faire de la programmation linéaire qui permet de résoudre
certains problèmes d’optimisation tout en respectant certaines contraintes.
a.1) curve_fit
La fonction curve_fit permet d’optimiser le placement d’une courbe à l’intérieur d’un nuage de points.
Imaginons qu’on a ce Dataset qui est polynôme de degré trois auquel est greffé un peu de bruit et que
nous souhaitons développer un modèle statistique qui entre bien dans ce nuage de point. On peut donc
utiliser la fonction curve_fit qui se sert de la méthode des moindres carrés pour trouver les meilleurs
paramètres a, b c, … d’un modèle qu’on aura fournis a notre fonction.
import matplotlib.pyplot as plt
import numpy as np
# curve_fit permet de trouver les paramètres du modèle f grâceà la méthode des moindres carrés
params, param_cov = optimize.curve_fit(f, x, y)
print(params) #paramètre du modèle
print(params_cov)#covariance être es paramètres
a.2) Minimisation 1D
La fonction optimize.minimize est utile pour trouver un minimum local dans une fonction à N
dimensions.
import matplotlib.pyplot as plt
import numpy as np
# Visualisation de la fonction
x = np.linspace(-10, 10, 100)
plt.plot(x, f(x))
plt.show()
Pour utiliser cette fonction il faut définir un point de départ x0 (-8 par exemple) a partir duquel la fonction
va exécuter un algorithme de minimisation qui va peut a peu converger vers le premier minimum qu’il va
trouver.
import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize
# Visualisation de la fonction
x = np.linspace(-10, 10, 100)
a.3) Minimisation 2D
La fonction minimize peut être utilisée sur des fonctions à 2D ou 3D, …. si nous prenons notre dernière
fonction sur matplotlib que nous avons visualisé à l’aide d’un contourplot. On peur voir dans ce graphe la
présence de maximums et de minimums.
import matplotlib.pyplot as plt
import numpy as np
# Visualisation de la fonction
plt.contour(x, y, f(np.array([x, y])), 20)
#plt.contour(x, y, f(np.array([x, y])), 20, colors='black')
plt.show()
On va donc essayez de trouver le minimum dans cette fonction. Ici nous on va initialiser la fonction avec
points x0 = (0, 0) (étant donné que nous sommes en 2D).
import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize
# Visualisation de la fonction
#plt.contour(x, y, f(np.array([x, y])), 20, colors='black')
# Minimisation de la fonction
result = optimize.minimize(f, x0=x0).x
print('le minimum est aux coordonnées', result) # imprimer le résultat
# Visualisation du résultat
plt.contour(x, y, f(np.array([x, y])), 20) # on dessine la fonction 2D
plt.scatter(x0[0], x0[1], marker='+', c='r', s=100, label='initial') # on place le Point de départ
plt.scatter(result[0], result[1], c='g', s=100, label='final') # on place le Point final
plt.legend()
plt.show()
fonction signal.detrend est parfaite pour éliminer une tendance linéaire dans un signal. Utile pour
beaucoup d'applications !
import matplotlib.pyplot as plt
import numpy as np
Pour obtenir un tel spectre on va chargerle module fftpack a l‘intérieur duquel on va utiliser deux
fonctionfft( ) et fftfreq( ). On commence par générer le signal :
import matplotlib.pyplot as plt
import numpy as np
Dans l'exemple ci-dessous, ajoutons du bruit au signal et nous comment filtrer un signal noyé dans du
bruit.
import matplotlib.pyplot as plt
import numpy as np
L’idée ici est de retrouver le signal de départ. On va donc procéder au filtrage du signal bruité en 3
étapes :
On commence par transformer ce signal en spectre de fréquences comme dans l’exemple précédant :
import matplotlib.pyplot as plt
import numpy as np
from scipy import fftpack
On constate sur le spectre qu’il ya des fréquences parasites. Nous allons donc utiliser le boolean indexing
pour supprimer toutes ses fréquences qui sont inferieur à un seuil que nous allons lire sur l’axe des
amplitudes afin de garder nos 3 pics.
import matplotlib.pyplot as plt
import numpy as np
from scipy import fftpack
On va utiliser la transformer de fourrier inverse pour revenir dans le monde du réel et afficher de nouveau
les signaux temporels.
import matplotlib.pyplot as plt
import numpy as np
from scipy import fftpack
# Transformation de Fourier Inverse: génère un nouveau signal temporel depuis le spectre filtré
filtered_signal = fftpack.ifft(fourier) #transformation de fourrier inverse
On constate que le signal n’est pas aligné sur l’axe (0,0), on peut donc utiliser la fonction detrend pour
ajuster la ligne de base.
import matplotlib.pyplot as plt
import numpy as np
from scipy import fftpack
from scipy import signal
# création des variables Fourier et Fréquences, qui permettent de construire le spectre du signal.
fourier = fftpack.fft(y)
power = np.abs(fourier) # la variable power est créée pour éliminer les amplitudes négatives
frequence = fftpack.fftfreq(y.size)
freq = np.abs(frequence) # la variable freq est créée pour éliminer les fréquences négatives
plt.legend()
plt.xlabel('Periode')
plt.ylabel('Amplitude')
plt.show()
On peut utiliser ces techniques de morphologies pour enlever des petits artefacts qu’on retrouve sur une
image. Nous modélisons une image dans laquelle nous incrustons de petits artefacts que nous allons
essayez d’enlever avec l’image processing.
import matplotlib.pyplot as plt
import numpy as np
Une fois l’image importée sur deux dimensions, on va pouvoir commencer le traitement. On va
commencer par extraire les bactéries de l’arrière plan, pour cela nous allons utiliser du boolean indexing
avec numpy. On crée une copie de notre image que nous allons aplatir sur une seule dimension avant de
créer l’histogramme.
On va supprimer les tendances claires (blanches) et grise pour ne garder les sombres qui correspondes a
nos bactéries. N va donc utiliser du boolean indexing pour fileter toutes les valeurs des pixels supérieurs
0.6 et ne garder que celles inferieurs qui correspondent aux sombres. L’image obtenue est un masque
parce que le résultat du boolean indexing est en fait une fonction logique qui retourne True ou False.
import matplotlib.pyplot as plt
image = plt.imread('bacteria.png')
image = image[:,:,0] # réduire l'image en 2D
On va utiliser la fonction label de ndimage pour segmenter cette l’image et mettre une étiquette sur
chaque bactérie qu’on peut voir. Label renvoie deux variables : label_image qui va contenir notre image
sur laquelle on a mis une étiquette sur chaque bactérie qu’on peut voir et n_labels qui va contenir le
chaque étiquette qu’on a pu placer sur l’image.
import matplotlib.pyplot as plt
from scipy import ndimage
On peut voir que 53 petites groupes ont été créés. On peut donc
afficher l’image étiqueté.
On va utiliser la fonction sum de ndimage pour compter tous les
pixels qu’il y’a dans chaque grouper. Donc on va pourvoir
mesurer la taille (relative) de chaque bactérie qu’il y’a sur cette
photo.
import matplotlib.pyplot as plt
from scipy import ndimage
image = plt.imread('bacteria.png')
image = image[:,:,0] # réduire l'image en 2D
A partir de là nous avons un Dataset, on peut commencer à calculer une moyenne, faire des statistiques,
…
C’est génial de pouvoir créer de tels graphiques à partir des images téléchargées sur internet.