📄 clustererpanel.java
字号:
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 + -