Προς το περιεχόμενο

perceptron


Προτεινόμενες αναρτήσεις

Δημοσ.

μπορεί κάποιος να με βοηθήσει στο τι λάθος κάνω για την εκπαίδευση του παρακάτω perceptron? τα αποτελέσματα άλλοτε μου βγαίνουν σωστά και άλλοτε λάθος...θέλω η εκπαίδευση του να γίνεται με τυχαίους αριθμούς οι οποίοι διαχωρίζονται σε τεταρτημόρια.

 

>#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

struct input{
      
      float x1;
      float x2;
 
};



int check_output(float a, float b, float w1, float w2, float w0){
   
   float sum;
   
   sum = a * w1 + b * w2 + w0;
   
   if(sum>=0)
             return 1;
   else
       return -1;
}


int desired_output(float a, float {
   
  
   if(a>=0)
           
           return 1;
           
   else if(a<0)
       return -1;
}
   
   



main(){
      
      int d;
      int i;
      float k, j;
      struct input array[2000];
      float weight1, weight2, weight0;
      float n=0.1;
      float error=1;
      int output_y, output_d;
      

       srand(time(NULL));
      for(i=0;i<2000;i++){
                          array[i].x1=(2*((float)rand() / RAND_MAX)) - 1;
                          array[i].x2=(2*((float)rand() / RAND_MAX)) - 1;
                      
      }
      
      weight0 = (float)rand() / RAND_MAX;
      weight1 = (float)rand() / RAND_MAX;
      weight2 = (float)rand() / RAND_MAX;
      

       //  printf(" %f %f \n\n", weight1, weight2);
      

        while(error==1){
               error=0;
               
               for(i=0;i<2000;i++){
                                   
                                      //    printf(" x1: %f x2:%f \n\n", array[i].x1, array[i].x2);
                                          
                                   output_d = desired_output(array[i].x1, array[i].x2);
                               //    printf("d: %d\n", output_d);
                                   output_y = check_output(array[i].x1, array[i].x2, weight1, weight2, weight0);
                               //   printf("y: %d\n", output_y);
                                 
                                
                                 /*if(output_d!=output_y){
                                                          weight0 = weight0 + n * (output_d-output_y) * (-1)/2;
                                                          weight1 = weight1 + n * (output_d-output_y) * array[i].x1/2;
                                                          weight2 = weight2 + n * (output_d-output_y) * array[i].x2/2;
                                                          error=1;
                                 }*/
                                   
                                   if(output_y==1 && output_d==-1){
                                                         weight0 = weight0 + n * (output_d-output_y);
                                                         weight1 = (weight1 - (n * array[i].x1));
                                                         weight2 = (weight2 - (n * array[i].x2));
                                                         error=1;
                                             
                                   }
                                   
                                   else if(output_y==-1 && output_d==1){
                                                         weight0 = weight0 + n * (output_d-output_y);                                       
                                                         weight1 = (weight1 + (n * array[i].x1));
                                                         weight2 = (weight2 + (n * array[i].x2));   
                                                         error=1;
                                             
                                   }
                                   
                                  
                                 

               }
        }while(error==1);
        
        printf("%f %f\n", weight1, weight2);
        for (k= -3; k <= 3; k+=1)
           {
               for (j = -3; j <= 3; j +=1)
               {
                   // Calculate output.
                   output_y = check_output(k, j, weight1, weight2, weight0);
                   printf("%f %f %s\n", k, j, (output_y == 1) ? "c1" : "c2");
               }
           }
     
                          
                          
system("pause");
}

Δημοσ.

Δεν κοίταξα τον αλγόριθμο, είδα όμως ότι κάνεις συνεχώς συγκρίσεις ισότητας μεταξύ float αριθμών, κάτι που είναι NO-NO-SITUATION (όχι μόνο στη C, αλλά γενικώς).

 

Ρίξε μια ματιά σε αυτό το κατατοπιστικότατο άρθρο: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm (ελπίζω να είναι καλά τα Αγγλικά σου) και κατόπιν διάλεξε κάποια από τις προτάσεις που περιέχει για να διορθώσεις τον κώδικά σου.

 

Είναι πολύ πιθανό το πρόβλημά σου να οφείλεται σε αυτό. Αλλά και αλλού να οφείλεται, το συγκεκριμένο πρέπει να το διορθώσεις έτσι κι αλλιώς.

Δημοσ.

Δεν κοίταξα τον αλγόριθμο, είδα όμως ότι κάνεις συνεχώς συγκρίσεις ισότητας μεταξύ float αριθμών, κάτι που είναι NO-NO-SITUATION (όχι μόνο στη C, αλλά γενικώς).

 

Ρίξε μια ματιά σε αυτό το κατατοπιστικότατο άρθρο: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm (ελπίζω να είναι καλά τα Αγγλικά σου) και κατόπιν διάλεξε κάποια από τις προτάσεις που περιέχει για να διορθώσεις τον κώδικά σου.

 

Είναι πολύ πιθανό το πρόβλημά σου να οφείλεται σε αυτό. Αλλά και αλλού να οφείλεται, το συγκεκριμένο πρέπει να το διορθώσεις έτσι κι αλλιώς.

 

δεν είναι σχέσεις ισότητας για να έχω τέτοιο πρόβλημα...άσε που είναι και σημεία στο επίπεδο που και πάλι με κάνουν να μην έχω πρόβλημα

Δημοσ.

δεν είναι σχέσεις ισότητας για να έχω τέτοιο πρόβλημα...άσε που είναι και σημεία στο επίπεδο που και πάλι με κάνουν να μην έχω πρόβλημα

 

>
...
if(sum>=0)
...
if(a>=0)
...
for (k= -3; k <= 3; k+=1)
...
for (j = -3; j <= 3; j +=1)
...

Τα παραπάνω είναι από τον κώδικά σου, και είναι όλα σχέσεις ισότητας μεταξύ float αριθμών.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...