nsi:tds:ia:neurones
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:tds:ia:neurones [2022/04/21 14:00] – ↷ Page déplacée de nsi:terminales:neurones à nsi:tds:ia:neurones goupillwiki | nsi:tds:ia:neurones [2022/04/22 11:37] (Version actuelle) – [Module sklearn] goupillwiki | ||
|---|---|---|---|
| Ligne 9: | Ligne 9: | ||
| Prenons un **exemple**. | Prenons un **exemple**. | ||
| - | {{ :nsi:terminales:neuronne_1.svg |}} | + | {{ :nsi:tds:ia: |
| On étudie une population d' | On étudie une population d' | ||
| Ligne 31: | Ligne 31: | ||
| </ | </ | ||
| - | {{ :nsi:terminales:neuronne_2.svg |}} | + | {{ :nsi:tds:ia: |
| Nous souhaitons donc réaliser un automate qui, quand on lui présente un individu inconnu, décide de la catégorie de cet individu. Ce que l'on connaît de l' | Nous souhaitons donc réaliser un automate qui, quand on lui présente un individu inconnu, décide de la catégorie de cet individu. Ce que l'on connaît de l' | ||
| - | {{ :nsi:terminales:neuronne_3.svg |}} | + | {{ :nsi:tds:ia: |
| On peut chercher une droite séparant les deux nuages. Cette droit a une certaine équation cartésienne | On peut chercher une droite séparant les deux nuages. Cette droit a une certaine équation cartésienne | ||
| Ligne 51: | Ligne 51: | ||
| Ce qui donne la machine ci-dessous : | Ce qui donne la machine ci-dessous : | ||
| - | {{ :nsi:terminales:neuronne_4.svg |}} | + | {{ :nsi:tds:ia: |
| Il ne nous reste qu'à trouver les bonnes valeurs de $a$, $b$ et $c$. | Il ne nous reste qu'à trouver les bonnes valeurs de $a$, $b$ et $c$. | ||
| Ligne 59: | Ligne 59: | ||
| Dans le fichier {{ : | Dans le fichier {{ : | ||
| - | - En représentant | + | - Exécutez le programme ci-dessous pour afficher |
| - | - Compléter | + | - Déterminez |
| + | - Complétez | ||
| + | - Exécutez la fonction sur l' | ||
| <code python> | <code python> | ||
| - | # code à faire | + | import csv |
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | # extraction des données du fichier | ||
| + | def formatage(row): | ||
| + | return { | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | } | ||
| + | |||
| + | with open(' | ||
| + | reader = csv.DictReader(file, | ||
| + | data = [formatage(row) for row in reader] | ||
| + | |||
| + | def plot_sub_cloud(species, | ||
| + | """ | ||
| + | Trace le nuage des point d'une certaine espèce | ||
| + | color indique la couleur désirée | ||
| + | """ | ||
| + | x = [item[" | ||
| + | y = [item[" | ||
| + | if len(x) > 0: | ||
| + | plt.scatter(x, | ||
| + | |||
| + | plot_sub_cloud(' | ||
| + | plot_sub_cloud(' | ||
| + | plot_sub_cloud(' | ||
| + | plt.legend() | ||
| + | plt.show() | ||
| </ | </ | ||
| Ligne 82: | Ligne 113: | ||
| Dans le cadre de l' | Dans le cadre de l' | ||
| - | {{ :nsi:terminales:neuronne_5.svg |}} | + | {{ :nsi:tds:ia: |
| Nous avons dit qu'il s' | Nous avons dit qu'il s' | ||
| Ligne 92: | Ligne 123: | ||
| * une variation continue : par exemple 0,6 proche de la droite du côté point rouge... | * une variation continue : par exemple 0,6 proche de la droite du côté point rouge... | ||
| - | {{ :nsi:terminales:neuronne_6.svg |}} | + | {{ :nsi:tds:ia: |
| Sur cette figure on voit une notion de flou autour de la droite. Cette façon de faire est plus réaliste et va permettre de donner une importante au fait qu'un point est éloigné ou proche de la droite. | Sur cette figure on voit une notion de flou autour de la droite. Cette façon de faire est plus réaliste et va permettre de donner une importante au fait qu'un point est éloigné ou proche de la droite. | ||
| - | {{ :nsi:terminales:neuronne_7.svg |}} | + | {{ :nsi:tds:ia: |
| <WRAP tip> | <WRAP tip> | ||
| Ligne 130: | Ligne 161: | ||
| La méthode proposée est encore vague : nous devons définir comment on compare $s$ et $s_{attendu}$ et comment cette comparaison modifie les paramètres $a$, $b$ et $c$. | La méthode proposée est encore vague : nous devons définir comment on compare $s$ et $s_{attendu}$ et comment cette comparaison modifie les paramètres $a$, $b$ et $c$. | ||
| - | On commence par choisir une formule pour évaluer l' | + | On commence par choisir une formule pour évaluer l' |
| - | On dira $\mathcal{E} = \frac{1}{2}\sum_{individus} (s-s_{attendu})^2$. | + | $$\mathcal{E} = \frac{1}{2}\sum_{individus} (s-s_{attendu})^2$$ |
| <WRAP tip> | <WRAP tip> | ||
| Ligne 151: | Ligne 182: | ||
| On choisit de faire varier $a$ de la quantité | On choisit de faire varier $a$ de la quantité | ||
| - | $$da = -\lambda \cdot \sum_{individus}(s-s_{attendu})\cdot f'(h) \cdot x$$ | + | $$da = -\lambda \cdot \frac{d\mathcal{E}}{da} |
| où $\lambda$ est un paramètre qu'il faut ajuster en bricolant un peu -- part de savoir faire... -- et on peut choisir $\lambda = 0,1$ -- l' | où $\lambda$ est un paramètre qu'il faut ajuster en bricolant un peu -- part de savoir faire... -- et on peut choisir $\lambda = 0,1$ -- l' | ||
| Ligne 164: | Ligne 195: | ||
| ==== Exercice 2 ==== | ==== Exercice 2 ==== | ||
| - | Dans le fichier | + | Vous pouvez reprendre |
| - | * Écrivez une fonction '' | + | |
| - | | + | |
| - | | + | * '' |
| - | | + | * '' |
| + | - Écrivez une fonction '' | ||
| + | | ||
| + | | ||
| + | | ||
| * $g_a = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot x$ | * $g_a = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot x$ | ||
| * $g_b = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot y$ | * $g_b = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot y$ | ||
| * $g_c = \sum_{individus} (s-s_{attendu})\cdot f'(h)$ | * $g_c = \sum_{individus} (s-s_{attendu})\cdot f'(h)$ | ||
| - | | + | |
| $$(a,b,c) \leftarrow (a -\lambda\cdot g_a, b - \lambda \cdot g_b, c - \lambda\cdot g_c)$$ | $$(a,b,c) \leftarrow (a -\lambda\cdot g_a, b - \lambda \cdot g_b, c - \lambda\cdot g_c)$$ | ||
| Ligne 179: | Ligne 214: | ||
| On pourra utiliser une constante '' | On pourra utiliser une constante '' | ||
| - | Le fichier | + | Exécutez le calcul et vérifiez que le triplet $(a, b, c)$ obtenu est valide. |
| + | |||
| + | ==== Base d'apprentissage, | ||
| + | |||
| + | //On peut dire aussi entraînement pour apprentissage.// | ||
| + | |||
| + | Comme vous l'avez vu, il nous faut un fichier de données pour entraîner notre neurone. | ||
| + | |||
| + | On souhaite bien-sûr que notre neurone, une fois entraîné, ne fasse pas (ou très peu) d'erreurs sur les items de cette base. | ||
| + | |||
| + | Mais ça ne suffit pas : nous voulons que le neurone réponde juste pour des items qui n'étaient pas dans la base (sinon quel intérêt ?) | ||
| + | |||
| + | Pour vérifier que c'est bien le cas, on constitue une base de tests contenant d'autres individus, absents de la base d' | ||
| ===== Réseau ===== | ===== Réseau ===== | ||
| Ligne 185: | Ligne 232: | ||
| La machine étudiée est très limitée. On voit qu' | La machine étudiée est très limitée. On voit qu' | ||
| - | {{ :nsi:terminales:neuronne_8.svg |}} | + | {{ :nsi:tds:ia: |
| D' | D' | ||
| Ligne 193: | Ligne 240: | ||
| // | // | ||
| - | {{ :nsi:terminales:neuronne_9.svg |}} | + | {{ :nsi:tds:ia: |
| Les mathématiques nécessaires ne vont pas être beaucoup plus complexe. Il faudra, en fonction des erreurs constatées en sortie, modifier les réglages de chaque neurone en remontant de la sortie vers les entrées. On appelle cela la **rétro-propagation du gradient**. | Les mathématiques nécessaires ne vont pas être beaucoup plus complexe. Il faudra, en fonction des erreurs constatées en sortie, modifier les réglages de chaque neurone en remontant de la sortie vers les entrées. On appelle cela la **rétro-propagation du gradient**. | ||
| Ligne 227: | Ligne 274: | ||
| Ici '' | Ici '' | ||
| - | Le fichier | + | Voici un exemple que vous pouvez tester. |
| + | |||
| + | <code python> | ||
| + | import csv | ||
| + | from sklearn.linear_model import Perceptron | ||
| + | |||
| + | with open('iris.csv', encoding=' | ||
| + | reader = csv.DictReader(file, | ||
| + | X = [] # paires (petal_length, | ||
| + | Y = [] # étiquettes : 1 pour setosa, 0 sinon | ||
| + | for row in reader: | ||
| + | l = float(row [" | ||
| + | w = float(row [" | ||
| + | X.append((l, | ||
| + | if row[' | ||
| + | Y.append(1) | ||
| + | else: | ||
| + | Y.append(0) | ||
| + | |||
| + | # création du réseau | ||
| + | rn = Perceptron(tol=1e-3) | ||
| + | |||
| + | # apprentissage | ||
| + | rn.fit(X, Y) | ||
| + | |||
| + | # on peut voir ce que prédit notre réseau pour les fleurs du fichier | ||
| + | # on obtient une liste de 0 et de 1 correspondant aux espèces | ||
| + | # vous pouvez voir qu'il ne se trompe pas ! | ||
| + | print(rn.predict(X)) | ||
| + | </ | ||
| + | |||
| + | Si on veut étendre la prédiction aux virginica et versicolor, le résultat n'est pas bon. Pour mieux faire, on ajoute la prise en compte des sépales. De plus, on n'est pas obligés | ||
| + | |||
| + | <code python> | ||
| + | import csv | ||
| + | from sklearn.linear_model import Perceptron | ||
| + | |||
| + | with open(' | ||
| + | reader = csv.DictReader(file, | ||
| + | X = [] # paires (petal_length, | ||
| + | Y = [] # étiquettes : 1 pour setosa, 0 sinon | ||
| + | for row in reader: | ||
| + | pl = float(row [" | ||
| + | pw = float(row [" | ||
| + | sl = float(row[" | ||
| + | sw = float(row[" | ||
| + | X.append((pl, | ||
| + | Y.append(row[' | ||
| + | |||
| + | # création du réseau | ||
| + | rn = Perceptron(tol=1e-3) | ||
| + | |||
| + | # apprentissage | ||
| + | rn.fit(X, Y) | ||
| + | |||
| + | # on peut voir ce que prédit | ||
| + | # on obtient une liste de 0 et de 1 correspondant aux espèces | ||
| + | # vous pouvez voir qu'il ne se trompe pas ! | ||
| + | print(rn.predict(X)) | ||
| + | |||
| + | # et on peut faire un compte des succès : | ||
| + | Yp = rn.predict(X) | ||
| + | count = 0 | ||
| + | for i in range(len(Y)): | ||
| + | if Y[i] == Yp[i]: | ||
| + | count += 1 | ||
| + | print(count/ | ||
| + | </ | ||
| + | |||
| + | On obtient environ 95 % de succès ! | ||
| + | |||
| + | Le travail de formatage est un peu fastidieux. On gagne beaucoup de temps en utilisant Pandas. | ||
| + | |||
| + | <code python> | ||
| + | import pandas | ||
| + | from sklearn.linear_model import Perceptron | ||
| + | |||
| + | train = pandas.read_csv(" | ||
| + | rn = Perceptron(tol=1e-3) | ||
| + | X = train[[' | ||
| + | Y = train[' | ||
| + | rn.fit(X, Y) | ||
| + | print(rn.predict(X)) | ||
| + | </ | ||
| + | |||
| + | <WRAP important> | ||
| + | Dans cet exemple, j' | ||
| + | </ | ||
| + | |||
| + | ===== Exemples d' | ||
| + | |||
| + | Vous pouvez | ||
nsi/tds/ia/neurones.1650542448.txt.gz · Dernière modification : de goupillwiki
