示例#1
0
/* --------------------------------------------------------------------------------------- */
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;
}
示例#2
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;

}