/**
This file is part of JkernelMachines.
JkernelMachines is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
JkernelMachines is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with JkernelMachines. If not, see <http://www.gnu.org/licenses/>.
Copyright David Picard - 2014
*/
package fr.lip6.jkernelmachines.gui;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import fr.lip6.jkernelmachines.classifier.DoublePegasosSVM;
import fr.lip6.jkernelmachines.classifier.DoubleQNPKL;
import fr.lip6.jkernelmachines.classifier.DoubleSAG;
import fr.lip6.jkernelmachines.classifier.KernelSVM;
import fr.lip6.jkernelmachines.classifier.LaSVM;
import fr.lip6.jkernelmachines.classifier.SMOSVM;
import fr.lip6.jkernelmachines.classifier.SimpleMKL;
import fr.lip6.jkernelmachines.evaluation.AccuracyEvaluator;
import fr.lip6.jkernelmachines.evaluation.ApEvaluator;
import fr.lip6.jkernelmachines.evaluation.FScoreEvaluator;
import fr.lip6.jkernelmachines.evaluation.PrecisionEvaluator;
import fr.lip6.jkernelmachines.io.LibSVMImporter;
import fr.lip6.jkernelmachines.kernel.Kernel;
import fr.lip6.jkernelmachines.kernel.typed.DoubleGaussL2;
import fr.lip6.jkernelmachines.kernel.typed.DoubleHPolynomial;
import fr.lip6.jkernelmachines.kernel.typed.DoubleLinear;
import fr.lip6.jkernelmachines.kernel.typed.DoublePolynomial;
import fr.lip6.jkernelmachines.kernel.typed.DoubleTriangleL2;
import fr.lip6.jkernelmachines.projection.DoublePCA;
import fr.lip6.jkernelmachines.type.TrainingSample;
import fr.lip6.jkernelmachines.util.DataPreProcessing;
import fr.lip6.jkernelmachines.util.DebugPrinter;
/**
* GUI for performing simple train/test of datasets
*
* @author David Picard
*/
public class JkmsMainFrame extends javax.swing.JFrame {
private static final long serialVersionUID = 1L;
List<TrainingSample<double[]>> train;
List<TrainingSample<double[]>> test;
Model model;
/**
* Creates new form JkmsMainFrame
*/
public JkmsMainFrame() {
setTitle("JkmsGUI");
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
// <editor-fold defaultstate="collapsed"
// desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
trainPanel = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
jLabel2 = new javax.swing.JLabel();
filetypeBox = new javax.swing.JComboBox();
importButton = new javax.swing.JButton();
datasetInfo = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jSeparator2 = new javax.swing.JSeparator();
pcaBox = new javax.swing.JCheckBox();
whiteBox = new javax.swing.JCheckBox();
normBox = new javax.swing.JCheckBox();
jLabel4 = new javax.swing.JLabel();
jSeparator3 = new javax.swing.JSeparator();
jLabel5 = new javax.swing.JLabel();
classifierBox = new javax.swing.JComboBox();
jLabel6 = new javax.swing.JLabel();
kernelBox = new javax.swing.JComboBox();
jLabel7 = new javax.swing.JLabel();
regularizationField = new javax.swing.JTextField();
jLabel8 = new javax.swing.JLabel();
jSeparator4 = new javax.swing.JSeparator();
trainButton = new javax.swing.JButton();
saveButton = new javax.swing.JButton();
loadButton = new javax.swing.JButton();
jLabel9 = new javax.swing.JLabel();
classnameLabel = new javax.swing.JLabel();
jLabel10 = new javax.swing.JLabel();
svLabel = new javax.swing.JLabel();
jLabel14 = new javax.swing.JLabel();
kernelParamTextField = new javax.swing.JTextField();
testPanel = new javax.swing.JPanel();
jLabel11 = new javax.swing.JLabel();
jSeparator5 = new javax.swing.JSeparator();
jLabel12 = new javax.swing.JLabel();
testFiletypeBox = new javax.swing.JComboBox();
testImportButton = new javax.swing.JButton();
testDatasetInfo = new javax.swing.JLabel();
jLabel13 = new javax.swing.JLabel();
jSeparator6 = new javax.swing.JSeparator();
evaluationButton = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
resultTextArea = new javax.swing.JTextArea();
aboutPanel = new javax.swing.JPanel();
jLabel15 = new javax.swing.JLabel();
jLabel16 = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText("Import dataset");
jLabel2.setText("Filetype:");
filetypeBox.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "libsvm" }));
importButton.setText("Import");
importButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
importButtonActionPerformed(evt);
}
});
datasetInfo.setText("Instances: 0 Dimension: 0");
jLabel3.setText("Preprocessing");
pcaBox.setText("PCA");
whiteBox.setText("Whitening");
normBox.setText("L2 Normalization");
jLabel4.setText("Model");
jLabel5.setText("Classifier type:");
classifierBox.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "lasvm", "smo", "sag", "pegasos", "simplemkl",
"qnpkl" }));
jLabel6.setText("Kernel:");
kernelBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
"GaussianL2", "TriangleL2", "Polynomial", "HPolynomial",
"Linear" }));
jLabel7.setText("Regularization parameter:");
regularizationField.setText("1.0");
jLabel8.setText("Train");
trainButton.setText("Train");
trainButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
trainButtonActionPerformed(evt);
}
});
saveButton.setText("Save");
saveButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveButtonActionPerformed(evt);
}
});
loadButton.setText("Load");
loadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadButtonActionPerformed(evt);
}
});
jLabel9.setText("Classname:");
classnameLabel.setText("null");
jLabel10.setText("Number of support vectors:");
svLabel.setText("0");
jLabel14.setText("parameter:");
kernelParamTextField.setText("2");
javax.swing.GroupLayout trainPanelLayout = new javax.swing.GroupLayout(
trainPanel);
trainPanel.setLayout(trainPanelLayout);
trainPanelLayout
.setHorizontalGroup(trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel1)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator1))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel2)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
filetypeBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(
importButton))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel3)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator2))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel4)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator3))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel8)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator4))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
datasetInfo)
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
pcaBox)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
whiteBox)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
normBox))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel5)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
classifierBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel7)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
regularizationField,
javax.swing.GroupLayout.PREFERRED_SIZE,
50,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
trainButton)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
saveButton)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
loadButton))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel9)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
classnameLabel))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel10)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
svLabel))
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addComponent(
jLabel6)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
kernelBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jLabel14)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
kernelParamTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
42,
javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0,
355,
Short.MAX_VALUE)))
.addContainerGap()));
trainPanelLayout
.setVerticalGroup(trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
trainPanelLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(
jSeparator1,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(
filetypeBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
importButton))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(datasetInfo)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel3)
.addComponent(
jSeparator2,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(pcaBox)
.addComponent(whiteBox)
.addComponent(normBox))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel4)
.addComponent(
jSeparator3,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(
classifierBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(
kernelBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel14)
.addComponent(
kernelParamTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel7)
.addComponent(
regularizationField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel8)
.addComponent(
jSeparator4,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
trainButton)
.addComponent(
saveButton)
.addComponent(
loadButton))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel9)
.addComponent(
classnameLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
trainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel10)
.addComponent(svLabel))
.addContainerGap(47, Short.MAX_VALUE)));
jTabbedPane1.addTab("Train model", trainPanel);
jLabel11.setText("Import dataset");
jLabel12.setText("Filetype:");
testFiletypeBox.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "libsvm" }));
testImportButton.setText("Import");
testImportButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testImportButtonActionPerformed(evt);
}
});
testDatasetInfo.setText("Instances: 0 Dimension: 0");
jLabel13.setText("Results");
evaluationButton.setText("Evaluate");
evaluationButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
evaluationButtonActionPerformed(evt);
}
});
resultTextArea.setColumns(20);
resultTextArea.setRows(5);
jScrollPane1.setViewportView(resultTextArea);
javax.swing.GroupLayout testPanelLayout = new javax.swing.GroupLayout(
testPanel);
testPanel.setLayout(testPanelLayout);
testPanelLayout
.setHorizontalGroup(testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
testPanelLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jScrollPane1,
javax.swing.GroupLayout.DEFAULT_SIZE,
685,
Short.MAX_VALUE)
.addGroup(
testPanelLayout
.createSequentialGroup()
.addComponent(
jLabel11)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator5))
.addGroup(
testPanelLayout
.createSequentialGroup()
.addComponent(
jLabel12)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
testFiletypeBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(
testImportButton))
.addGroup(
testPanelLayout
.createSequentialGroup()
.addComponent(
jLabel13)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jSeparator6))
.addGroup(
testPanelLayout
.createSequentialGroup()
.addGroup(
testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
testDatasetInfo)
.addComponent(
evaluationButton))
.addGap(0,
0,
Short.MAX_VALUE)))
.addContainerGap()));
testPanelLayout
.setVerticalGroup(testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
testPanelLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(
jSeparator5,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel11))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel12)
.addComponent(
testFiletypeBox,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
testImportButton))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(testDatasetInfo)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
testPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel13)
.addComponent(
jSeparator6,
javax.swing.GroupLayout.PREFERRED_SIZE,
10,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(evaluationButton)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(
jScrollPane1,
javax.swing.GroupLayout.DEFAULT_SIZE,
299, Short.MAX_VALUE)
.addContainerGap()));
jTabbedPane1.addTab("Test model", testPanel);
jLabel15.setText("jkernelmachines © 2014 David Picard - picard@ensea.fr");
jLabel16.setText("Please, don't forget to cite us in your papers, reports, manuscripts, etc:");
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jTextArea1
.setText(" JKernelMachines: A Simple Framework for Kernel Machines\nDavid Picard, Nicolas Thome, Matthieu Cord; \nJournal of Machine Learning Research, 14(May):1417−1421, 2013.\n\nBibtex:\n@article{JMLR:v14:picard13a,\n author = {David Picard and Nicolas Thome and Matthieu Cord},\n title = {JKernelMachines: A Simple Framework for Kernel Machines},\n journal = {Journal of Machine Learning Research},\n year = {2013},\n volume = {14},\n pages = {1417-1421},\n url = {http://jmlr.org/papers/v14/picard13a.html}\n}\n");
jScrollPane2.setViewportView(jTextArea1);
javax.swing.GroupLayout aboutPanelLayout = new javax.swing.GroupLayout(
aboutPanel);
aboutPanel.setLayout(aboutPanelLayout);
aboutPanelLayout
.setHorizontalGroup(aboutPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
aboutPanelLayout
.createSequentialGroup()
.addContainerGap()
.addGroup(
aboutPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jScrollPane2)
.addGroup(
aboutPanelLayout
.createSequentialGroup()
.addGroup(
aboutPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jLabel15)
.addComponent(
jLabel16))
.addGap(0,
196,
Short.MAX_VALUE)))
.addContainerGap()));
aboutPanelLayout
.setVerticalGroup(aboutPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
aboutPanelLayout
.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel15)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabel16)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(
jScrollPane2,
javax.swing.GroupLayout.DEFAULT_SIZE,
413, Short.MAX_VALUE)
.addContainerGap()));
jTabbedPane1.addTab("About", aboutPanel);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jTabbedPane1));
layout.setVerticalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jTabbedPane1));
pack();
}// </editor-fold>//GEN-END:initComponents
private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_importButtonActionPerformed
String file = "";
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
try {
file = chooser.getSelectedFile().getAbsolutePath();
train = LibSVMImporter.importFromFile(file);
datasetInfo.setText("Instances: " + train.size()
+ " Dimension: " + train.get(0).sample.length);
validate();
} catch (IOException ex) {
JOptionPane.showInternalMessageDialog(this,
"Error importing file " + file);
}
}
}// GEN-LAST:event_importButtonActionPerformed
private void trainButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_trainButtonActionPerformed
model = new Model();
model.dim = train.get(0).sample.length;
// perform preprocessing
List<TrainingSample<double[]>> localTrain;
if (pcaBox.isSelected()) {
model.pca = new DoublePCA();
model.pca.train(train);
model.pcaEnable = true;
model.whiteningEnable = whiteBox.isSelected();
localTrain = model.pca.projectList(train, whiteBox.isSelected());
} else {
localTrain = new ArrayList<TrainingSample<double[]>>(train.size());
localTrain.addAll(train);
if (whiteBox.isSelected()) {
model.whiteningEnable = true;
DataPreProcessing.reduceList(localTrain);
}
}
if (normBox.isSelected()) {
model.normalizationEnable = true;
DataPreProcessing.normalizeList(localTrain);
}
// train model
if ("lasvm"
.equalsIgnoreCase(classifierBox.getSelectedItem().toString())) {
Kernel<double[]> k = new DoubleLinear();
if ("GaussianL2".equalsIgnoreCase(kernelBox.getSelectedItem()
.toString())) {
k = new DoubleGaussL2(Double.parseDouble(kernelParamTextField
.getText()));
} else if ("TriangleL2".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoubleTriangleL2(
Double.parseDouble(kernelParamTextField.getText()));
} else if ("Polynomial".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoublePolynomial(Integer.parseInt(kernelParamTextField
.getText()));
} else if ("HPlolynomial".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoubleHPolynomial(Integer.parseInt(kernelParamTextField
.getText()));
}
LaSVM<double[]> svm = new LaSVM<double[]>(k);
svm.setC(Double.parseDouble(regularizationField.getText()));
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
double[] alphas = svm.getAlphas();
int sv = 0;
for (int s = 0; s < alphas.length; s++) {
if (alphas[s] != 0) {
sv++;
}
}
svLabel.setText("" + sv);
validate();
// save current classifier
model.classifier = svm;
} else if ("smo".equalsIgnoreCase(classifierBox.getSelectedItem()
.toString())) {
Kernel<double[]> k = new DoubleLinear();
if ("GaussianL2".equalsIgnoreCase(kernelBox.getSelectedItem()
.toString())) {
k = new DoubleGaussL2(Double.parseDouble(kernelParamTextField
.getText()));
} else if ("TriangleL2".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoubleTriangleL2(
Double.parseDouble(kernelParamTextField.getText()));
} else if ("Polynomial".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoublePolynomial(Integer.parseInt(kernelParamTextField
.getText()));
} else if ("HPlolynomial".equalsIgnoreCase(kernelBox
.getSelectedItem().toString())) {
k = new DoubleHPolynomial(Integer.parseInt(kernelParamTextField
.getText()));
}
SMOSVM<double[]> svm = new SMOSVM<double[]>(k);
svm.setC(Double.parseDouble(regularizationField.getText()));
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
double[] alphas = svm.getAlphas();
int sv = 0;
for (int s = 0; s < alphas.length; s++) {
if (alphas[s] != 0) {
sv++;
}
}
svLabel.setText("" + sv);
validate();
// save current classifier
model.classifier = svm;
} else if ("sag".equalsIgnoreCase(classifierBox.getSelectedItem()
.toString())) {
DoubleSAG svm = new DoubleSAG();
svm.setLambda(1. / (train.size() * Double
.parseDouble(regularizationField.getText())));
svm.setE(10);
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
svLabel.setText("N/A");
// save current classifier
model.classifier = svm;
} else if ("pegasos".equalsIgnoreCase(classifierBox.getSelectedItem()
.toString())) {
DoublePegasosSVM svm = new DoublePegasosSVM();
svm.setLambda(1. / (train.size() * Double
.parseDouble(regularizationField.getText())));
svm.setK(train.size() / 20);
svm.setT(10 * train.size());
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
svLabel.setText("N/A");
// save current classifier
model.classifier = svm;
} else if ("simplemkl".equalsIgnoreCase(classifierBox.getSelectedItem()
.toString())) {
SimpleMKL<double[]> svm = new SimpleMKL<double[]>();
svm.setC(Double.parseDouble(regularizationField.getText()));
double[] G = { 0.05, 0.1, 0.2, 0.4, 0.8, 1.6, 3.2, 6.4, 12.8, 25.6 };
// int dim = train.get(0).sample.length;
for (double g : G) {
svm.addKernel(new DoubleGaussL2(g));
// // for(int i = 0 ; i < dim ; i++) {
// // IndexDoubleGaussL2 k = new IndexDoubleGaussL2(i);
// // k.setGamma(g);
// // svm.addKernel(k);
// // }
}
for (int d = 1; d < 5; d++) {
svm.addKernel(new DoublePolynomial(d));
svm.addKernel(new DoubleHPolynomial(d));
}
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
double[] alphas = svm.getAlphas();
int sv = 0;
for (int s = 0; s < alphas.length; s++) {
if (alphas[s] != 0) {
sv++;
}
}
svLabel.setText("" + sv);
validate();
// save current classifier
model.classifier = svm;
} else if ("qnpkl".equalsIgnoreCase(classifierBox.getSelectedItem()
.toString())) {
DoubleQNPKL svm = new DoubleQNPKL();
svm.setC(Double.parseDouble(regularizationField.getText()));
DebugPrinter.setDebugLevel(2);
svm.train(localTrain);
// info
classnameLabel.setText(svm.getClass().getSimpleName());
double[] alphas = svm.getAlphas();
int sv = 0;
for (int s = 0; s < alphas.length; s++) {
if (alphas[s] != 0) {
sv++;
}
}
svLabel.setText("" + sv);
validate();
// save current classifier
model.classifier = svm;
}
}// GEN-LAST:event_trainButtonActionPerformed
private void testImportButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_testImportButtonActionPerformed
String file = "";
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
try {
file = chooser.getSelectedFile().getAbsolutePath();
test = LibSVMImporter.importFromFile(file);
testDatasetInfo.setText("Instances: " + test.size()
+ " Dimension: " + test.get(0).sample.length);
if (test.get(0).sample.length != model.dim) {
JOptionPane
.showMessageDialog(this,
"Error: test dataset dimension not compatible with current model.");
test = null;
}
validate();
} catch (IOException ex) {
JOptionPane.showInternalMessageDialog(this,
"Error importing file " + file);
}
}
}// GEN-LAST:event_testImportButtonActionPerformed
private void evaluationButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_evaluationButtonActionPerformed
List<TrainingSample<double[]>> localTest;
// early bail out
if (test == null) {
return;
}
// preprocessing
if (model != null && (model.pca != null) && pcaBox.isSelected()) {
localTest = model.pca.projectList(test, whiteBox.isSelected());
} else {
localTest = new ArrayList<TrainingSample<double[]>>(test.size());
localTest.addAll(test);
if (whiteBox.isSelected()) {
DataPreProcessing.reduceList(localTest);
}
}
if (normBox.isSelected()) {
DataPreProcessing.normalizeList(localTest);
}
resultTextArea.setText("");
resultTextArea.append("Model:\n\n");
resultTextArea.append("class:\t\t"
+ model.classifier.getClass().getSimpleName() + "\n");
if (model.classifier instanceof KernelSVM) {
resultTextArea.append("Kernel:\t\t"
+ ((KernelSVM<double[]>) model.classifier).getKernel().getClass()
.getSimpleName() + "\n");
}
resultTextArea.append("PCA:\t\t" + model.pcaEnable + "\n");
resultTextArea.append("Whitening:\t\t" + model.whiteningEnable + "\n");
resultTextArea
.append("Norm l2:\t\t" + model.normalizationEnable + "\n");
resultTextArea.append("\n\n");
// eval
resultTextArea.append("Results:\n\n");
AccuracyEvaluator<double[]> acc = new AccuracyEvaluator<double[]>();
acc.setClassifier(model.classifier);
acc.setTestingSet(localTest);
acc.evaluate();
resultTextArea.append("Accuracy:\t\t" + acc.getScore());
resultTextArea.append("\n");
PrecisionEvaluator<double[]> pr = new PrecisionEvaluator<double[]>();
pr.setClassifier(model.classifier);
pr.setTestingSet(localTest);
pr.evaluate();
resultTextArea.append("Precision:\t\t" + pr.getScore());
resultTextArea.append("\n");
ApEvaluator<double[]> ap = new ApEvaluator<double[]>();
ap.setClassifier(model.classifier);
ap.setTestingSet(localTest);
ap.evaluate();
resultTextArea.append("Average precision:\t" + ap.getScore());
resultTextArea.append("\n");
FScoreEvaluator<double[]> fs = new FScoreEvaluator<double[]>();
fs.setClassifier(model.classifier);
fs.setTestingSet(localTest);
fs.evaluate();
resultTextArea.append("FScore (beta=" + fs.getBeta() + "):\t"
+ fs.getScore());
resultTextArea.append("\n");
}// GEN-LAST:event_evaluationButtonActionPerformed
private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_saveButtonActionPerformed
JFileChooser jfc = new JFileChooser();
jfc.setDialogTitle("Save to file");
int ret = jfc.showSaveDialog(this);
if (ret == JFileChooser.APPROVE_OPTION) {
ObjectOutputStream oout = null;
try {
String filename = jfc.getSelectedFile().getAbsolutePath();
if (!filename.endsWith(".jkms")) {
filename += ".jkms";
}
oout = new ObjectOutputStream(new FileOutputStream(filename));
oout.writeObject(model);
oout.close();
} catch (FileNotFoundException e) {
JOptionPane
.showMessageDialog(this, "Error while saving model!");
} catch (IOException e) {
JOptionPane
.showMessageDialog(this, "Error while saving model!");
} finally {
try {
if (oout != null) {
oout.close();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this,
"Error while saving model!");
}
}
}
}// GEN-LAST:event_saveButtonActionPerformed
private void loadButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_loadButtonActionPerformed
JFileChooser jfc = new JFileChooser();
jfc.setDialogTitle("Choose model file");
jfc.setFileFilter(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().endsWith(".jkms");
}
@Override
public String getDescription() {
return "Select jkernelmachines model files (*.jkms)";
}
});
int ret = jfc.showOpenDialog(this);
if (ret == JFileChooser.APPROVE_OPTION) {
try {
ObjectInputStream oin = new ObjectInputStream(
new FileInputStream(jfc.getSelectedFile()));
model = (Model) oin.readObject();
oin.close();
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(this, "Error loading model!");
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Error loading model!");
} catch (ClassNotFoundException ex) {
JOptionPane.showMessageDialog(this, "Error loading model!");
}
if (model != null) {
pcaBox.setSelected(model.pcaEnable);
whiteBox.setSelected(model.whiteningEnable);
normBox.setSelected(model.normalizationEnable);
classnameLabel.setText(model.classifier.getClass()
.getSimpleName());
if (model.classifier instanceof KernelSVM) {
double[] alphas = ((KernelSVM<double[]>) model.classifier)
.getAlphas();
int sv = 0;
for (int s = 0; s < alphas.length; s++) {
if (alphas[s] != 0) {
sv++;
}
}
svLabel.setText("" + sv);
}
validate();
}
}
}// GEN-LAST:event_loadButtonActionPerformed
/**
* @param args
* the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
// <editor-fold defaultstate="collapsed"
// desc=" Look and feel setting code (optional) ">
/*
* If Nimbus (introduced in Java SE 6) is not available, stay with the
* default look and feel. For details see
* http://download.oracle.com/javase
* /tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(JkmsMainFrame.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(JkmsMainFrame.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(JkmsMainFrame.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(JkmsMainFrame.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
}
// </editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new JkmsMainFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel aboutPanel;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox classifierBox;
private javax.swing.JLabel classnameLabel;
private javax.swing.JLabel datasetInfo;
private javax.swing.JButton evaluationButton;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox filetypeBox;
private javax.swing.JButton importButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JSeparator jSeparator3;
private javax.swing.JSeparator jSeparator4;
private javax.swing.JSeparator jSeparator5;
private javax.swing.JSeparator jSeparator6;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTextArea jTextArea1;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox kernelBox;
private javax.swing.JTextField kernelParamTextField;
private javax.swing.JButton loadButton;
private javax.swing.JCheckBox normBox;
private javax.swing.JCheckBox pcaBox;
private javax.swing.JTextField regularizationField;
private javax.swing.JTextArea resultTextArea;
private javax.swing.JButton saveButton;
private javax.swing.JLabel svLabel;
private javax.swing.JLabel testDatasetInfo;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox testFiletypeBox;
private javax.swing.JButton testImportButton;
private javax.swing.JPanel testPanel;
private javax.swing.JButton trainButton;
private javax.swing.JPanel trainPanel;
private javax.swing.JCheckBox whiteBox;
// End of variables declaration//GEN-END:variables
}