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
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.
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.
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.
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).
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);
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;
}
Hier erfolgt eine Darstellung des Ergebnisses in Form von Screenshots.
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.