Files
percettroni_c/percettrone.h

94 lines
2.7 KiB
C

#include <stdlib.h>
#include <math.h>
double LRE = 0.2;
typedef struct {
double w1;
double w2;
double bias;
double lre;
} Percettrone;
// Inputs
int x[4][2] = {
{0, 0},
{0, 1},
{1, 0},
{1, 1},
};
// Dichiarazione dei metodi
Percettrone crea_percettrone();
double randomico();
double funzione_sigmoide(Percettrone, double, double);
void correggi_pesi(Percettrone*, double, double, double);
void stampa_layer_uno(Percettrone, double, int, int, double);
void stampa_layer_out(Percettrone, int, double, double, double);
void stampa_risultati_layer_singolo(Percettrone);
void stampa_risultati_layer_multi(Percettrone, Percettrone, Percettrone);
Percettrone crea_percettrone() {
Percettrone percettrone;
percettrone.w1 = randomico();
percettrone.w2 = randomico();
percettrone.bias = randomico();
percettrone.lre = LRE;
return percettrone;
}
double randomico() {
// Genero numeri nell'intervallo [-1,1]
return ((double)(rand() % 101 * 0.01 * 2 ) -1);
}
double funzione_sigmoide(Percettrone p, double x1, double x2) {
double funzione = (x1 * p.w1) + (x2 * p.w2) + p.bias;
double potenza_e = exp(-funzione);
double risultato = 1 / ( 1 + potenza_e);
return risultato;
}
void correggi_pesi(Percettrone *p, double grad_w1, double grad_w2, double grad_bias) {
(*p).bias = (*p).bias - (grad_bias * (*p).lre);
(*p).w1 = (*p).w1 - (grad_w1 * (*p).lre);
(*p).w2 = (*p).w2 - (grad_w2 * (*p).lre);
}
void stampa_layer_uno(Percettrone p, double y, int x1, int x2, double errore)
{
printf("\n");
printf("\tW1: %f\n", p.w1);
printf("X1: %d --------> \n", x1);
printf("\t\t( bias: %f ) -------> Y: %f, errore: %f\n", p.bias, y, errore);
printf("X2: %d --------> \n", x2);
printf("\tW2: %f\n", p.w2);
printf("\n\n");
}
void stampa_layer_out(Percettrone p, int y, double x1, double x2, double errore) {
printf("\t\t\t\t\t\tW1: %f\n", p.w1);
printf("\t\t\t\t\tX1: %f --------> \n", x1);
printf("\t\t\t\t\t\t\t( bias: %f ) -------> Y: %d, errore: %f\n", p.bias, y, errore);
printf("\t\t\t\t\tX2: %f --------> \n", x2);
printf("\t\t\t\t\t\tW2: %f\n", p.w2);
}
void stampa_risultati_layer_singolo(Percettrone p) {
printf("\nPercettrone:\n");
printf("\t W1: %f, W2: %f, bias: %f\n", p.w1, p.w2, p.bias);
}
void stampa_risultati_layer_multi(Percettrone p1, Percettrone p2, Percettrone pout) {
printf("\nPercettrone 1:\n");
printf("\t W1: %f, W2: %f, bias: %f\n", p1.w1, p1.w2, p1.bias);
printf("Percettrone 2:\n");
printf("\t W1: %f, W2: %f, bias: %f\n", p2.w1, p2.w2, p2.bias);
printf("Percettrone OUT:\n");
printf("\t W1: %f, W2: %f, bias: %f\n", pout.w1, pout.w2, pout.bias);
}