svm_toy.java
上传用户:xgw_05
上传日期:2014-12-08
资源大小:2726k
文件大小:11k
源码类别:

.net编程

开发平台:

Java

  1. import libsvm.*;
  2. import java.applet.*;
  3. import java.awt.*;
  4. import java.util.*;
  5. import java.awt.event.*;
  6. import java.io.*;
  7. public class svm_toy extends Applet {
  8. static final String DEFAULT_PARAM="-t 2 -c 100";
  9. int XLEN;
  10. int YLEN;
  11. // off-screen buffer
  12. Image buffer;
  13. Graphics buffer_gc;
  14. // pre-allocated colors
  15. final static Color colors[] =
  16. {
  17.   new Color(0,0,0),
  18.   new Color(0,120,120),
  19.   new Color(120,120,0),
  20.   new Color(120,0,120),
  21.   new Color(0,200,200),
  22.   new Color(200,200,0),
  23.   new Color(200,0,200)
  24. };
  25. class point {
  26. point(double x, double y, byte value)
  27. {
  28. this.x = x;
  29. this.y = y;
  30. this.value = value;
  31. }
  32. double x, y;
  33. byte value;
  34. }
  35. Vector point_list = new Vector();
  36. byte current_value = 1;
  37. public void init()
  38. {
  39. Button button_change = new Button("Change");
  40. Button button_run = new Button("Run");
  41. Button button_clear = new Button("Clear");
  42. Button button_save = new Button("Save");
  43. Button button_load = new Button("Load");
  44. final TextField input_line = new TextField(DEFAULT_PARAM);
  45. BorderLayout layout = new BorderLayout();
  46. this.setLayout(layout);
  47. Panel p = new Panel();
  48. GridBagLayout gridbag = new GridBagLayout();
  49. p.setLayout(gridbag);
  50. GridBagConstraints c = new GridBagConstraints();
  51. c.fill = GridBagConstraints.HORIZONTAL;
  52. c.weightx = 1;
  53. c.gridwidth = 1;
  54. gridbag.setConstraints(button_change,c);
  55. gridbag.setConstraints(button_run,c);
  56. gridbag.setConstraints(button_clear,c);
  57. gridbag.setConstraints(button_save,c);
  58. gridbag.setConstraints(button_load,c);
  59. c.weightx = 5;
  60. c.gridwidth = 5;
  61. gridbag.setConstraints(input_line,c);
  62. p.add(button_change);
  63. p.add(button_run);
  64. p.add(button_clear);
  65. p.add(button_save);
  66. p.add(button_load);
  67. p.add(input_line);
  68. this.add(p,BorderLayout.SOUTH);
  69. button_change.addActionListener(new ActionListener()
  70. { public void actionPerformed (ActionEvent e)
  71.   { button_change_clicked(); }});
  72. button_run.addActionListener(new ActionListener()
  73. { public void actionPerformed (ActionEvent e)
  74.   { button_run_clicked(input_line.getText()); }});
  75. button_clear.addActionListener(new ActionListener()
  76. { public void actionPerformed (ActionEvent e)
  77.   { button_clear_clicked(); }});
  78. button_save.addActionListener(new ActionListener()
  79. { public void actionPerformed (ActionEvent e)
  80.   { button_save_clicked(); }});
  81. button_load.addActionListener(new ActionListener()
  82. { public void actionPerformed (ActionEvent e)
  83.   { button_load_clicked(); }});
  84. input_line.addActionListener(new ActionListener()
  85. { public void actionPerformed (ActionEvent e)
  86.   { button_run_clicked(input_line.getText()); }});
  87. this.enableEvents(AWTEvent.MOUSE_EVENT_MASK);
  88. }
  89. void draw_point(point p)
  90. {
  91. Color c = colors[p.value+3];
  92. Graphics window_gc = getGraphics();
  93. buffer_gc.setColor(c);
  94. buffer_gc.fillRect((int)(p.x*XLEN),(int)(p.y*YLEN),4,4);
  95. window_gc.setColor(c);
  96. window_gc.fillRect((int)(p.x*XLEN),(int)(p.y*YLEN),4,4);
  97. }
  98. void clear_all()
  99. {
  100. point_list.removeAllElements();
  101. if(buffer != null)
  102. {
  103. buffer_gc.setColor(colors[0]);
  104. buffer_gc.fillRect(0,0,XLEN,YLEN);
  105. }
  106. repaint();
  107. }
  108. void draw_all_points()
  109. {
  110. int n = point_list.size();
  111. for(int i=0;i<n;i++)
  112. draw_point((point)point_list.elementAt(i));
  113. }
  114. void button_change_clicked()
  115. {
  116. ++current_value;
  117. if(current_value > 3) current_value = 1;
  118. }
  119. private static double atof(String s)
  120. {
  121. return Double.valueOf(s).doubleValue();
  122. }
  123. private static int atoi(String s)
  124. {
  125. return Integer.parseInt(s);
  126. }
  127. void button_run_clicked(String args)
  128. {
  129. // guard
  130. if(point_list.isEmpty()) return;
  131. svm_parameter param = new svm_parameter();
  132. // default values
  133. param.svm_type = svm_parameter.C_SVC;
  134. param.kernel_type = svm_parameter.RBF;
  135. param.degree = 3;
  136. param.gamma = 0;
  137. param.coef0 = 0;
  138. param.nu = 0.5;
  139. param.cache_size = 40;
  140. param.C = 1;
  141. param.eps = 1e-3;
  142. param.p = 0.1;
  143. param.shrinking = 1;
  144. param.nr_weight = 0;
  145. param.weight_label = new int[0];
  146. param.weight = new double[0];
  147. // parse options
  148. StringTokenizer st = new StringTokenizer(args);
  149. String[] argv = new String[st.countTokens()];
  150. for(int i=0;i<argv.length;i++)
  151. argv[i] = st.nextToken();
  152. for(int i=0;i<argv.length;i++)
  153. {
  154. if(argv[i].charAt(0) != '-') break;
  155. ++i;
  156. switch(argv[i-1].charAt(1))
  157. {
  158. case 's':
  159. param.svm_type = atoi(argv[i]);
  160. break;
  161. case 't':
  162. param.kernel_type = atoi(argv[i]);
  163. break;
  164. case 'd':
  165. param.degree = atof(argv[i]);
  166. break;
  167. case 'g':
  168. param.gamma = atof(argv[i]);
  169. break;
  170. case 'r':
  171. param.coef0 = atof(argv[i]);
  172. break;
  173. case 'n':
  174. param.nu = atof(argv[i]);
  175. break;
  176. case 'm':
  177. param.cache_size = atof(argv[i]);
  178. break;
  179. case 'c':
  180. param.C = atof(argv[i]);
  181. break;
  182. case 'e':
  183. param.eps = atof(argv[i]);
  184. break;
  185. case 'p':
  186. param.p = atof(argv[i]);
  187. break;
  188. case 'h':
  189. param.shrinking = atoi(argv[i]);
  190. break;
  191. case 'w':
  192. ++param.nr_weight;
  193. {
  194. int[] old = param.weight_label;
  195. param.weight_label = new int[param.nr_weight];
  196. System.arraycopy(old,0,param.weight_label,0,param.nr_weight-1);
  197. }
  198. {
  199. double[] old = param.weight;
  200. param.weight = new double[param.nr_weight];
  201. System.arraycopy(old,0,param.weight,0,param.nr_weight-1);
  202. }
  203. param.weight_label[param.nr_weight-1] = atoi(argv[i-1].substring(2));
  204. param.weight[param.nr_weight-1] = atof(argv[i]);
  205. break;
  206. default:
  207. System.err.print("unknown optionn");
  208. }
  209. }
  210. // build problem
  211. svm_problem prob = new svm_problem();
  212. prob.l = point_list.size();
  213. prob.y = new double[prob.l];
  214. if(param.svm_type == svm_parameter.EPSILON_SVR ||
  215.    param.svm_type == svm_parameter.NU_SVR)
  216. {
  217. if(param.gamma == 0) param.gamma = 1;
  218. prob.x = new svm_node[prob.l][1];
  219. for(int i=0;i<prob.l;i++)
  220. {
  221. point p = (point)point_list.elementAt(i);
  222. prob.x[i][0] = new svm_node();
  223. prob.x[i][0].index = 1;
  224. prob.x[i][0].value = p.x;
  225. prob.y[i] = p.y;
  226. }
  227. // build model & classify
  228. svm_model model = svm.svm_train(prob, param);
  229. svm_node[] x = new svm_node[1];
  230. x[0] = new svm_node();
  231. x[0].index = 1;
  232. int[] j = new int[XLEN];
  233. Graphics window_gc = getGraphics();
  234. for (int i = 0; i < XLEN; i++)
  235. {
  236. x[0].value = (double) i / XLEN;
  237. j[i] = (int)(YLEN*svm.svm_predict(model, x));
  238. }
  239. buffer_gc.setColor(colors[0]);
  240. buffer_gc.drawLine(0,0,0,YLEN-1);
  241. window_gc.setColor(colors[0]);
  242. window_gc.drawLine(0,0,0,YLEN-1);
  243. int p = (int)(param.p * YLEN);
  244. for(int i=1;i<XLEN;i++)
  245. {
  246. buffer_gc.setColor(colors[0]);
  247. buffer_gc.drawLine(i,0,i,YLEN-1);
  248. window_gc.setColor(colors[0]);
  249. window_gc.drawLine(i,0,i,YLEN-1);
  250. buffer_gc.setColor(colors[5]);
  251. window_gc.setColor(colors[5]);
  252. buffer_gc.drawLine(i-1,j[i-1],i,j[i]);
  253. window_gc.drawLine(i-1,j[i-1],i,j[i]);
  254. if(param.svm_type == svm_parameter.EPSILON_SVR)
  255. {
  256. buffer_gc.setColor(colors[2]);
  257. window_gc.setColor(colors[2]);
  258. buffer_gc.drawLine(i-1,j[i-1]+p,i,j[i]+p);
  259. window_gc.drawLine(i-1,j[i-1]+p,i,j[i]+p);
  260. buffer_gc.setColor(colors[2]);
  261. window_gc.setColor(colors[2]);
  262. buffer_gc.drawLine(i-1,j[i-1]-p,i,j[i]-p);
  263. window_gc.drawLine(i-1,j[i-1]-p,i,j[i]-p);
  264. }
  265. }
  266. }
  267. else
  268. {
  269. if(param.gamma == 0) param.gamma = 0.5;
  270. prob.x = new svm_node [prob.l][2];
  271. for(int i=0;i<prob.l;i++)
  272. {
  273. point p = (point)point_list.elementAt(i);
  274. prob.x[i][0] = new svm_node();
  275. prob.x[i][0].index = 1;
  276. prob.x[i][0].value = p.x;
  277. prob.x[i][1] = new svm_node();
  278. prob.x[i][1].index = 2;
  279. prob.x[i][1].value = p.y;
  280. prob.y[i] = p.value;
  281. }
  282. // build model & classify
  283. svm_model model = svm.svm_train(prob, param);
  284. svm_node[] x = new svm_node[2];
  285. x[0] = new svm_node();
  286. x[1] = new svm_node();
  287. x[0].index = 1;
  288. x[1].index = 2;
  289. Graphics window_gc = getGraphics();
  290. for (int i = 0; i < XLEN; i++)
  291. for (int j = 0; j < YLEN ; j++) {
  292. x[0].value = (double) i / XLEN;
  293. x[1].value = (double) j / YLEN;
  294. double d = svm.svm_predict(model, x);
  295. buffer_gc.setColor(colors[(int)d]);
  296. window_gc.setColor(colors[(int)d]);
  297. buffer_gc.drawLine(i,j,i,j);
  298. window_gc.drawLine(i,j,i,j);
  299. }
  300. }
  301. draw_all_points();
  302. }
  303. void button_clear_clicked()
  304. {
  305. clear_all();
  306. }
  307. void button_save_clicked()
  308. {
  309. FileDialog dialog = new FileDialog(new Frame(),"Save",FileDialog.SAVE);
  310. dialog.setVisible(true);
  311. String filename = dialog.getFile();
  312. if (filename == null) return;
  313. try {
  314. DataOutputStream fp = new DataOutputStream(new FileOutputStream(filename));
  315. int n = point_list.size();
  316. for(int i=0;i<n;i++)
  317. {
  318. point p = (point)point_list.elementAt(i);
  319. fp.writeBytes(p.value+" 1:"+p.x+" 2:"+p.y+"n");
  320. }
  321. fp.close();
  322. } catch (IOException e) { System.err.print(e); }
  323. }
  324. void button_load_clicked()
  325. {
  326. FileDialog dialog = new FileDialog(new Frame(),"Load",FileDialog.LOAD);
  327. dialog.setVisible(true);
  328. String filename = dialog.getFile();
  329. if (filename == null) return;
  330. clear_all();
  331. try {
  332. BufferedReader fp = new BufferedReader(new FileReader(filename));
  333. String line;
  334. while((line = fp.readLine()) != null)
  335. {
  336. StringTokenizer st = new StringTokenizer(line," tnrf:");
  337. byte value = (byte)atoi(st.nextToken());
  338. st.nextToken();
  339. double x = atof(st.nextToken());
  340. st.nextToken();
  341. double y = atof(st.nextToken());
  342. point_list.addElement(new point(x,y,value));
  343. }
  344. fp.close();
  345. } catch (IOException e) { System.err.print(e); }
  346. draw_all_points();
  347. }
  348. protected void processMouseEvent(MouseEvent e)
  349. {
  350. if(e.getID() == MouseEvent.MOUSE_PRESSED)
  351. {
  352. if(e.getX() >= XLEN || e.getY() >= YLEN) return;
  353. point p = new point((double)e.getX()/XLEN,
  354.     (double)e.getY()/YLEN,
  355.     current_value);
  356. point_list.addElement(p);
  357. draw_point(p);
  358. }
  359. }
  360. public void paint(Graphics g)
  361. {
  362. // create buffer first time
  363. if(buffer == null) {
  364. buffer = this.createImage(XLEN,YLEN);
  365. buffer_gc = buffer.getGraphics();
  366. buffer_gc.setColor(colors[0]);
  367. buffer_gc.fillRect(0,0,XLEN,YLEN);
  368. }
  369. g.drawImage(buffer,0,0,this);
  370. }
  371. public Dimension getPreferredSize() { return new Dimension(XLEN,YLEN+50); }
  372. public void resize(Dimension d) { resize(d.width,d.height); }
  373. public void resize(int w,int h) {
  374. super.resize(w,h);
  375. XLEN = w;
  376. YLEN = h-50;
  377. clear_all();
  378. }
  379. public static void main(String[] argv)
  380. {
  381. new AppletFrame("svm_toy",new svm_toy(),500,500+50);
  382. }
  383. }
  384. class AppletFrame extends Frame {
  385. AppletFrame(String title, Applet applet, int width, int height)
  386. {
  387. super(title);
  388. applet.init();
  389. applet.resize(width,height);
  390. applet.start();
  391. this.add(applet);
  392. this.pack();
  393. this.show();
  394. }
  395. }