You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于JavaFX绘制k-NN分类器决策边界的可行性问询

Drawing k-NN Decision Boundaries in JavaFX

Absolutely! You can absolutely render k-NN decision boundaries using standard JavaFX components—no external libraries required. Unlike linear classifiers (like your perceptron) with straight-line boundaries, k-NN’s boundaries are piecewise linear (and often irregular), so we’ll use a grid-sampling approach to map out class regions (and their implicit boundaries).

Here’s a step-by-step breakdown of how to implement this:

1. Choose the Right JavaFX Component

While you’re already using LineChart for data points, Canvas is the most flexible tool for drawing decision boundaries. You can either:

  • Overlay a Canvas on top of your LineChart (just make sure to sync coordinate systems), or
  • Use Canvas as your primary drawing surface (drawing both data points and boundaries directly).

2. Generate a Grid of Sample Points

Cover the entire range of your dataset with a dense grid of points. Each point will act as a "test" sample for your k-NN classifier.

  • Define the bounds of your data (min/max X and Y values).
  • Map these data bounds to your Canvas pixel coordinates (critical for accurate plotting).

3. Classify Each Grid Point

Run your existing k-NN classifier on every sample point in the grid to determine its predicted class.

4. Draw Class Regions or Boundaries

You have two main options here:

  • Option 1: Draw Class Colored Regions (most intuitive)
    For each grid point, fill a small rectangle (matching your grid step size) with a color corresponding to its predicted class. This creates a heatmap-like view of class regions, with boundaries naturally emerging between different colors.
  • Option 2: Draw Explicit Boundary Lines
    Compare adjacent grid points—if two neighboring points belong to different classes, mark the midpoint as a boundary point. Collect all these boundary points and connect them using Polyline or Line components.

Example Code Snippet (Canvas Approach)

Here’s a simplified example to get you started:

// Initialize your Canvas and GraphicsContext
Canvas canvas = new Canvas(800, 600);
GraphicsContext gc = canvas.getGraphicsContext2D();

// Define your data bounds (replace with your actual data ranges)
double minX = -5.0;
double maxX = 5.0;
double minY = -5.0;
double maxY = 5.0;

double canvasWidth = canvas.getWidth();
double canvasHeight = canvas.getHeight();
double gridStep = 4; // Smaller = smoother boundaries, but more computation

// Step 1: Draw class regions
for (double xPixel = 0; xPixel < canvasWidth; xPixel += gridStep) {
    for (double yPixel = 0; yPixel < canvasHeight; yPixel += gridStep) {
        // Convert pixel coordinates to data coordinates (fix y-axis inversion)
        double dataX = minX + (xPixel / canvasWidth) * (maxX - minX);
        double dataY = maxY - (yPixel / canvasHeight) * (maxY - minY);

        // Use your k-NN classifier to predict the class
        String predictedClass = yourKnnClassifier.predict(new DataPoint(dataX, dataY));

        // Set fill color based on class
        switch (predictedClass) {
            case "Class 1": gc.setFill(Color.LIGHTBLUE); break;
            case "Class 2": gc.setFill(Color.LIGHTCORAL); break;
            default: gc.setFill(Color.WHITE);
        }

        // Draw a small rectangle for the grid point
        gc.fillRect(xPixel, yPixel, gridStep, gridStep);
    }
}

// Step 2: Draw original data points on top
for (DataPoint point : yourDataset) {
    // Convert data coordinates back to pixel coordinates
    double xPixel = (point.getX() - minX) / (maxX - minX) * canvasWidth;
    double yPixel = (maxY - point.getY()) / (maxY - minY) * canvasHeight;

    // Draw a black circle for each data point
    gc.setFill(Color.BLACK);
    gc.fillOval(xPixel - 3, yPixel - 3, 6, 6);
}

Key Notes

  • Coordinate Conversion: JavaFX’s Canvas has its origin at the top-left corner, while most datasets use a bottom-up Y-axis. Make sure to invert the Y coordinate when converting between data and pixel space (as shown in the example).
  • Grid Step Size: Balance smoothness and performance. A smaller step gives cleaner boundaries but requires more computation—test with values between 2-10 pixels depending on your canvas size.
  • Overlaying on LineChart: If you want to keep using LineChart, you can add the Canvas as a child of the chart’s plot area. Use lookup(".chart-plot-background") to get the plot region, then set the canvas’s bounds to match it.

Final Thought

This approach leverages core JavaFX components (Canvas, GraphicsContext) and works seamlessly with your existing k-NN implementation. The grid-sampling method is straightforward and produces clear, visualizable decision boundaries.

内容的提问来源于stack exchange,提问作者FelRPI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:21:22