Package fr.lip6.jkernelmachines.gui

Source Code of fr.lip6.jkernelmachines.gui.JkmsMainFrame

/**
    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
}
TOP

Related Classes of fr.lip6.jkernelmachines.gui.JkmsMainFrame

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.