dinak Δημοσ. 25 Ιανουαρίου 2012 Δημοσ. 25 Ιανουαρίου 2012 μπορεί κάποιος να με βοηθήσει στο τι λάθος κάνω για την εκπαίδευση του παρακάτω 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"); }
migf1 Δημοσ. 26 Ιανουαρίου 2012 Δημοσ. 26 Ιανουαρίου 2012 Δεν κοίταξα τον αλγόριθμο, είδα όμως ότι κάνεις συνεχώς συγκρίσεις ισότητας μεταξύ float αριθμών, κάτι που είναι NO-NO-SITUATION (όχι μόνο στη C, αλλά γενικώς). Ρίξε μια ματιά σε αυτό το κατατοπιστικότατο άρθρο: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm (ελπίζω να είναι καλά τα Αγγλικά σου) και κατόπιν διάλεξε κάποια από τις προτάσεις που περιέχει για να διορθώσεις τον κώδικά σου. Είναι πολύ πιθανό το πρόβλημά σου να οφείλεται σε αυτό. Αλλά και αλλού να οφείλεται, το συγκεκριμένο πρέπει να το διορθώσεις έτσι κι αλλιώς.
dinak Δημοσ. 26 Ιανουαρίου 2012 Μέλος Δημοσ. 26 Ιανουαρίου 2012 Δεν κοίταξα τον αλγόριθμο, είδα όμως ότι κάνεις συνεχώς συγκρίσεις ισότητας μεταξύ float αριθμών, κάτι που είναι NO-NO-SITUATION (όχι μόνο στη C, αλλά γενικώς). Ρίξε μια ματιά σε αυτό το κατατοπιστικότατο άρθρο: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm (ελπίζω να είναι καλά τα Αγγλικά σου) και κατόπιν διάλεξε κάποια από τις προτάσεις που περιέχει για να διορθώσεις τον κώδικά σου. Είναι πολύ πιθανό το πρόβλημά σου να οφείλεται σε αυτό. Αλλά και αλλού να οφείλεται, το συγκεκριμένο πρέπει να το διορθώσεις έτσι κι αλλιώς. δεν είναι σχέσεις ισότητας για να έχω τέτοιο πρόβλημα...άσε που είναι και σημεία στο επίπεδο που και πάλι με κάνουν να μην έχω πρόβλημα
migf1 Δημοσ. 26 Ιανουαρίου 2012 Δημοσ. 26 Ιανουαρίου 2012 δεν είναι σχέσεις ισότητας για να έχω τέτοιο πρόβλημα...άσε που είναι και σημεία στο επίπεδο που και πάλι με κάνουν να μην έχω πρόβλημα > ... if(sum>=0) ... if(a>=0) ... for (k= -3; k <= 3; k+=1) ... for (j = -3; j <= 3; j +=1) ... Τα παραπάνω είναι από τον κώδικά σου, και είναι όλα σχέσεις ισότητας μεταξύ float αριθμών.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα