/// <summary> /// Calculate the derivatives for this training set element. /// </summary> /// /// <param name="pair">The training set element.</param> /// <returns>The sum squared of errors.</returns> private double CalculateDerivatives(IMLDataPair pair) { // error values double e = 0.0d; double sum = 0.0d; _network.Compute(pair.Input); int fromLayer = _network.LayerCount - 2; int toLayer = _network.LayerCount - 1; int fromNeuronCount = _network.GetLayerTotalNeuronCount(fromLayer); int toNeuronCount = _network.GetLayerNeuronCount(toLayer); double output = _network.Structure.Flat.LayerOutput[0]; e = pair.Ideal[0] - output; for (int i = 0; i < fromNeuronCount; i++) { double lastOutput = _network.GetLayerOutput(fromLayer, i); _jacobian[_jacobianRow][_jacobianCol++] = CalcDerivative( _network.GetActivation(toLayer), output) * lastOutput; } while (fromLayer > 0) { fromLayer--; toLayer--; fromNeuronCount = _network.GetLayerTotalNeuronCount(fromLayer); toNeuronCount = _network.GetLayerNeuronCount(toLayer); // this.network.getLayerOutput(fromLayer, neuronNumber) holder.getResult().get(lastSynapse); // for each neuron in the input layer for (int neuron = 0; neuron < toNeuronCount; neuron++) { output = _network.GetLayerOutput(toLayer, neuron); IActivationFunction function = _network.GetActivation(toLayer); double w = _network.GetWeight(toLayer, neuron, 0); double val = CalcDerivative(function, output) * CalcDerivative2(function, sum) * w; // for each weight of the input neuron for (int i = 0; i < fromNeuronCount; i++) { sum = 0.0d; // for each neuron in the next layer for (int j = 0; j < toNeuronCount; j++) { // for each weight of the next neuron for (int k = 0; k < fromNeuronCount; k++) { sum += _network.GetWeight(fromLayer, k, j) * output; } } _jacobian[_jacobianRow][_jacobianCol++] = val * _network.GetLayerOutput(fromLayer, i); } } } // return error return(e); }