From 4d31a5454732f34827f38ff582beaf3174e79649 Mon Sep 17 00:00:00 2001 From: Jan Bertram Date: Mon, 27 Nov 2023 14:47:09 +0100 Subject: [PATCH] updates Readme, initializes folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vorschlag für Vorgehen --- BlueJ-Origin/LABOR.java | 608 ++++++++++++++++++++++++++++++++++++++++ BlueJ-Origin/daten.csv | 25 ++ README.md | 18 +- 3 files changed, 650 insertions(+), 1 deletion(-) create mode 100644 BlueJ-Origin/LABOR.java create mode 100644 BlueJ-Origin/daten.csv diff --git a/BlueJ-Origin/LABOR.java b/BlueJ-Origin/LABOR.java new file mode 100644 index 0000000..ba6bad2 --- /dev/null +++ b/BlueJ-Origin/LABOR.java @@ -0,0 +1,608 @@ +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