Ejemplo n.º 1
0
BOOL Update_def_Settings( def_Settings * defsetting )
{
	char buf[LENGTH] ;
	char msg[20] ;
	BOOL batchgoon = TRUE ;
	char * pstr ;
	unsigned int sz = 0 ;	
	unsigned int serialno = 0 ;
	
	if (NULL == defsetting)
		return FALSE ;
        defsetting->time = 0 ;
	if ( FALSE == Is_Data_Empty(&defsetting->pairs) )
	{
		// create next input file name	
		pstr = strrchr( defsetting->inputfile, '.') ;	// 46
		if ( NULL != pstr )
			sz = abs( pstr - defsetting->inputfile ) ;		
		else
		{
			sz = strlen(defsetting->inputfile) ;
			return FALSE ;
		}
		strcpy (buf, pstr+1) ;
		serialno = atoi(buf) ;
		serialno += 1 ;
		strncpy( buf, defsetting->inputfile , sz ) ;
		buf[sz] = '\0' ;
		strcat( buf, "." ) ;
		// add appendix
		sprintf(msg,"%d",serialno) ;
		strcat( buf, msg ) ;
		// save inputfile name in def_Settings
		if ( NULL != defsetting->inputfile )
		{
			free( (void*) defsetting->inputfile ) ;
			defsetting->inputfile = NULL ;						
		}		
		if ( NULL == ( defsetting->inputfile = strdup(buf) ) )
			batchgoon = FALSE ;

		// create next test file name
		pstr = strrchr( defsetting->testfile, '.') ;	// 46
		if ( NULL != pstr )
			sz = abs( pstr - defsetting->testfile ) ;		
		else
			sz = strlen(defsetting->testfile) ;
		strcpy (buf, pstr+1) ;
		serialno = atoi(buf) ;
		serialno += 1 ;
		strncpy( buf, defsetting->testfile , sz ) ;
		buf[sz] = '\0' ;
		strcat( buf, "." ) ;
		// add appendix		
		sprintf(msg,"%d",serialno) ;
		strcat( buf, msg ) ;
		// save testfile name in def_Settings
		if ( NULL != defsetting->testfile )
		{
			free( (void*) defsetting->testfile ) ;
			defsetting->testfile = NULL ;						
		}		
		if ( NULL == ( defsetting->testfile = strdup(buf) ) )
			batchgoon = FALSE ;
		// load data into pairs 
		if ( FALSE == smo_Loadfile(&(defsetting->pairs), defsetting->inputfile, 0) )
			batchgoon = FALSE ;
	}
	else
	{
		// load data into pairs 
		if ( FALSE == smo_Loadfile(&(defsetting->pairs), defsetting->inputfile, 0) )
		{	
			batchgoon = FALSE ;
			printf("Failed to load training data from the file %s\n", defsetting->inputfile) ;
		}
#ifdef _PROSTATE_VIVO
		else if (defsetting->pairs.count!=100||defsetting->pairs.dimen!=6117||CLASSIFICATION!=defsetting->pairs.datatype)
		{	
			batchgoon = FALSE ;
			printf("The file %s is not ProstateABreast.VIVO.\n", defsetting->inputfile) ;
		}
#endif
	}	

	defsetting->cache_size = DEF_CACHE ;	
	defsetting->time = 0 ;

	defsetting->lnC_step = defsetting->def_lnC_step ;
	defsetting->lnK_step =  defsetting->def_lnK_step;
	defsetting->lnC_start = defsetting->def_lnC_start ;
	defsetting->lnK_start = defsetting->def_lnK_start ;
	defsetting->lnC_end = defsetting->def_lnC_end ;
	defsetting->lnK_end = defsetting->def_lnK_end ;

	// load data into pairs 
	// load testing data into pairs
	//if (batchgoon == TRUE)
	//	if ( FALSE == smo_Loadfile(&(defsetting->testdata), defsetting->testfile, defsetting->pairs.dimen) )
	//		printf ("Failed to load testing data from the file %s", defsetting->testfile ) ;	
	
	return batchgoon ;	
}
Ejemplo n.º 2
0
int main( int argc, char * argv[])
{
	def_Settings * defsetting = NULL ;
	smo_Settings * smosetting = NULL ;
	kcv_Settings * kcvsetting ;
	//Data_Node * node ;
	char buf[LENGTH] ;
	unsigned int sz = 0;
	unsigned int index = 0 ;
	double parameter = 0 ;
	//double * guess ;
	FILE * log ; 
	printf("\nSupport Vector Ordinal Regression Using K-fold Cross Validation v2.%d \n--- Chu Wei Copyright(C) 2003-2004\n\n", VERSION) ;
	if ( 1 == argc || NULL == (defsetting = Create_def_Settings(argv[--argc])) )
	{
		// display help	
		printf("\nUsage:  svor [-v] [...] [-R r] file \n\n") ;
		printf("  file   specifies the file containing training samples.\n") ;
		printf("  -v     activates the verbose mode to display message.\n") ;
		printf("  -F  k  k-fold is used in cross validation (default 5 folds).\n") ;
		printf("  -Cs s  set searching step of C at s in log10 scale (default 0.5).\n") ;
		printf("  -Cc c  start searching C at c (default 0.1).\n") ;		
		printf("  -Ce e  stop searching C at e (default  100).\n") ;
		printf("  -Ks s  set searching step of K at s in log10 scale (default 0.5).\n") ;
		printf("  -Kc c  start searching K at c (default 0.01).\n") ;		
		printf("  -Ke e  stop searching K at e (default 10).\n") ;	
		//printf("  -L     use imbalanced Linear kernel (default Gaussian kernel).\n") ;
		printf("  -P  p  use Polynomial kernel with order p (default Gaussian kernel).\n") ;
		//printf("  -B     force regularizers Balanced for classification only.\n") ;
		//printf("  -E  e  set Epsilon at e for regression only (default 0.1).\n") ;
		printf("  -Z  z  set the times of Zooming at z (default 2).\n") ;			
		printf("  -i     normalize the training inputs.\n") ;		
		//printf("  -o     normalize the training targets.\n") ;		
		printf("  -a     activates loading weighted kernels.\n") ;
		printf("  -S  s  set the Seed of random number generator at s (default random).\n") ;
		printf("  -R  r  set the Rehearsal times of fold generation at r (default 1).\n") ;
		printf("  -T  t  set Tolerance at t (default 0.001).\n") ;
		printf("new option:\n") ;
		printf("  -Z  0  set the zooming at 0 to skip cross-validation.\n") ;			
		printf("  -Ko o  fix K at o manually (default 1).\n") ;			
		printf("  -Co o  fix C at o manually (default  1).\n") ;			
		printf("\n") ;
		if (NULL !=defsetting)
			Clear_def_Settings( defsetting ) ;
		return 0;
	}
	else
	{
		if (argc>1)
			printf("Options:\n") ;
		do
		{
			strcpy(buf, argv[--argc]) ;
			sz = strlen(buf) ;
			//printf ("%s  %d\n", buf, sz) ;
			if ( '-' == buf[0] )
			{				
				for (index = 1 ; index < sz ; index++)
				{
					switch (buf[index])
					{
					case 'v' :
						printf("  - Verbose mode in display.\n") ;
						defsetting->smo_display = TRUE ;
						break ;	
					case 'a' :
						printf("  - kernels with Ard parameters.\n") ;
						defsetting->ardon = TRUE ;	
						break ;
					case 'o' :
						printf("  - normalize the Outputs in training data.\n") ;
						defsetting->normalized_output = TRUE ;	
						defsetting->pairs.normalized_output = TRUE ;
						break ;
					case 'i' :
						printf("  - normalize the Inputs in training data.\n") ;
						defsetting->normalized_input = TRUE ;	
						defsetting->pairs.normalized_input = TRUE ;
						break ;
					case 'S' :
						if (parameter>0)
						{
							printf("  - specify %.0f as the seed of random number.\n", parameter) ;
							defsetting->seeds = (unsigned int)parameter ;
						}
						break ;
					case 'F' :
						if (parameter>1)
						{
							printf("  - %.0f-fold cross validation.\n", parameter) ;
							defsetting->kfold = (unsigned int)parameter ;
						}
						break ;
					case 'Z' :
						if (parameter>=0)
						{
							printf("  - Zoom in scale %.0f.\n", parameter) ;
							defsetting->loops = (unsigned int)parameter ;
						}
						break ;
					case 'R' :
						if (parameter>=1)
						{
							printf("  - Rehearsal %.0f times.\n", parameter) ;
							defsetting->repeat = (unsigned int)parameter ;
						}
						break ;
					case 'L' :
						printf("  - choose Linear kernel.\n") ;
						defsetting->kernel = LINEAR ;						
						break ;
					case 'B' :
						printf("  - set regularization factors balanced.\n") ;
						defsetting->smo_balance = TRUE ;
						break ;
					case 'T' :
						if (parameter>0)
						{
							printf("  - set Tol as %.6f.\n", parameter) ;
							defsetting->tol = parameter ;
						}
						break ;
					case 'C' :
						if (parameter > 0)
						{ 
							if (index + 1 == sz && parameter != DEF_COARSESTEP )
							{
								printf("  - C is invalid.\n") ;
								parameter = 0;
							}
							else if (index+1==sz-1)
							{
								index+=1;
								switch (buf[index])
								{									
								case 's' :
									defsetting->def_lnC_step = parameter ;
									printf("  - initialize lnC_step at the value %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'c' :
									defsetting->def_lnC_start = log10(parameter) ;
									printf("  - C start at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'e' :
									defsetting->def_lnC_end = log10(parameter) ;
									printf("  - C end at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'o' :
									defsetting->vc = (parameter) ;
									printf("  - C at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								default :
									printf("  - C%c is invalid.\n", buf[index]) ;
									break ;
								}
							}							
						}
						break ;						
					case 'K' :
						if (parameter > 0)
						{ 
							if (index + 1 == sz && parameter != DEF_COARSESTEP )
							{
								printf("  - K is invalid.\n") ;
								parameter = 0;
							}
							else if (index+1==sz-1)
							{
								index+=1;
								switch (buf[index])
								{									
								case 's' :
									defsetting->def_lnK_step = parameter ;
									printf("  - initialize lnK_step at the value %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'c' :
									defsetting->def_lnK_start = log10(parameter) ;
									printf("  - K start at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'e' :
									defsetting->def_lnK_end = log10(parameter) ;
									printf("  - K end at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								case 'o' :
									defsetting->kappa = (parameter) ;
									printf("  - K at %f.\n", parameter) ;
									parameter = 0 ;
									break ;
								default :
									printf("  - K%c is invalid.\n", buf[index]) ;
									break ;
								}
							}							
						}
						break ;
					case 'P' :						
						if (parameter >= 1)
						{ 
							defsetting->kernel = POLYNOMIAL ;
							defsetting->p = (unsigned int) parameter ;
							printf("  - choose Polynomial kernel with order %d.\n", defsetting->p) ;
							parameter = 0 ;
							defsetting->def_lnK_start = 0 ;
							defsetting->def_lnK_end = 0 ;
						}					
						break ;	
					default :
						if ('-' != buf[index])
							printf("  -%c is invalid.\n", buf[index]) ;
						break ;
					}
				}
			}
			else
				parameter = atof(buf) ;
		}
		while ( argc > 1 ) ;
		printf("\n") ;
	}

	log = fopen ("validation_implicit.log", "w+t") ;
	if (NULL != log)
		fclose(log) ;	// clear the old file.

	while ( TRUE == Update_def_Settings(defsetting) ) 
	{
/*		sz = defsetting->loops ;
		while (sz > 0)
		{
			// coarse search
			kcvsetting = Create_Kcv ( defsetting ) ;
			while (kcvsetting->index<defsetting->repeat)
			{
				Rehearsal_Kcv ( kcvsetting, defsetting ) ;
				Init_Kcv ( kcvsetting, defsetting ) ;
				kcvsetting->index += 1 ; 
			}			
			// update defsetting 
			defsetting->lnC_start = kcvsetting->best_lnC - defsetting->lnC_step*(1.0-1/defsetting->zoomin) ;		 
			defsetting->lnC_end = kcvsetting->best_lnC + defsetting->lnC_step*(1.0-1/defsetting->zoomin) ;		
			defsetting->lnK_start = kcvsetting->best_lnK - defsetting->lnK_step*(1.0-1/defsetting->zoomin) ;		 
			defsetting->lnK_end = kcvsetting->best_lnK + defsetting->lnK_step*(1.0-1/defsetting->zoomin) ;
			defsetting->lnC_step = defsetting->lnC_step/defsetting->zoomin ;
			defsetting->lnK_step = defsetting->lnK_step/defsetting->zoomin ;
			defsetting->time += kcvsetting->time ;		
			defsetting->best_rate = kcvsetting->best_rate ;
			defsetting->vc = pow(10.0, kcvsetting->best_lnC) ;
			defsetting->kappa = pow(10.0, kcvsetting->best_lnK) ;
			if (1==sz)
			{
                		log = fopen ("validation_implicit.log", "a+t") ;
                		if (NULL != log)
                		{
                        		fprintf(log,"%lu %u %u %f %f %f %.6f\n", defsetting->pairs.dimen, defsetting->kfold, defsetting->loops, log10(defsetting->vc), log10(defsetting->kappa), defsetting->best_rate, defsetting->time) ;
                        		fclose(log) ;
                		}
			}
			Clear_Kcv ( kcvsetting ) ;
			sz -= 1 ;
		}
*/
		// save validation output
		defsetting->lnC_start = log10(defsetting->vc) ;		 
		defsetting->lnC_end = log10(defsetting->vc) ;		
		defsetting->lnK_start = log10(defsetting->kappa) ;		 
		defsetting->lnK_end = log10(defsetting->kappa) ;
		defsetting->lnC_step = defsetting->lnC_step ;
		defsetting->lnK_step = defsetting->lnK_step ;		
/*		
		guess = (double *) calloc(defsetting->pairs.count,sizeof(double)) ;
		kcvsetting = Create_Kcv ( defsetting ) ;
		while (kcvsetting->index<defsetting->repeat)
		{		
			Rehearsal_Kcv ( kcvsetting, defsetting ) ;
			Init_Kcv ( kcvsetting, defsetting ) ;
                	kcvsetting->index += 1 ;
			sz = 0 ;
			node = defsetting->pairs.front ;
                        while(NULL != node)
                        {
				guess[sz] += node->fx ; 
                                node = node->next ;
				sz += 1 ;
                        }
		}		
		sprintf(buf, "%s.validation", defsetting->inputfile) ;
		parameter = 0 ;
		log = fopen (buf, "w+t") ;
		if (NULL != log)
		{
			printf("save validation output in %s.\n", buf) ;
			node = defsetting->pairs.front ;
			sz = 0 ;
			while(NULL != node)
			{
				fprintf(log,"%f ", guess[sz]/(double)defsetting->repeat) ;
                                fprintf(log," %u\n", node->target) ;
				node = node->next ;
				sz += 1 ;
			}
			fclose(log) ;
		}
		free (guess) ;
		Clear_Kcv ( kcvsetting ) ;//
*/
		defsetting->training.count = defsetting->pairs.count ;		
		defsetting->training.front = defsetting->pairs.front ;		
		defsetting->training.rear = defsetting->pairs.rear ;	
		defsetting->training.classes = defsetting->pairs.classes ;	
		defsetting->training.dimen = defsetting->pairs.dimen ;
		defsetting->training.featuretype = defsetting->pairs.featuretype ;
		// create smosettings
		printf ("\n\n TESTING on %s...\n", defsetting->testfile ) ;	
		smosetting = Create_smo_Settings(defsetting) ; 
		smosetting->pairs = &defsetting->pairs ;  		
		defsetting->training.count = 0 ;		
		defsetting->training.front = NULL ;		
		defsetting->training.rear = NULL ;
		defsetting->training.featuretype = NULL ;
		// load test data
		if ( FALSE == smo_Loadfile(&(defsetting->testdata), defsetting->testfile, defsetting->pairs.dimen) )
		{
			printf ("No testing data found in the file %s.\n", defsetting->testfile ) ;
			svm_saveresults (&defsetting->pairs, smosetting) ;		
		}
		// calculate the test output
		else
		{
			smo_routine (smosetting) ;
			svm_predict (&defsetting->testdata, smosetting) ;
			svm_saveresults (&defsetting->testdata, smosetting) ;

			if (ORDINAL == smosetting->pairs->datatype)
				printf ("\r\nTEST ERROR NUMBER %.0f, AAE %.0f and SVs %.0f, at C=%.3f Kappa=%.3f with %.3f seconds.\r\n", 
				smosetting->testerror*defsetting->testdata.count,smosetting->testrate*defsetting->testdata.count, smosetting->svs, smosetting->vc, smosetting->kappa, smosetting->smo_timing) ;

			if (NULL != (log = fopen ("kfoldsvc.log", "a+t")) ) 
			{
				if (REGRESSION == smosetting->pairs->datatype)
					fprintf(log,"%d-fold: TEST ASE %f, AAE %f and SVs %.0f at C=%f and Kappa=%f with %.3f seconds.\r\n", defsetting->kfold, smosetting->testrate, smosetting->testerror, smosetting->svs, smosetting->vc, smosetting->kappa, smosetting->smo_timing) ;
				else
					fprintf(log,"%d-fold: TEST ERROR %f, RATE %f and SVs %.0f at C=%f and Kappa=%f with %.3f seconds.\r\n", defsetting->kfold, smosetting->testerror, smosetting->testrate, smosetting->svs, smosetting->vc, smosetting->kappa, smosetting->smo_timing) ;		
				fclose(log) ;
			}
			// write another log
			if (ORDINAL != smosetting->pairs->datatype)
			{
				if (NULL != (log = fopen ("ordinal.log", "a+t")) )
				{
					fprintf(log,"%.0f %.0f %f %.3f\n", smosetting->testerror*defsetting->testdata.count, smosetting->testrate*defsetting->testdata.count, smosetting->testrate, smosetting->smo_timing) ;
					fclose(log) ;                   
				}
			}
			if (ORDINAL == smosetting->pairs->datatype)
			{
				if (NULL != (log = fopen ("ordinal_implicit.log", "a+t")) )
				{
					fprintf(log,"%.0f %.0f %f %f\n", smosetting->testerror*defsetting->testdata.count, smosetting->testrate*defsetting->testdata.count, smosetting->testrate, smosetting->smo_timing) ;
					fclose(log) ;                   
				}
			}
		}
		Clear_smo_Settings( smosetting ) ;

	}
	// free memory then exit
	Clear_def_Settings( defsetting ) ;	
	return 0;
}