Witam
Napisałem działający neuron problem jest taki że nie do końca jestem pewny o poprawność wzorów.
Niby działa ale nie jestem przekonany do : "NeuronTools.derivative(get_output(inputs))", to wygląda jakbym przepuścił funkcje dwa razy, próbowałem zmieniać i przestaję działać, więc nie wiem o co za bardzo chodzi. Tam gdzie liczę pochodną funkcji powinienem podać sumę neuronu, a podaje odpowiedź neuronu przepuszczaną przez funkcje sigmoidalną która następnie jest znowu zmieniana na funkcje sigmoidalną.
class Perceptron {
private Random random;
private double RATE_LERANING;
private double weights[];
private double bias;
public Perceptron(int counts_inputs, double RATE_LERANING) {
random = new Random();
this.RATE_LERANING = RATE_LERANING;
weights = new double[counts_inputs];
for(int i = 0; i < counts_inputs; i++) {
weights[i] = random.nextDouble();
}
bias = random.nextDouble();
}
public double get_output(double... inputs) {
double e = 0;
for(int i = 0; i < inputs.length; i++) {
e += weights[i] * inputs[i];
}
e += bias;
return NeuronTools.sigmoid(e);
}
public void train(double yTheata, double... inputs) {
double error = yTheata - get_output(inputs);
for(int i = 0; i < weights.length; i++) {
weights[i] += RATE_LERANING * error * NeuronTools.derivative(get_output(inputs)) * inputs[i];
}
bias += RATE_LERANING * error * NeuronTools.derivative(get_output(inputs)) * 1;
}
public double[] getWeights() {return weights;}
}
class NeuronTools {
public static double sigmoid(double x) {
return 1d / (1 + Math.exp(-x));
}
public static double derivative(double x) {
return (Math.exp(-x))/(Math.pow(1+Math.exp(-x),2));
}
}