Académique Documents
Professionnel Documents
Culture Documents
Code B3014
Volume Horaire 32 h
Crédits 2
Niveau 3
Semestre 1
Pré-requis Bases du C
Plan du cours :
Anaconda contient tous les outils et librairies dont vous avez besoin pour faire du Machine Learning :
Numpy, Matplotlib, Sklearn, etc. Commencez par télécharger puis installer Anaconda depuis le site
officiel : https://www.anaconda.com/distribution/#download-section
Note: Téléchargez toujours la version la plus récente de Python
Une fois Anaconda installé, vous pouvez lancer l’application Jupyter Notebook depuis votre barre de
recherche Windows/Mac/Linux.
La fenêtre principale de Jupyter n’est ni plus ni moins qu’un explorateur de fichier relié à votre disque
dur, vous pouvez ouvrir tous vos fichiers, Dataset, codes, etc. depuis cette fenêtre. Cliquez sur le bouton
‘New’ situé en haut à droite de cette fenêtre pour commencer à écrire un nouveau programme (puis
cliquez sur Python 3). La fenêtre suivante s’affiche alors : Vous êtes prêts à coder !
Le plus souvent, il n’est pas nécessaire de développer ses propres fonctions car celles-ci sont déjà
développées dans des librairies open source. Par exemple, la librairie Sklearn contient toutes les
fonctions mathématiques et l’algorithme de Gradient Descent que nous verrons plus tard !
En pratique, il est donc inutile d’écrire la moindre équation mathématique. Génial, non ?! Au fil des
exemples dans ce cours, vous allez naturellement apprendre comment programmer en Python
spécialement pour le Machine Learning. Mon but est de vous épargner une avalanche de détails inutiles,
pour vous montrer les fonctions essentielles et utiles qui vous aideront réellement à résoudre des
problèmes dans votre travail après la lecture de ce cours.
Il est parfois nécessaire de faire un bloc de code en commentaire, le plus simple c’est de créer une zone de
commentaire sur plusieurs lignes. Pour le faire, il suffit d’encadrer votre code des triples guillemets
«"""» ou sectionner le bloc de code et taper la commande shift + Alt + a pour le transformer en
commentaire.
"""Ceci
Est
Un
Commentaire
Sur plusieurs lignes"""
- bool (booléen)
x = 3# type int
y = 2.5# type float
prenom = 'Pierre'# type string
z = True # type Bool
On peut également déclarer et affecter les valeurs à plusieurs variables sur la même ligne :
x, y = 3, 2.5
Résultats :
x = 3
y = 2.5
Résultats :
x + y = 5.5
x - y = 0.5
x / y = 1.2
x // y = 1.0
x * y = 7.5
x ^ y = 15.588457268119896
Note : dans Spyder ou sur Visual studio code l’instruction print est obligatoire pour afficher le résultat
des opérations, par contre sur jupyter il suffit d’écrire le code et exécuter.
Résultats :
égalité : False
inégalité : True
inférieur ou égal : False
supérieur ou égal : True
Résultats :
ET : False
OU : True
OU exclusif : True
Note: - Les opérations de comparaison et de logique utilisées ensemble permettent de construire des
structures algorithmiques de bases (if/esle, while, ...)
-Les operateurs logiques répondent aux structures des tables de vérité : ET, OU, Non, Ou-
Exclusif.
defnom_de_la_fonction(argument_1, argument_2):
restultat = argument_1 + argument_2
return restultat
Exemples :
# Ici g a une valeur par défaut donc nous ne sommes pas oblige de lui donner une autre valeur
e_potentielle(masse=10, hauteur=10)
Note : rappeler les noms des keywords de nos paramètres avant de passer les valeurs n’est pas
obligatoire, mais nécessaire pour modifier par exemple la valeur par de défaut d’un paramètre.
# Exemple concret : fonction qui calcul l'énergie potentielle d'un corps
# Ici g a une valeur par défaut, mais nous pouvons modifier la valeur pour cette appel
e_potentielle(masse=10, hauteur=10, g=5)
Sklearn est la librairie qui contient toutes les fonctions de l’état de l’art
du Machine Learning. On y trouve les algorithmes les plus importants
ainsi que diverses fonctions de pré-processing.
II.1) Comparaisons
Avant de passer aux structures, nous abordons tout de suite les comparaisons. Python est capable
d’effectuer toute une série de comparaisons entre le contenu de différentes variables, telles que :
Syntaxe Python signification
== égal à
!= différent de
> Supérieur à
>= supérieur ou égal à
< Inférieur à
<= inférieur ou égal à
valeur = -2
print(valeur <0) # le résultat de cette comparaison est True
if valeur <0:
print('négatif')
Résultat :
True
Négatif
Cela permet de développer des algorithmes avec des mélanges d'opérations Logiques et d'opérations de
comparaisons. Par exemple : si il fait beau et qu'il faut chaud, alors j'irai me baigner
x = 3
y = -1
if (x>0) and (y>0):
print('x et y sont positifs')
else:
print('x et y ne sont pas tous les 2 positifs')
L’instruction range() fonctionne sur le modèle range([début,] fin[, pas]). Les arguments entre crochets
sont optionnels.
# On peut s'amuser à combiner cette boucle avec notre fonction de tout à l'heure.
for i in range(-10, 10, 2):
print(i)
test_du_signe(i)
Si votre liste ne contient que quatre éléments, ceci est encore faisable mais imaginez qu’elle en contienne
100 voire 1000 ! Pour remédier à cela, il faut utiliser les boucles. Regardez l’exemple suivant :
animaux = ['girafe','tigre','singe','souris']
for animal in animaux:
print (animal)
En fait, la variable animal va prendre successivement les différentes valeurs de la liste desanimaux à
chaque itération de la boucle. Notez bien les types de variable : animaux est une liste sur laquelle on itère,
et animal est une chaîne de caractère qui à chaque itération de la boucle prendra les valeurs successives de
la liste animaux (car les éléments de la liste sont des chaînes de caractère, mais on verra plus loin que cela
est valable pour n’importe quel type de variable).
Il est aussi possible d’utiliser une tranche d’une liste :
animaux = ['girafe','tigre','singe','souris']
for animal in animaux[1:3]:
print (animal) #on va afficher le 1 et le 2e element de la liste
Nous allons maintenant parcourir cette liste, mais cette fois par une itération sur ses indices :
animaux = ['girafe','tigre','singe','souris']
for i in range(4):
print(animaux[i])
Faites bien attention aux tests et à l’incrémentation que vous utilisez car une erreur mène souvent à des
boucles infinies qui ne s’arrêtent pas. Vous pouvez néanmoins toujours stopper l’exécution d’un script
Python à l’aide de la combinaison de touches Ctrl-C.
2. Refaire la fonction en utilisant les listes. Cette fois on aura une fonction qui retourne une liste qui
contient tous les éléments de la suite de Fibonacci.
3. Écrivez un script qui construit la liste des n premiers termes de la suite de Fibonacci puis
l’affiche.
III.1. Listes
Une liste est une structure de données qui contient une série de valeurs. Python autorise la construction de
liste contenant des valeurs de type différent (par exemple entier et chaîne de caractères), ce qui leur
confère une grande flexibilité. Une liste est déclarée par une série de valeurs (ne pas oublier les
guillemets, simples ou doubles, s’il s’agit de chaînes de caractères) séparées par des virgules, et le tout
encadré par des crochets. En voici quelques exemples :
animaux = ['girafe','tigre','singe','souris']
tailles = [5, 2.5, 1.75, 0.15]
mixte = ['girafe', 5, 'souris', 0.15]
print(animaux)
print(tailles)
print(mixte)
a.1) Utilisation
Un des gros avantages d’une liste est que vous pouvez appeler ses éléments par leur position. Ce numéro
est appelé indice (ou index) de la liste.
Liste : ['girafe', 'tigre', 'singe', 'souris']
Indice : 0 1 2 3
Soyez très attentifs au fait que les indices d’une liste de n éléments commence à 0 et se termine à n-1.
Voyez l’exemple suivant :
animaux = ['girafe','tigre','singe','souris']
print(animaux[0])
print(animaux[1])
print(animaux[2])
print(animaux[3])
print(animaux[4]) #Par conséquent, si on appelle l’élément d’indice 4 de notre liste, Python renverra un message
d’erreur :
La liste peut également être indexée avec des nombres négatifs selon le modèle suivant :
Liste : ['girafe', 'tigre', 'singe', 'souris']
Indice positif : 0 1 2 3
Indice négatif : -4 -3 -2 -1
Ou encore :
Liste : ['A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L']
Indice positif : 0 1 2 3 4 5 6 7 8 9
Indice négatif : -10 -9 -8 -7 -6 -5 -4 -3 - 2 -1
Les indices négatifs reviennent à compter à partir de la fin. Leur principal avantage est que vous pouvez
appeler le dernier élément d’une liste à l’aide de l’indice -1 sans pour autant connaître la longueur de la
liste.
animaux = ['girafe','tigre','singe','souris']
print(animaux[-1])
Un autre avantage des listes est la possibilité de sélectionner une partie en utilisant un Slicing construit
sur le modèle [m:n+1] pour récupérer tous les éléments, du émième au énième (de l’élément m inclus à
l’élément nexclus). On dit alors qu’on récupère une tranche de la liste, par exemple :
animaux = ['girafe','tigre','singe','souris']
print(animaux[0:2])
print(animaux[0:3])
print(animaux[0:])
print(animaux[:])
print(animaux[1:])
print(animaux[1:-1])
print(animaux[1:-1])
On peut aussi préciser le pas en ajoutant un« : » supplémentaire et en indiquant le pas par un entier.
animaux = ['girafe','tigre','singe','souris']
print(animaux[::2])
Finalement, on voit que l’accès au contenu d’une liste avec des crochets fonctionne sur le modèle
liste[début : fin : pas].
Dans cet exemple, chaque sous-liste contient une catégorie d’animal et le nombre d’animaux pour chaque
catégorie. Pour accéder à un élément de la sous-liste, on utilise un double indiçage.
print(zoo[1]) #['tigre', 2]
print(zoo[1][0]) #'tigre'
print(zoo[1][1]) #2
On verra un peu plus loin qu’il existe en Python les dictionnaires qui sont très pratiques pour faire ce
genre de choses. On verra aussi qu’il existe un module nommé Numpy permettant de gérer des listes ou
tableaux de nombres (vecteurs et matrices), ainsi que de faire des opérations dessus.
Les listes et les Tuples fonctionnent en harmonies avec les structures de contrôle if/else et For
If 'Paris' in villes:
print('oui')
else:
print('non')
La fonction enumerate est très utile pour sortir à la fois les éléments d'une liste et leurs index. C'est une
fonction très utilisée en data-science :
for index, element in enumerate(villes):
print(index, element)
La fonction zip est aussi très utile pour itérée à travers 2 listes en parallèles. Si une liste est plus courte
que l'autre, la boucle for s'arrête a la liste la plus courte :
villes = ['Paris', 'Berlin', 'Londres', 'Bruxelles'] # liste initiale
liste_2 = [312, 52, 654, 23, 65, 12, 678]
for element_1, element_2 inzip(villes, liste_2):
print(element_1, element_2)
III.2. Tuples
Une liste ou un Tuple peuvent contenir tous types de valeurs (int, float, bool, string). On dit que ce sont
des structures hétérogenèses. La différence entre les 2 est qu'une liste est mutable alors qu'un Tuple ne
l'est pas (on ne peut pas le changer après qu'il soit crée)
#Tuples
tuple_1 = (1, 2, 6, 2)
print(tuple_1)
tuple_villes = ('Paris', 'Berlin', 'Londres', 'Bruxelles') # Tuple initiale
print(tuple_ villes)
Note : toutes les opérations, l’indexing, le Slicing et les actions possibles sur les listes sont également
possible sur les Tuples avec les mêmes syntaxes à l’exception de celles qui pourraient modifier le Tuple.
Car il ne faut pas oublier qu’un Tuple ne peux pas être modifié âpres sa déclaration, toutefois il est plus
raide en temps d’exécution qu’une liste pour de grande quantité de données.
III.3. Dictionnaires
Les dictionnaires sont des structures de contrôle non-ordonnées, c'est-a-dire que les valeurs qu'ils
contiennent ne sont pas rangées selon un index, mais suivant une clef unique.
Une utilisation parfaite des dictionnaires est pour regrouper ensemble des "variables" dans un même
conteneur (Ces variables ne sont pas de vraies variables, mais des keys).
On peut par exemple crée un dictionnaire inventaire qui regroupe plusieurs produits (les clefs) et leur
quantités (les valeurs)
inventaire = {'pommes': 100,
'bananes': 80,
'poires': 120}
print(inventaire.values())
print(inventaire.keys())
print(len(inventaire)) #nombre d'enregistrement dans le dictionnaire
Voici comment ajouter une association key/value dans notre dictionnaire (attention si la clef existe déjà
elle est remplacée)
inventaire['abricots'] = 30
print(inventaire)
Attention : si vous cherchez une clef qui n'existe pas dans un dictionnaire, python vous retourne une
erreur. Pour éviter cela, vous pouvez utiliser la méthode get()
print(inventaire.get('peches') ) # n'existe pas
print(inventaire.get('pommes')) # pomme existe
La méthode pop() permet de retirer une clef d'un dictionnaire tout en retournant la valeur associée a la
clef.
abricots = inventaire.pop("abricots")
print(inventaire) # ne contient plus de clef abricots
print(abricots) # abricots contient la valeur du dictionnaire
Pour utiliser une boucle for avec un dictionnaire, il est utile d'utiliser la méthode items() qui retourne à la
fois les clefs et les valeurs
for key, value in inventaire.items():
print(key, value)
'chien' : 'dog',
'chat' : "cat",
'souris' : 'mouse',
'oiseau' :'birth'
}
fruit = {
'banane' : 2000,
'pommes' : 2500,
'poires' : 1500
}
dictionnaire = {
'dict_1' : traduction,
'dict_2' : fruit
}
print(dictionnaire)
print(dictionnaire.items())
print(dictionnaire.keys())
print(dictionnaire.values())
Les dictionnaires peuvent être utilisés pour stocker les paramètres des réseaux de neurone au fur et à
mesure qu’on entraine les modèles.
2. Modifier le programme de la question 1 pour donner nom pas une valeur, mais plutôt une liste de
valeur en paramètre. La fonction prendra donc en paramètre un classeur (dictionnaire) et une liste
de valeurs qui seront rangées selon leurs signes. Puis on affichera le classeur.
On peut rajouter des conditions if dans les listes compréhensions, par exemple :
liste = [i**2 for i in range(100000) if (i % 2) == 0] # calcule i**2 seulement pour les nombres pairs.
print(liste[:10]) #affiche les 10 premiers éléments de la liste
On peut aussi créer des Nested List ou listes dans une liste :
liste = [[i for i in range(3)] for j in range(4) ] #permet de répéter la liste générée par i, en fonction du range
de j
print(liste)
Dans ce cas, nous aurons une liste répétée 4 fois. On peut également s’amuser avec i et j
liste = [[i+j for i in range(3)] for j in range(4) ] #n peut s’amuser a modifier la valeur de i
print(liste)
On peut utiliser la fonction enumarate() pour parcourir la liste et range les données dans le dictionnaire
prenoms = ['Pierre', 'Jean', 'Julie','Sophie']
dico = {key : value for key, value in enumerate(prenoms)}
print(dico)
Si nous avons deux listes qui contiennent nos données on peut utiliser la fonction zip
ages = [10, 21, 32, 53]
dico_2 = {prenom : age for prenom, age in zip(prenoms, ages)}
print(dico_2)
Exercice : dictionnaire
Essayez-donc de créer un dictionnaire qui contienne des clefs de 1 à 20, avec comme valeur le carré de
chaque clef.
# SOLUTION
dictionnaire = {k : k**2 for k in range(1, 21)}
print(dictionnaire)