Neuronale Netze in Java mit dem Neuroph 2.6 und JavaFX 2.0


Das neu veröffentlichte Neuroph 2.6 führt viele neue Features in der Performance und Anwendbarkeit in Android ein.


von Margarita Steinhauer, Valentin Steinhauer

 

Einführung

 

Einige Eigenschaften des Neuroph 2.6 wurden schon in früheren Publikationen beschrieben. An dieser Stelle möchten wir eine Anwendung zur

 Verfügung zu stellen, die einerseits Fraud Detection und andererseits die Anwendung von Neuroph 2.6 behandelt.

 

Einfache Identifizierung mittels Tippmustern

Die zugrunde liegende Idee ist beruht auf einer simplen Gegebenheit: Jeder Mensch weist ein einzigartiges Muster im Tippverhalten auf [1]. Dieses kann

 dazu verwendet werden, um Menschen voneinander, z.B. bei Eingabe von Passwörtern, zu unterscheiden und neuronale Netze damit individuell zu

 trainieren. Um die Implementierung zu vereinfachen, verwenden wir hier ein Beispiel mit einem einzigen Wort: „Muster“. Dazu definieren wir für das

 neuronale Netz die Intervalle zwischen den Buchstaben als Inputvektoren. Den Output beim Training nennen wir die Person. Am Ende werden wir nur

 zwischen zwei Personen unterscheiden. Als Umgebung verwenden wir JavaFX 2.0.

 

Trainingssätze

Nach den durchgeführten Messungen auf einem bestimmten Rechner liegen uns folgende Werte vor:

Person 1

double[] datal1 = {440. / datamax, 454. / datamax, 336. / datamax, 287. / datamax, 224. / datamax};

double[] resl1 = {100. / datamax};

double[] datal2 = {431. / datamax, 457. / datamax, 431. / datamax, 336. / datamax, 200. / datamax};

double[] resl2 = {100. / datamax};

double[] datal3 = {400. / datamax, 353. / datamax, 240. / datamax, 152. / datamax, 152. / datamax};

double[] resl3 = {100. / datamax};

Person 2

double[] datav1 = {328. / datamax, 391. / datamax, 272. / datamax, 272. / datamax, 192. / datamax};

double[] resv1 = {900. / datamax};

double[] datav2 = {287. / datamax, 369. / datamax, 272. / datamax, 256. / datamax, 183. / datamax};

double[] resv2 = {900. / datamax};

double[] datav3 = {255. / datamax, 360. / datamax, 263. / datamax, 232. / datamax, 177. / datamax};

double[] resv3 = {900. / datamax};

TrainingSet trainingSet = new TrainingSet();

trainingSet.addElement(new SupervisedTrainingElement(datal1, resl1));

trainingSet.addElement(new SupervisedTrainingElement(datal2, resl2));

trainingSet.addElement(new SupervisedTrainingElement(datal3, resl3));

trainingSet.addElement(new SupervisedTrainingElement(datav1, resv1));

trainingSet.addElement(new SupervisedTrainingElement(datav2, resv2));

trainingSet.addElement(new SupervisedTrainingElement(datav3, resv3));


Im Vergleich zu Neuroph Version 2.5 sind die Werte in Arrays statt Vektoren verpackt. Eine Normierung (bei datamax) besteht aus einer einfachen

 Division auf 1.000 (msc). Wie wir schon früher gezeigt haben, müssen die Resultate nicht auf der Grenze liegen. Deswegen wurde der Wert 100 für die

 erste Person und 900 für die zweite Person angegeben.  

 

Training der Netze

Als Netztopologie wird Multi Layer Perzeptron verwendet.


int maxIterations = 10000;

 

neuralNet = new MultiLayerPerceptron(5, 11, 1);

 

((LMS) neuralNet.getLearningRule()).setMaxError(0.0001);//0-1

 

((LMS) neuralNet.getLearningRule()).setLearningRate(0.60);//0-1

 

((LMS) neuralNet.getLearningRule()).setMaxIterations(maxIterations);//0-1

 

neuralNet.learn(trainingSet);

 

 

 


Die Parameter des Netzes sind identisch in allen Beispielen: Maximale Zahl der Iterationen: 10.000; Topologieparameter: 5, 11, 1 (5 Inputwerte, 11

 

 Neuronen in der Zwischenschicht und ein Neuron für das Resultat).

 

 


Kontrolle der Netze

Um trainierte Netze zu testen, nehmen wir einen Trainingssatz und prüfen, ob das Resultat mit der Erwartung übereinstimmt:

neuralNet.setInput(datal1);

neuralNet.calculate();

double[] networkOutput = neuralNet.getOutput();

double predicted = networkOutput[0];

System.out.println("PREDICTED:" + predicted);


Layout

Das Layout ist in JavaFX gestaltet und besteht aus einem Label, einem Eingabefeld und einer Ausgabenachricht.

…........................................................

NeuralNetwork neuralNet;

double datamax = 1000.0D; //normalize

BorderPane borderPane = new BorderPane();

ArrayList arrayList = new ArrayList();

Label message = new Label("");

…..............................................................

text();

primaryStage.setTitle("Simple Fraud Detection");

primaryStage.setScene(new Scene(borderPane, 640, 400));

primaryStage.show();


Die Befehle „text()“ und „button()“ messen die zeitlichen Abstände zwischen dem Tippverhalten im Textfeld und binden die Elemente an das BorderPanel.


private void text() {

       final TextField textBox = new TextField();

       textBox.setPromptText("your text: muster, please tip");

       textBox.setOnKeyPressed(new EventHandler<KeyEvent>() {

           @Override

           public void handle(KeyEvent ke) {

               Date date = new Date();

               arrayList.add(date);

               //System.out.println("Key Pressed: " + ke.getText() + " msec:" + date.getTime());

           }

       });

       textBox.setOnKeyReleased(new EventHandler<KeyEvent>() {

           @Override

           public void handle(KeyEvent ke) {

           }

       });

       textBox.setOnKeyTyped(new EventHandler<KeyEvent>() {

           @Override

           public void handle(KeyEvent ke) {

           }

       });        

       Button btn = button();        

       final VBox vbox = new VBox();

       vbox.setSpacing(5);

       vbox.getChildren().addAll(textBox,btn,message);

       vbox.setPadding(new Insets(10, 10, 10, 10));

       borderPane.setCenter(vbox);

 }


Im Befehl „button()“ werden die Daten zusammengestellt, normiert und mit dem ML Perzeptron bewertet.


private Button button() {

       Button btn = new Button();

       btn.setText("Login");

       btn.setOnAction(

               new EventHandler<ActionEvent>() {

                   @Override

                   public void handle(ActionEvent event) {

                       System.out.println("Pushed");

                       double[] testdata = new double[5];

                       for (int i = 1; i < arrayList.size(); i++) {

                           Long diff = ((Date) arrayList.get(i)).getTime() - ((Date) arrayList.get(i - 1)).getTime();

                           System.out.println(diff);

                           if (i <= 5) {

                               testdata[i - 1] = diff / datamax;

                               if (i == 5) {

                                   neuralNet.setInput(testdata);

                                   neuralNet.calculate();

                                   double[] networkOutput = neuralNet.getOutput();

                                   double predicted = networkOutput[0] * datamax;

                                   System.out.println("LIVE PREDICTED:" + predicted);

                                   double v = Math.abs(900.0 - predicted);

                                   double l = Math.abs(100.0 - predicted);

                                   if (v > l) {

                                       message.setText("Hallo Person 1!");

                                       System.out.println("Hallo Person 1!");

                                   } else {

                                       message.setText("Hallo Person 2!");

                                       System.out.println("Hallo Person2!");

                                   }

                                   arrayList = new ArrayList();

                               }

                           }

                       }

                   }

               });

       return btn;

  }

Erkennungstest

Hier erfolgt eine Darstellung des Ergebnisses in Form von Screenshots.

Abbildung 1: Leeres Eingabefeld in unserer Oberfläche.


Abbildung 2: Korrekte Erkennung von Person 2 nach Eingabe des Beispielwortes „Muster“.


Fazit

 

Diese simple Anwendung dient nun als eine Vorlage für weitere Fraud Situationen.


Margarita Steinhauer ist M. Sc. Biologie.


Dr.Valentin Steinhauer arbeitet bei der Devoteam GmbH in Weiterstadt. Er verfügt über langjährige Erfahrung aus B2B und B2C

 

 

 Softwareprojekten als Coach, Trainer, Architekt, Teamleiter und Entwickler.

 

 

 


Download the NetBeans projects with source