svm-scale.c
上传用户:xgw_05
上传日期:2014-12-08
资源大小:2726k
文件大小:5k
源码类别:

.net编程

开发平台:

Java

  1. /*
  2. scale attributes to [lower,upper]
  3. usage: scale [-l lower] [-u upper] [-y y_lower y_upper] filename
  4. */
  5. #include <float.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. char *line;
  11. int max_line_len = 1024;
  12. double lower=-1.0,upper=1.0,y_lower,y_upper;
  13. int y_scaling = 0;
  14. double *feature_max;
  15. double *feature_min;
  16. double y_max = -DBL_MAX;
  17. double y_min = DBL_MAX;
  18. int max_index;
  19. #define max(x,y) ((x>y)?x:y)
  20. #define min(x,y) ((x<y)?x:y)
  21. void output_target(double value);
  22. void output(int index, double value);
  23. char* readline(FILE *input);
  24. int main(int argc,char **argv)
  25. {
  26. int i,index;
  27. FILE *fp;
  28. for(i=1;i<argc;i++)
  29. {
  30. if(argv[i][0] != '-') break;
  31. ++i;
  32. switch(argv[i-1][1])
  33. {
  34. case 'l': lower = atof(argv[i]); break;
  35. case 'u': upper = atof(argv[i]); break;
  36. case 'y':
  37. y_lower = atof(argv[i]);
  38. ++i;
  39. y_upper = atof(argv[i]);
  40. y_scaling = 1;
  41. break;
  42. default:
  43. fprintf(stderr,"unknown optionn");
  44. exit(1);
  45. }
  46. }
  47. if(!(upper > lower) || (y_scaling && !(y_upper > y_lower)))
  48. {
  49. fprintf(stderr,"inconsistent lower/upper specificationn");
  50. exit(1);
  51. }
  52. if(argc != i+1) 
  53. {
  54. fprintf(stderr,"usage: %s [-l lower] [-u upper] [-y y_lower y_upper] filenamen",argv[0]);
  55. fprintf(stderr,"(default: lower = -1, upper = 1, no y scaling)n");
  56. exit(1);
  57. }
  58. fp=fopen(argv[i],"r");
  59. if(fp==NULL)
  60. {
  61. fprintf(stderr,"can't open filen");
  62. exit(1);
  63. }
  64. line = (char *) malloc(max_line_len*sizeof(char));
  65. #define SKIP_TARGET
  66. while(isspace(*p)) ++p;
  67. while(!isspace(*p)) ++p;
  68. #define SKIP_ELEMENT
  69. while(*p!=':') ++p;
  70. ++p;
  71. while(isspace(*p)) ++p;
  72. while(*p && !isspace(*p)) ++p;
  73. /* assumption: min index of attributes is 1 */
  74. /* pass 1: find out max index of attributes */
  75. max_index = 0;
  76. while(readline(fp)!=NULL)
  77. {
  78. char *p=line;
  79. SKIP_TARGET
  80. while(sscanf(p,"%d:%*f",&index)==1)
  81. {
  82. max_index = max(max_index, index);
  83. SKIP_ELEMENT
  84. }
  85. }
  86. feature_max = (double *)malloc((max_index+1)* sizeof(double));
  87. feature_min = (double *)malloc((max_index+1)* sizeof(double));
  88. if(feature_max == NULL || feature_min == NULL)
  89. {
  90. fprintf(stderr,"can't allocate enough memoryn");
  91. exit(1);
  92. }
  93. for(i=0;i<=max_index;i++)
  94. {
  95. feature_max[i]=-DBL_MAX;
  96. feature_min[i]=DBL_MAX;
  97. }
  98. rewind(fp);
  99. /* pass 2: find out min/max value */
  100. while(readline(fp)!=NULL)
  101. {
  102. char *p=line;
  103. int next_index=1;
  104. double target;
  105. double value;
  106. sscanf(p,"%lf",&target);
  107. y_max = max(y_max,target);
  108. y_min = min(y_min,target);
  109. SKIP_TARGET
  110. while(sscanf(p,"%d:%lf",&index,&value)==2)
  111. {
  112. for(i=next_index;i<index;i++)
  113. {
  114. feature_max[i]=max(feature_max[i],0);
  115. feature_min[i]=min(feature_min[i],0);
  116. }
  117. feature_max[index]=max(feature_max[index],value);
  118. feature_min[index]=min(feature_min[index],value);
  119. SKIP_ELEMENT
  120. next_index=index+1;
  121. }
  122. for(i=next_index;i<=max_index;i++)
  123. {
  124. feature_max[i]=max(feature_max[i],0);
  125. feature_min[i]=min(feature_min[i],0);
  126. }
  127. }
  128. rewind(fp);
  129. /* pass 3: scale */
  130. while(readline(fp)!=NULL)
  131. {
  132. char *p=line;
  133. int next_index=1;
  134. int index;
  135. double target;
  136. double value;
  137. sscanf(p,"%lf",&target);
  138. output_target(target);
  139. SKIP_TARGET
  140. while(sscanf(p,"%d:%lf",&index,&value)==2)
  141. {
  142. for(i=next_index;i<index;i++)
  143. output(i,0);
  144. output(index,value);
  145. SKIP_ELEMENT
  146. next_index=index+1;
  147. }
  148. for(i=next_index;i<=max_index;i++)
  149. output(i,0);
  150. printf("n");
  151. }
  152. free(line);
  153. fclose(fp);
  154. return 0;
  155. }
  156. char* readline(FILE *input)
  157. {
  158. int len;
  159. if(fgets(line,max_line_len,input) == NULL)
  160. return NULL;
  161. while(strrchr(line,'n') == NULL)
  162. {
  163. max_line_len *= 2;
  164. line = (char *) realloc(line, max_line_len);
  165. len = strlen(line);
  166. if(fgets(line+len,max_line_len-len,input) == NULL)
  167. break;
  168. }
  169. return line;
  170. }
  171. void output_target(double value)
  172. {
  173. if(y_scaling)
  174. {
  175. if(value == y_min)
  176. value = y_lower;
  177. else if(value == y_max)
  178. value = y_upper;
  179. else value = y_lower + (y_upper-y_lower) *
  180.      (value - y_min)/(y_max-y_min);
  181. }
  182. printf("%g ",value);
  183. }
  184. void output(int index, double value)
  185. {
  186. /* skip single-valued attribute */
  187. if(feature_max[index] == feature_min[index])
  188. return;
  189. if(value == feature_min[index])
  190. value = lower;
  191. else if(value == feature_max[index])
  192. value = upper;
  193. else
  194. value = lower + (upper-lower) * 
  195. (value-feature_min[index])/
  196. (feature_max[index]-feature_min[index]);
  197. if(value != 0)
  198. printf("%d:%g ",index, value);
  199. }