/* --------------------------------------------------------------------------------------- */ int train(char *filename){ double train_error,valid_error,test_error; FILE *salida,*fpredic; N_TOTAL=PR; /* si hay validacion */ for(k=0;k<PTOT;k++) seq[k]=k; /* inicializacion del indice de acceso a los datos */ /*efectuar shuffle inicial de los datos de entrenamiento si SEED != -1 (y hay validacion)*/ if(SEED>-1 && N_TOTAL<PTOT){ srand((unsigned)SEED); shuffle(PTOT); } /*calcular error de entrenamiento*/ train_error=propagar(data,0,PR,1); /*calcular error de validacion; si no hay, usar mse_train*/ if(PR==PTOT) valid_error=train_error; else valid_error=propagar(data,PR,PTOT,1); /*calcular error de test (si hay)*/ if (PTEST>0) test_error =propagar(test,0,PTEST,0); else test_error =0.; /*mostrar errores*/ printf("\nFin del entrenamiento.\n\n"); printf("Errores:\nEntrenamiento:%f%%\n",train_error*100.); printf("Validacion:%f%%\nTest:%f%%\n",valid_error*100.,test_error*100.); if(CONTROL) fflush(NULL); /* archivo de predicciones */ sprintf(filepat,"%s.predic",filename); fpredic=fopen(filepat,"w"); error=(fpredic==NULL); if(error){ printf("Error al abrir archivo para guardar predicciones\n"); return 1; } for(k=0; k < PTEST ; k++){ for( i = 0 ;i< N_IN;i++) fprintf(fpredic,"%f\t",test[k][i]); fprintf(fpredic,"%d\n",pred[k]); } fclose(fpredic); return 0; }
/* ---------------------------------------------------------------------------- train: Ajusta los parametros del algoritmo a los datos de entrenamiento. Guarda los parametros en un archivo de control. Calcula porcentaje de error en ajuste y test. ----------------------------------------------------------------------------- */ int train(char *filename){ int feature,clase,k,i; double sigma,me; double train_error,valid_error,test_error; FILE *salida,*fpredic; int bin; double v; int size_vdata = (int)(0.2 * (double)PTOT); int K_MAX = 100; int K_BEST; double min_valid_error = 100.0; /*Asigno todos los patrones del .data como entrenamiento porque este metodo no requiere validacion*/ /* N_TOTAL=PTOT; --> si no hay validacion*/ N_TOTAL=PTOT; for(k=0;k<PTOT;k++) seq[k]=k; /* inicializacion del indice de acceso a los datos */ /*efectuar shuffle inicial de los datos de entrenamiento si SEED != -1 */ if(SEED>-1){ //printf("\nHaciendo shuffle"); srand((unsigned)SEED); shuffle(PTOT); } /* Hay que validar cuando N_K == 0 */ if (N_K == 0) { /* Buscar el N_K que produzca el menor error de validacion. Entreno con el 80% de los datos en .data y valido usando el 20% restante. */ printf("\nValidando..."); printf("\nCantidad de patrones de entrenamiento: %d",PTOT-size_vdata ); printf("\nCantidad de patrones de validacion: %d\n",size_vdata); for(i = 1; i <= K_MAX; i++) { N_K = i; /*calcular error de entrenamiento*/ train_error=propagar(data,0,PTOT-size_vdata,1); /*calcular error de validacion */ valid_error=propagar(data,PTOT-size_vdata,PTOT,1); //printf("Validacion:%f%% ,K:%d\n",valid_error*100.,i); /* Guardo el mínimo error de validación junto con el K que lo produjo */ if (valid_error < min_valid_error && valid_error != 0.0) { K_BEST = i; min_valid_error = valid_error; } /* Interrumpo el proceso de validación en caso de que el error aumente cosiderablemente */ if (100*(valid_error - min_valid_error) >= 20.0) { printf("Se interrumpio la validación por el aumento del error en un 20%% sobre el mínimo encontrado.\n"); break; } } N_K = K_BEST; printf("Como no se especificó K, a través de validacion se eligió: K=%d",K_BEST); } /*calcular error de entrenamiento*/ train_error=propagar(data,0,PTOT,1); /*calcular error de test (si hay)*/ if (PTEST>0) test_error =propagar(test,0,PTEST,0); else test_error =0.; /*mostrar errores*/ printf("\nFin del entrenamiento.\n\n"); printf("Errores:\nEntrenamiento:%f%%\n",train_error*100.); if(min_valid_error != 100.0) printf("Validacion:%f%%\n",min_valid_error*100.); else printf("Validacion: No se realizó.\n"); printf("Test:%f%%\n",test_error*100.); if(CONTROL) fflush(NULL); /* archivo de predicciones */ sprintf(filepat,"%s.predic",filename); fpredic=fopen(filepat,"w"); error=(fpredic==NULL); if(error){ printf("Error al abrir archivo para guardar predicciones\n"); return 1; } for(k=0; k < PTEST ; k++){ for( i = 0 ;i< N_IN;i++) fprintf(fpredic,"%f\t",test[k][i]); fprintf(fpredic,"%d\n",pred[k]); } fclose(fpredic); return 0; }