import java.lang.reflect.*; import java.util.*; import javax.swing.*; import java.io.*; import javax.swing.event.*; import java.awt.*; import java.text.*; public class LABOR { Object Perzeptron; Method methodeLernen; Method methodeBerechne; ArrayList Trainingset = new ArrayList(); ArrayList listener = new ArrayList(); /* Das Labor-Objekt benötigt bei der Objekterzeugung ein Perzeptron, das * vorher schon erzeugt werden musste. Man kann es in BlueJ übergeben, * indem man einfach auf das Objekt klickt. */ public LABOR(Object perzeptron) throws Exception { Perzeptron = perzeptron; Class pClass = Perzeptron.getClass(); Method[] methods = pClass.getDeclaredMethods(); ArrayList mlist = new ArrayList(); // Auswertemethode finden for(int i=0;i set = (ArrayList)Trainingset.clone(); Collections.shuffle(set); for (Datapoint dp : set) { Object[] par = new Object[3]; par[0]=dp.x1; par[1]=dp.x2; par[2]=dp.label; try{ methodeLernen.invoke(Perzeptron, par); } catch(Exception exc){ } } UpdateListener(); } private double perzBerechne(double x1, double x2){ Object[] par = new Object[2]; par[0]=x1; par[1]=x2; double ret = -1; try{ ret= (double)methodeBerechne.invoke(Perzeptron,par); } catch(Exception e){} return ret; } private int testeAnhandTrainingsdaten(){ int fehler=0; for(Datapoint dp: Trainingset){ Object[] par = new Object[2]; par[0]=dp.x1; par[1]=dp.x2; try{ double l = (double)methodeBerechne.invoke(Perzeptron,par); if(l!=dp.label) fehler++; }catch(Exception exc){ } } return fehler; } /* * Die Methode testet, ob alle Trainingsdaten richtig klassifiziert werden. */ public void überprüfePerzeptron(){ int fehler = testeAnhandTrainingsdaten(); if(fehler==0){ JOptionPane.showMessageDialog(null,"Alle Trainingsdaten wurden richtig klassifiziert.\n" + "Ein weiteres Training ist nicht erforderlich"); } else{ JOptionPane.showMessageDialog(null,"Es wurden " + fehler + " Datenpunkte der Trainingsdaten\n" + "falsch klassifiziert."); } } /* * Die Delta-Lernregel wird auf alle Trainingsdaten angewendet, * bis entweder alle Trainingsdaten richtig klassifiziert werden, * oder die Anzahl der Wiederholungen den Wert des Übergabeparameters * überschreiten. */ public void trainiere(int maximaleAnzahlAnDurchläufen){ for(int i=0;imaxX1) maxX1=d.x1; if(d.x2>maxX2) maxX2=d.x2; if(d.x1maxX1) maxX1=d.x1; if(d.x2>maxX2) maxX2=d.x2; if(d.x1(); jButtonOk = new javax.swing.JButton(); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); if(type==BERECHNE) jLabel1.setText("Wählen Sie die Methode aus, die bewirkt, dass das Perzeptron einen Datenpunkt auswertet:"); else jLabel1.setText("Wählen Sie die Methode aus, die bewirkt, dass das Perzeptron einen Schritt der Delta-Lernregel durchführt:"); jListMethods.setModel(new javax.swing.AbstractListModel() { String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; public int getSize() { return strings.length; } public String getElementAt(int i) { return strings[i]; } }); jScrollPane1.setViewportView(jListMethods); jButtonOk.setText("Weiter"); jButtonOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonOkActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(jScrollPane1) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(jButtonOk)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jButtonOk) .addContainerGap(10, Short.MAX_VALUE)) ); pack(); }// private void jButtonOkActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } public void valueChanged(ListSelectionEvent e) { selectedMethodName = jListMethods.getSelectedValue(); } // Variables declaration - do not modify private javax.swing.JButton jButtonOk; private javax.swing.JLabel jLabel1; private javax.swing.JList jListMethods; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration } public class FormVisualization extends javax.swing.JFrame { ArrayList training; LABOR labor; public FormVisualization(){ initComponents(); training = new ArrayList(); setVisible(true); } public FormVisualization(LABOR l) { initComponents(); training = l.Trainingset; labor=l; setVisible(true); } /** * 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") // private void initComponents() { canvas = new MyCanvas(this); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jButtonClearDatapoints = new javax.swing.JButton(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); getContentPane().setLayout(null); canvas.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { canvasMouseClicked(evt); } }); getContentPane().add(canvas); canvas.setBounds(10,10,500, 500); jLabel1.setText("Rechter Mausklick: Datenpunkt mit Label 0 wird hinzugefügt"); getContentPane().add(jLabel1); jLabel1.setLocation(20, 540); jLabel1.setSize(500, 20); jLabel2.setText("Linker Mausklick: Datenpunkt mit Label 1 wird hinzugefügt"); getContentPane().add(jLabel2); jLabel2.setLocation(20,520); jLabel2.setSize(500, 20); jLabel3.setText("Klick auf Datenpunkt: Datenpunkt wird entfernt"); getContentPane().add(jLabel3); jLabel3.setLocation(20,560); jLabel3.setSize(500, 20); jButtonClearDatapoints.setActionCommand("
Alle Datenpunkte
löschen
"); jButtonClearDatapoints.setLabel("
Alle Datenpunkte
löschen
"); jButtonClearDatapoints.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButtonClearDatapointsMouseClicked(evt); } }); getContentPane().add(jButtonClearDatapoints); jButtonClearDatapoints.setBounds(370, 520, 140, 60); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { CloseHandler(); } }); pack(); this.setSize(540, 630); }//
private void CloseHandler(){ labor.listener.remove(this); } private void canvasMouseClicked(java.awt.event.MouseEvent evt) { Datapoint clickedPoint=canvas.isClicked(evt.getPoint().getX(), evt.getPoint().getY()); if(clickedPoint!=null){ training.remove(clickedPoint); } else{ double l=0; if(SwingUtilities.isLeftMouseButton(evt)) l=1; Datapoint p = new Datapoint(); double x = evt.getPoint().getX(); double y = 500.0-evt.getPoint().getY(); double minX1=-0.1; double minX2=-0.1; double maxX1=3; double maxX2=3; for(Datapoint d : training){ if(d.x1>maxX1) maxX1=d.x1; if(d.x2>maxX2) maxX2=d.x2; if(d.x1