📄 clustererpanel.java
字号:
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 clusterer the clusterer to evaluate * @param trainHeader the header of the training set * @param ignoredAtts ignored attributes */ protected void reevaluateModel(final String name, final Clusterer clusterer, final Instances trainHeader, final int[] ignoredAtts) { if (m_RunThread == null) { m_StartBut.setEnabled(false); m_StopBut.setEnabled(true); m_ignoreBut.setEnabled(false); m_RunThread = new Thread() { public void run() { // Copy the current state of things m_Log.statusMessage("Setting up..."); 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"); m_Log.logMessage("Started reevaluate model"); if (m_Log instanceof TaskLogger) { ((TaskLogger)m_Log).taskStarted(); } 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(ClustererPanel.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); } if (isInterrupted()) { m_Log.logMessage("Interrupted reevaluate model"); m_Log.statusMessage("See error log"); } m_RunThread = null; m_StartBut.setEnabled(true); m_StopBut.setEnabled(false); m_ignoreBut.setEnabled(true); if (m_Log instanceof TaskLogger) { ((TaskLogger)m_Log).taskFinished(); } } } }; m_RunThread.setPriority(Thread.MIN_PRIORITY); m_RunThread.start(); } } /** * updates the capabilities filter of the GOE * * @param filter the new filter to use */ protected void updateCapabilitiesFilter(Capabilities filter) { if (filter == null) { m_ClustererEditor.setCapabilitiesFilter(new Capabilities(null)); return; } // clusterer don't need the class attribute, so we can skip that here m_ClustererEditor.setCapabilitiesFilter(filter); } /** * method gets called in case of a change event * * @param e the associated change event */ public void capabilitiesFilterChanged(CapabilitiesFilterChangeEvent e) { updateCapabilitiesFilter((Capabilities) e.getFilter().clone()); } /** * 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 + -