Alle Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

Perzeptron-Lernalgorithmus

Trainiere das ursprüngliche Perzeptron, das seine Gewichte nur bei Fehlern anpasst.

Das lernst du

  • Gewichte nur bei Fehlern aktualisieren
  • Über mehrere Epochen trainieren
  • Erfahren, wie das erste neuronale Modell funktionierte

Problem

Das Perzeptron (1958) ist der erste Lernalgorithmus für ein künstliches Neuron. Es sagt mit einer Stufenfunktion voraus und lernt aus seinen Fehlern.

Beginne mit allen Gewichten und dem Bias bei 0. Gehe in jeder Epoche die Beispiele der Reihe nach durch, und für jedes Beispiel x mit Label y (0 oder 1):

  1. Vorhersage = 1, wenn x · weights + bias > 0, sonst 0
  2. error = y - Vorhersage (also -1, 0 oder 1)
  3. Wenn error ≠ 0: weights[i] ← weights[i] + learning_rate × error × x[i] für jedes i, und bias ← bias + learning_rate × error

Implementiere train_perceptron(samples, labels, learning_rate, epochs).

Eingabe

samples: m Beispiele mit je n Merkmalen.

labels: Die m Labels, jeweils 0 oder 1.

learning_rate, epochs: Die Schrittweite und die Anzahl der Durchläufe über die Daten.

Ausgabe

Gib die endgültigen Gewichte und danach den Bias zurück (n + 1 Zahlen).

Einschränkungen

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

0 < learning_rate ≤ 1

-10 ≤ jedes Merkmal ≤ 10

Beispiele

Beispiel 1
Eingabe:
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

Erwartete Ausgabe:
expected = [1.0, 1.0, 1.0]
Eingabe:
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;

Erwartete Ausgabe:
std::vector<double> expected = {1.0, 1.0, 1.0};
Eingabe:
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;

Erwartete Ausgabe:
double[] expected = new double[] {1.0, 1.0, 1.0};

Erläuterung

[0, 0]: z = 0, sagt 0 voraus, richtig. [0, 1] und [1, 0]: sagen ebenfalls 0 voraus, richtig. [1, 1]: sagt 0 voraus, aber das Label ist 1, also error = 1: Die Gewichte werden zu [1, 1] und der Bias zu 1. Ergebnis: [1, 1, 1].

Beispiel 2
Eingabe:
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

Erwartete Ausgabe:
expected = [2.0, 1.0, -2.0]
Eingabe:
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;

Erwartete Ausgabe:
std::vector<double> expected = {2.0, 1.0, -2.0};
Eingabe:
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;

Erwartete Ausgabe:
double[] expected = new double[] {2.0, 1.0, -2.0};

Erläuterung

Nach 10 Epochen hat das Perzeptron das UND-Gatter gelernt: Mit den Gewichten [2, 1] und dem Bias -2 ergibt nur [1, 1] ein z > 0.

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.