⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clustererpanel.java

📁 MacroWeka扩展了著名数据挖掘工具weka
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    final VisualizePanel vp = temp_vp;
    final String grph = temp_grph;
    final Clusterer clusterer = temp_clusterer;
    final Instances trainHeader = temp_trainHeader;
    final int[] ignoreAtts = temp_ignoreAtts;
    
    JMenuItem saveModel = new JMenuItem("Save model");
    if (clusterer != null) {
      saveModel.addActionListener(new ActionListener() {
	  public void actionPerformed(ActionEvent e) {
	    saveClusterer(selectedName, clusterer, trainHeader, ignoreAtts);
	  }
	});
    } else {
      saveModel.setEnabled(false);
    }
    resultListMenu.add(saveModel);
    
    JMenuItem reEvaluate =
      new JMenuItem("Re-evaluate model on current test set");
    if (clusterer != null && m_TestInstances != null) {
      reEvaluate.addActionListener(new ActionListener() {
	  public void actionPerformed(ActionEvent e) {
	    reevaluateModel(selectedName, clusterer, trainHeader, ignoreAtts);
	  }
	}); 
    } else {
      reEvaluate.setEnabled(false);
    }
    resultListMenu.add(reEvaluate);
    
    resultListMenu.addSeparator();
    
    JMenuItem visClusts = new JMenuItem("Visualize cluster assignments");
    if (vp != null) {
      visClusts.addActionListener(new ActionListener() {
	    public void actionPerformed(ActionEvent e) {
	      visualizeClusterAssignments(vp);
	    }
	  });
      
    } else {
      visClusts.setEnabled(false);
    }
    resultListMenu.add(visClusts);

    JMenuItem visTree = new JMenuItem("Visualize tree");
    if (grph != null) {
      visTree.addActionListener(new ActionListener() {
	  public void actionPerformed(ActionEvent e) {
	    String title;
	    if (vp != null) title = vp.getName();
	    else title = selectedName;
	    visualizeTree(grph, title);
	  }
	});
    } else {
      visTree.setEnabled(false);
    }
    resultListMenu.add(visTree);

    resultListMenu.show(m_History.getList(), x, y);
  }
  
  /**
   * Save the currently selected clusterer output to a file.
   * @param name the name of the buffer to save
   */
  protected void saveBuffer(String name) {
    StringBuffer sb = m_History.getNamedBuffer(name);
    if (sb != null) {
      if (m_SaveOut.save(sb)) {
	m_Log.logMessage("Save successful.");
      }
    }
  }

  private void setIgnoreColumns() {
    ListSelectorDialog jd = new ListSelectorDialog(null, m_ignoreKeyList);

    // Open the dialog
    int result = jd.showDialog();
    
    if (result != ListSelectorDialog.APPROVE_OPTION) {
      // clear selected indices
      m_ignoreKeyList.clearSelection();
    }
  }

  /**
   * Saves the currently selected clusterer
   */
  protected void saveClusterer(String name, Clusterer clusterer,
			       Instances trainHeader, int[] ignoredAtts) {

    File sFile = null;
    boolean saveOK = true;

    int returnVal = m_FileChooser.showSaveDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
      sFile = m_FileChooser.getSelectedFile();
      if (!sFile.getName().toLowerCase().endsWith(MODEL_FILE_EXTENSION)) {
	sFile = new File(sFile.getParent(), sFile.getName() 
			 + MODEL_FILE_EXTENSION);
      }
      m_Log.statusMessage("Saving model to file...");
      
      try {
	OutputStream os = new FileOutputStream(sFile);
	if (sFile.getName().endsWith(".gz")) {
	  os = new GZIPOutputStream(os);
	}
	ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);
	objectOutputStream.writeObject(clusterer);
	if (trainHeader != null) objectOutputStream.writeObject(trainHeader);
	if (ignoredAtts != null) objectOutputStream.writeObject(ignoredAtts);
	objectOutputStream.flush();
	objectOutputStream.close();
      } catch (Exception e) {
	
	JOptionPane.showMessageDialog(null, e, "Save Failed",
				      JOptionPane.ERROR_MESSAGE);
	saveOK = false;
      }
      if (saveOK)
	m_Log.logMessage("Saved model (" + name
			 + ") to file '" + sFile.getName() + "'");
      m_Log.statusMessage("OK");
    }
  }

  /**
   * Loads a clusterer
   */
  protected void loadClusterer() {

    int returnVal = m_FileChooser.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
      File selected = m_FileChooser.getSelectedFile();
      Clusterer clusterer = null;
      Instances trainHeader = null;
      int[] ignoredAtts = null;

      m_Log.statusMessage("Loading model from file...");

      try {
	InputStream is = new FileInputStream(selected);
	if (selected.getName().endsWith(".gz")) {
	  is = new GZIPInputStream(is);
	}
	ObjectInputStream objectInputStream = new ObjectInputStream(is);
	clusterer = (Clusterer) objectInputStream.readObject();
	try { // see if we can load the header & ignored attribute info
	  trainHeader = (Instances) objectInputStream.readObject();
	  ignoredAtts = (int[]) objectInputStream.readObject();
	} catch (Exception e) {} // don't fuss if we can't
	objectInputStream.close();
      } catch (Exception e) {
	
	JOptionPane.showMessageDialog(null, e, "Load Failed",
				      JOptionPane.ERROR_MESSAGE);
      }	

      m_Log.statusMessage("OK");
      
      if (clusterer != null) {
	m_Log.logMessage("Loaded model from file '" + selected.getName()+ "'");
	String name = (new SimpleDateFormat("HH:mm:ss - ")).format(new Date());
	String cname = clusterer.getClass().getName();
	if (cname.startsWith("weka.clusterers."))
	  cname = cname.substring("weka.clusterers.".length());
	name += cname + " from file '" + selected.getName() + "'";
	StringBuffer outBuff = new StringBuffer();

	outBuff.append("=== Model information ===\n\n");
	outBuff.append("Filename:     " + selected.getName() + "\n");
	outBuff.append("Scheme:       " + cname);
	if (clusterer instanceof OptionHandler) {
	  String [] o = ((OptionHandler) clusterer).getOptions();
	  outBuff.append(" " + Utils.joinOptions(o));
	}
	outBuff.append("\n");

	if (trainHeader != null) {

	  outBuff.append("Relation:     " + trainHeader.relationName() + '\n');
	  outBuff.append("Attributes:   " + trainHeader.numAttributes() + '\n');
	  if (trainHeader.numAttributes() < 100) {
	    boolean [] selectedAtts = new boolean [trainHeader.numAttributes()];
	    for (int i = 0; i < trainHeader.numAttributes(); i++) {
	      selectedAtts[i] = true;
	    }
	    
	    if (ignoredAtts != null)
	      for (int i=0; i<ignoredAtts.length; i++)
		selectedAtts[ignoredAtts[i]] = false;
	   
	    for (int i = 0; i < trainHeader.numAttributes(); i++) {
	      if (selectedAtts[i]) {
		outBuff.append("              " + trainHeader.attribute(i).name()
			       + '\n');
	      }
	    }
	    if (ignoredAtts != null) {
	      outBuff.append("Ignored:\n");
	      for (int i=0; i<ignoredAtts.length; i++)
		outBuff.append("              "
			       + trainHeader.attribute(ignoredAtts[i]).name()
			       + '\n');
	    }
	  } else {
	    outBuff.append("              [list of attributes omitted]\n");
	  }
	} else {
	  outBuff.append("\nTraining data unknown\n");
	} 
	
	outBuff.append("\n=== Clustering model ===\n\n");
	outBuff.append(clusterer.toString() + "\n");

	m_History.addResult(name, outBuff);
	m_History.setSingle(name);
	FastVector vv = new FastVector();
	vv.addElement(clusterer);
	if (trainHeader != null) vv.addElement(trainHeader);
	if (ignoredAtts != null) vv.addElement(ignoredAtts);
	// allow visualization of graphable classifiers
	String grph = null;
	if (clusterer instanceof Drawable) {
	  try {
	    grph = ((Drawable)clusterer).graph();
	  } catch (Exception ex) {
	  }
	}
	if (grph != null) vv.addElement(grph);
	
	m_History.addObject(name, vv);
	
      }
    }
  }

  /**
   * Re-evaluates the named clusterer with the current test set. Unpredictable
   * things will happen if the data set is not compatible with the clusterer.
   *
   * @param name the name of the clusterer entry
   * @param classifier the clusterer to evaluate
   */
  protected void reevaluateModel(String name, Clusterer clusterer,
				 Instances trainHeader, int[] ignoredAtts) {

    StringBuffer outBuff = m_History.getNamedBuffer(name);
    Instances userTest = null;

    PlotData2D predData = null;
    if (m_TestInstances != null) {
      userTest = new Instances(m_TestInstances);
    }
    
    boolean saveVis = m_StorePredictionsBut.isSelected();
    String grph = null;

    try {
      if (userTest == null) {
	throw new Exception("No user test set has been opened");
      }
      if (trainHeader != null && !trainHeader.equalHeaders(userTest)) {
	throw new Exception("Train and test set are not compatible");
      }

      m_Log.statusMessage("Evaluating on test data...");
      m_Log.logMessage("Re-evaluating clusterer (" + name + ") on test set");
      ClusterEvaluation eval = new ClusterEvaluation();
      eval.setClusterer(clusterer);
    
      Instances userTestT = new Instances(userTest);
      if (ignoredAtts != null) {
	userTestT = removeIgnoreCols(userTestT, ignoredAtts);
      }

      eval.evaluateClusterer(userTestT);
      
      predData = setUpVisualizableInstances(userTest, eval);

      outBuff.append("\n=== Re-evaluation on test set ===\n\n");
      outBuff.append("User supplied test set\n");  
      outBuff.append("Relation:     " + userTest.relationName() + '\n');
      outBuff.append("Instances:    " + userTest.numInstances() + '\n');
      outBuff.append("Attributes:   " + userTest.numAttributes() + "\n\n");
      if (trainHeader == null)
	outBuff.append("NOTE - if test set is not compatible then results are "
		       + "unpredictable\n\n");
      
      outBuff.append(eval.clusterResultsToString());
      outBuff.append("\n");
      m_History.updateResult(name);
      m_Log.logMessage("Finished re-evaluation");
      m_Log.statusMessage("OK");
    } catch (Exception ex) {
      ex.printStackTrace();
      m_Log.logMessage(ex.getMessage());
      JOptionPane.showMessageDialog(this,
				    "Problem evaluating clusterer:\n"
				    + ex.getMessage(),
				    "Evaluate clusterer",
				    JOptionPane.ERROR_MESSAGE);
      m_Log.statusMessage("Problem evaluating clusterer");

    } finally {
      if (predData != null) {
	m_CurrentVis = new VisualizePanel();
	m_CurrentVis.setName(name+" ("+userTest.relationName()+")");
	m_CurrentVis.setLog(m_Log);
	predData.setPlotName(name+" ("+userTest.relationName()+")");
	
	try {
	  m_CurrentVis.addPlot(predData);
	} catch (Exception ex) {
	  System.err.println(ex);
	}
	
	FastVector vv = new FastVector();
	vv.addElement(clusterer);
	if (trainHeader != null) vv.addElement(trainHeader);
	if (ignoredAtts != null) vv.addElement(ignoredAtts);
	if (saveVis) {
	  vv.addElement(m_CurrentVis);
	  if (grph != null) {
	    vv.addElement(grph);
	  }
	  
	}
	m_History.addObject(name, vv);
      }
    }
  }

  /**
   * Tests out the clusterer panel from the command line.
   *
   * @param args may optionally contain the name of a dataset to load.
   */
  public static void main(String [] args) {

    try {
      final javax.swing.JFrame jf =
	new javax.swing.JFrame("Weka Explorer: Cluster");
      jf.getContentPane().setLayout(new BorderLayout());
      final ClustererPanel sp = new ClustererPanel();
      jf.getContentPane().add(sp, BorderLayout.CENTER);
      weka.gui.LogPanel lp = new weka.gui.LogPanel();
      sp.setLog(lp);
      jf.getContentPane().add(lp, BorderLayout.SOUTH);
      jf.addWindowListener(new java.awt.event.WindowAdapter() {
	public void windowClosing(java.awt.event.WindowEvent e) {
	  jf.dispose();
	  System.exit(0);
	}
      });
      jf.pack();
      jf.setSize(800, 600);
      jf.setVisible(true);
      if (args.length == 1) {
	System.err.println("Loading instances from " + args[0]);
	java.io.Reader r = new java.io.BufferedReader(
			   new java.io.FileReader(args[0]));
	Instances i = new Instances(r);
	sp.setInstances(i);
      }
    } catch (Exception ex) {
      ex.printStackTrace();
      System.err.println(ex.getMessage());
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -