void print_struct_learning_stats(SAMPLE sample, STRUCTMODEL *sm, CONSTSET cset, double *alpha, STRUCT_LEARN_PARM *sparm) { /* This function is called after training and allows final touches to the model sm. But primarly it allows computing and printing any kind of statistic (e.g. training error) you might want. */ /* Replace SV with single weight vector */ MODEL *model=sm->svm_model; if(model->kernel_parm.kernel_type == LINEAR) { if(struct_verbosity>=1) { printf("Compacting linear model..."); fflush(stdout); } sm->svm_model=compact_linear_model(model); sm->w=sm->svm_model->lin_weights; /* short cut to weight vector */ free_model(model,1); if(struct_verbosity>=1) { printf("done\n"); fflush(stdout); } } }
void write_model(char *modelfile, MODEL *model) { FILE *modelfl; long j,i,sv_num; SVECTOR *v; MODEL *compact_model=NULL; if(verbosity>=1) { printf("Writing model file..."); fflush(stdout); } /* Replace SV with single weight vector */ if(0 && model->kernel_parm.kernel_type == LINEAR) { if(verbosity>=1) { printf("(compacting..."); fflush(stdout); } compact_model=compact_linear_model(model); model=compact_model; if(verbosity>=1) { printf("done)"); fflush(stdout); } } if ((modelfl = fopen (modelfile, "w")) == NULL) { perror (modelfile); exit (1); } fprintf(modelfl,"SVM-light Version %s\n",VERSION); fprintf(modelfl,"%ld # kernel type\n", model->kernel_parm.kernel_type); fprintf(modelfl,"%ld # kernel parameter -d \n", model->kernel_parm.poly_degree); fprintf(modelfl,"%.8g # kernel parameter -g \n", model->kernel_parm.rbf_gamma); fprintf(modelfl,"%.8g # kernel parameter -s \n", model->kernel_parm.coef_lin); fprintf(modelfl,"%.8g # kernel parameter -r \n", model->kernel_parm.coef_const); fprintf(modelfl,"%s# kernel parameter -u \n",model->kernel_parm.custom); fprintf(modelfl,"%ld # highest feature index \n",model->totwords); fprintf(modelfl,"%ld # number of training documents \n",model->totdoc); sv_num=1; for(i=1;i<model->sv_num;i++) { for(v=model->supvec[i]->fvec;v;v=v->next) sv_num++; } fprintf(modelfl,"%ld # number of support vectors plus 1 \n",sv_num); fprintf(modelfl,"%.8g # threshold b, each following line is a SV (starting with alpha*y)\n",model->b); for(i=1;i<model->sv_num;i++) { for(v=model->supvec[i]->fvec;v;v=v->next) { fprintf(modelfl,"%.32g ",model->alpha[i]*v->factor); for (j=0; (v->words[j]).wnum; j++) { fprintf(modelfl,"%ld:%.8g ", (long)(v->words[j]).wnum, (double)(v->words[j]).weight); } if(v->userdefined) fprintf(modelfl,"#%s\n",v->userdefined); else fprintf(modelfl,"#\n"); /* NOTE: this could be made more efficient by summing the alpha's of identical vectors before writing them to the file. */ } } fclose(modelfl); if(compact_model) free_model(compact_model,1); if(verbosity>=1) { printf("done\n"); } }