JavaFX: K-NN Decision Boundary plotten (Mesh-Grid, Polylines, ... ?? )

Bitte aktiviere JavaScript!
Moin zusammen,

ich beschäfige mich im Moment mit Mustererkennung und möchte die Ergebnisse verschiedener Klassifizierungen irgendwie grafisch darstellen.
Bin absolut kein Frontend-Entwickler, aber habe mich dafür entschieden bei dem Thema mal etwas mit JavaFX rumzuspielen.

Ziel des Ganzen ist es, verschiedene Bewegungen (Laufen, Rennen, Treppe steigen, etc. pp.) anhand bestimmter Merkmale zu klassifizieren.
Werde jetzt Schritt für Schritt bestimmte Algorithmen einbinden und das immer für 2 Dimensionen plotten. Habe für die Darstellung der Punkte einen Linechart. Lineare Klassifizierer lassen sich jetzt auch leicht als Gerade darstellen. Bei dem K-Nearest-Neighbours Algorithmus tue ich mich jetzt etwas schwer, die Decision Boundary zu finden und vernünftig einzublenden.

Die GUI sieht im Moment so aus:
11855

Der K-NN Algorithmus an sich ist ja ziemlich leicht, mit dem Plotten der Decision Boundary in JavaFX tue ich mich etwas schwerer.
Würde gerne sowas erreichen:

Vllt. hat jemand eine Idee, wie man sowas in JavaFX darstellen kann. Irgendeine Art 2D-Mesh-Grid auf den Hintergrund legen und die einzelnen Polygone füllen? Oder irgendwie die Boundary-Polylines ermitteln und den Inhalt "unter" den Polylines dann einfärben?

Gibt echt etliche Beispiele für Python, R, und Matlab aber mit welchen Elementen man sowas mit JavaFX am besten erreichen kann, hab ich nicht gefunden.

Vllt. hat da von euch einer etwas mehr Ahnung ;)

Gruß

#Edit: Mist, jetzt seh ich erst, dass es extra ein Unterforum für JavaFX etc. gibt, vllt. kann das jemand verschieben, danke.
 
Zuletzt bearbeitet:
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Falls nochmal jemand ein ähnliches Problem haben sollte:

Ich habs inzwischen so umgesetzt, dass ich eine Unterklasse "CustomLineChart" von LineChart erstellt habe, dann lassen sich beliebige Nodes zum Chart hinzufügen.

Habe jetzt beispielsweise zwei Listen, eine mit den Trainingspunkten, die zweite mit einer Art Grid von Rechtecken,
um für jeden Rasterpunkt die zugehörige Klasse zu bestimmen. Die Recktecke berechne ich einmal, füge Sie hinzu und kann dann in der "layoutPlotChildren" Methode nur noch die Position updaten:
Java:
@Override
protected void layoutPlotChildren() {
    super.layoutPlotChildren();

    if (CollectionUtils.isNotEmpty(additionalPointsToPlot) && CollectionUtils.isNotEmpty(additionalPlottedShapes)) {
        AtomicInteger i = new AtomicInteger(0);

        double minX = additionalPointsToPlot.stream().mapToDouble(e -> (double) e.getX()).min().getAsDouble();
        double maxX = additionalPointsToPlot.stream().mapToDouble(e -> (double) e.getX()).max().getAsDouble();
        double minY = additionalPointsToPlot.stream().mapToDouble(e -> (double) e.getY()).min().getAsDouble();
        double maxY = additionalPointsToPlot.stream().mapToDouble(e -> (double) e.getY()).max().getAsDouble();


        double shapeWidth = (getXAxis().getDisplayPosition(maxX) - getXAxis().getDisplayPosition(minX)) / PlotUtils.POINTS_PER_ROW;
        double shapeHeight = (getYAxis().getDisplayPosition(minY) - getYAxis().getDisplayPosition(maxY)) / PlotUtils.POINTS_PER_COLUMN;

        additionalPlottedShapes.forEach(e -> {
            e.setX(getXAxis().getDisplayPosition(additionalPointsToPlot.get(i.get()).getX()));
            e.setY(getYAxis().getDisplayPosition(additionalPointsToPlot.get(i.get()).getY()));
            e.setWidth(shapeWidth);
            e.setHeight(shapeHeight);
            e.toBack();
            i.getAndIncrement();
        });
    }
}


Sieht dann im Ergebnis aus:



Nicht perfekt, aber für meine Zwecke erstmal ausreichend.

Vllt. hilft es der Nachwelt nochmal irgendwann ;)
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Oben