Tous les défis
Moyen 0 résolus 0 % de réussite

Algorithme d'apprentissage du perceptron

Entraînez le perceptron d'origine, qui ne met à jour ses poids que lorsqu'il se trompe.

Ce que vous allez apprendre

  • Ne mettre à jour les poids qu'en cas d'erreur
  • Entraîner sur plusieurs époques
  • Découvrir le fonctionnement du premier modèle neuronal

Problème

Le perceptron (1958) est le premier algorithme d'apprentissage pour un neurone artificiel. Il prédit avec une fonction en escalier et apprend de ses erreurs.

Partez de poids et d'un biais tous à 0. À chaque époque, parcourez les exemples dans l'ordre, et pour chaque exemple x d'étiquette y (0 ou 1) :

  1. prédiction = 1 si x · weights + bias > 0, sinon 0
  2. error = y - prédiction (donc -1, 0 ou 1)
  3. Si error ≠ 0 : weights[i] ← weights[i] + learning_rate × error × x[i] pour chaque i, et bias ← bias + learning_rate × error

Implémentez train_perceptron(samples, labels, learning_rate, epochs).

Entrée

samples : m exemples de n variables chacun.

labels : les m étiquettes, chacune 0 ou 1.

learning_rate, epochs : le pas et le nombre de passages sur les données.

Sortie

Renvoyez les poids finaux suivis du biais (n + 1 nombres).

Contraintes

1 ≤ m ≤ 100, 1 ≤ n ≤ 10, 1 ≤ epochs ≤ 100

0 < learning_rate ≤ 1

-10 ≤ chaque variable ≤ 10

Exemples

Exemple 1
Entrée :
epochs = 1
labels = [0, 0, 0, 1]
samples = [
    [0.0, 0.0],
    [0.0, 1.0],
    [1.0, 0.0],
    [1.0, 1.0]
]
learning_rate = 1.0

Sortie attendue :
expected = [1.0, 1.0, 1.0]
Entrée :
long long epochs = 1;
std::vector<long long> labels = {0, 0, 0, 1};
std::vector<std::vector<double>> samples = {
    {0.0, 0.0},
    {0.0, 1.0},
    {1.0, 0.0},
    {1.0, 1.0}
};
double learning_rate = 1.0;

Sortie attendue :
std::vector<double> expected = {1.0, 1.0, 1.0};
Entrée :
long epochs = 1;
long[] labels = new long[] {0, 0, 0, 1};
double[][] samples = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {0.0, 1.0},
    new double[] {1.0, 0.0},
    new double[] {1.0, 1.0}
};
double learning_rate = 1.0;

Sortie attendue :
double[] expected = new double[] {1.0, 1.0, 1.0};

Explication

[0, 0] : z = 0, prédit 0, correct. [0, 1] et [1, 0] : prédisent aussi 0, correct. [1, 1] : prédit 0 mais l'étiquette vaut 1, donc error = 1 : les poids deviennent [1, 1] et le biais 1. Résultat : [1, 1, 1].

Exemple 2
Entrée :
epochs = 10
labels = [0, 0, 0, 1]
samples = [
    [0.0, 0.0],
    [0.0, 1.0],
    [1.0, 0.0],
    [1.0, 1.0]
]
learning_rate = 1.0

Sortie attendue :
expected = [2.0, 1.0, -2.0]
Entrée :
long long epochs = 10;
std::vector<long long> labels = {0, 0, 0, 1};
std::vector<std::vector<double>> samples = {
    {0.0, 0.0},
    {0.0, 1.0},
    {1.0, 0.0},
    {1.0, 1.0}
};
double learning_rate = 1.0;

Sortie attendue :
std::vector<double> expected = {2.0, 1.0, -2.0};
Entrée :
long epochs = 10;
long[] labels = new long[] {0, 0, 0, 1};
double[][] samples = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {0.0, 1.0},
    new double[] {1.0, 0.0},
    new double[] {1.0, 1.0}
};
double learning_rate = 1.0;

Sortie attendue :
double[] expected = new double[] {2.0, 1.0, -2.0};

Explication

Après 10 époques, le perceptron a appris la porte ET : avec les poids [2, 1] et le biais -2, seul [1, 1] donne z > 0.

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.