Künstliche Intelligenz mit Java
Maschinelles Lernen mit Neuronalen Netzwerken

public Neuron(int numberOfInputSignals, ArrayList<Neuron> nextNeurons) {
  this(numberOfInputSignals, nextNeurons, getRandomValue());
}

Die Anzahl der Gewichte ist um eins höher als die Anzahl der Eingangssignale.

In der Regel werden die Gewichte inkl. Bias-Wert zum Beginn des Trainings im Wertebereich zwischen -1 und 1 initialisiert.

public void setBias(double bias) {
  weights[weights.length - 1] = bias;
}

private void setRandomWeights() {
  for (int i = 0; i < weights.length - 1; i++)
    weights[i] = getRandomValue();
}

private static double getRandomValue() {
  Random random = new Random();
  return 2 * random.nextDouble() - 1;                // -1 < weight < +1
}

Während bzw. am Ende des Trainings können sie jedoch auch deutlich außerhalb dieses Bereichs liegen.

Jetzt muss die Summenbildung vorgesehen werden:

public double getOutput(double[] x, ActivationFunction activationFunction) {
  double output = 0;
  for (int i = 0; i < numberOfInputSignals; i++)
    output += x[i] * weights[i];
  output += 1 * weights[numberOfInputSignals];       // bias!
  // activation function
  return output;
}

Das Ergebnis der Summenbildung wird oft noch durch eine sogenannte Aktivierungsfunktion (z. B.: Sigmoid (s. Abbildung 14) oder Heaviside (s. Abbildung 15)) geleitet, bevor es entweder das Endresultat ist oder (falls vorhanden) an die Neuronen der nächsten Schicht weitergeleitet wird. Hierfür bedarf es zweier weiterer Klassen. Zum einen der Klasse mit den Namen der möglichen Aktivierungsfunktionen: 

public enum ActivationFunction {
  ONLYSUM, HEAVISIDE, SIGMOID
}


- 13 -