Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <LCDKeypad.h>
- //// VARIABILI
- const int NX=1; //NUMERO INGRESSI
- const int NH=4; //NUMERO NEURONI STATO CENTRALE
- const int NY=1; //NUMERO USCITE
- const int M=17; //NUMERO DI CAMPIONI D'INGRESSO (INPUT DATA SET)
- double H[NH]; //VETTORE USCITE NEURONI
- double Y[NY]; //VETTORE USCITE
- long double A=0; //E^A "attivazione interna"
- double X[NX]; //VETTORE VARIABILI INGRESSI
- //matrici random:
- int RM0[NX][NH];
- int RM1[NH][NY];
- void setup (){
- Random_Matrix_0(NX,NH);
- Random_Matrix_1(NX,NH);
- }
- void loop(){
- double Xi[]={0.0000,0.0625,0.1250,0.1875,0.2500,0.3125,0.3750,0.4375,0.5000,0.5625,0.6250,0.6875,0.7500,0.8125,0.8750,0.9375,1.0000};
- for(int l=0; l<16; l++){ //scorre il vettore d'ingresso
- Xi[l]=Xi[l+1];
- neural(1,4,1,Xi[l]);
- }
- }
- void neural(int NX, int NH, int NY,int Zeta )
- {
- //DEFINE VARIABLES
- double wh[NH][NX+1]; //PESI
- double wy[NY][NH+1]; //VETTORE DELLE USCITE DEI PESI DELLE USCITE DELL'IESIMO STRATO
- int i,j,k=0;//INDICI
- //CALCULATE THE LAYER H
- for (k=1; k<=NH; k++){
- for (i=1; i<=NX;i++){
- A=A+(wh[k][i]*X[i]); //CALCULATE THE INTERNAL ACTIVATION FUNCTION A, that is the sum wighted of all the input signals
- A=A+wh[k][NX+1];
- H[k]=1.0/(1.0+exp(-A)); //function of weight of the singolar layer
- }}
- //CALCULATE THE LAYER Y //same thing but for the next layer(Y)
- for (j=1; j<=NY; j++){
- A=0; //initzialize to zero
- for(k=1; k<=NH; k++){
- A += (wy[j][k]*H[k]);
- A += wy[j][NH+1];
- Y[j]=1.0/(1.0+exp(-A));
- }}
- //OPTIONAL STRUCTURE FOR LEARNING
- const double DELTA=0.3; //speed learning
- long double Err=0; //error variable (set point-real output)
- double D [NY]; //set point output desired
- double DeltaY [NY]; //Backpropagation Y
- double DeltaH [NH]; // Backpropagation H
- //BACK PROPAGATION
- //Calcolo errore strato Y
- for (j=1; j<=NY; j++) {
- Err=D[j]-Y[j];
- DeltaY[j]=Err*Y[j]*(1-Y[j]);
- }
- //Calcolo errore strato H
- for (k=1; k<=NH; k++){
- Err=0;
- for (j=1; j<=NY; j++) {
- Err=Err+(DeltaY[j]*wy[j][k]);
- DeltaH[k]=Err*H[k]*(1-H[k]);
- }}
- //Modifica pesi strato Y
- for (j=1; j<=NY; j++){
- for (k=1; k<=NH; k++){
- wy[j][k]=wy[j][k]+(DELTA*DeltaY[j]*H[k]);
- wy[j][NH+1]=wy[j][NH+1]+(DELTA*DeltaY[j]);
- }}
- //Modifica pesi strato H
- for (k=1; k<=NH; k++){
- for (i=1; i<=NX; i++){
- wh[k][i]=wh[k][i]+(DELTA*DeltaH[k]*X[i]);
- wh[k][NX+1]=wh[k][NX+1]+(DELTA*DeltaH[k]);
- }}
- //implicitamente restituisce NY
- }
- void Random_Matrix_0(int A,int B){
- for (int a=1; a<=A;a++){
- for (int b=1; b<=B; b++){
- int rand =(double) random(0, 1000);
- RM0[a][b]= (rand/500)-1;
- }}
- }
- void Random_Matrix_1(int A,int B){
- for (int a=1; a<=A;a++){
- for (int b=1; b<=B; b++){
- int rand =(double) random(0, 1000);
- RM1[a][b]= (rand/500)-1;
- }}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement