| let points = [
|
| [2, 3, 0], [3, 4, 0], [1, 1, 0],
|
| [7, 8, 1], [6, 9, 1], [8, 7, 1]
|
| ];
|
| let testPoint = [4.5, 5.5];
|
|
|
| const ctx = document.getElementById('knnChart').getContext('2d');
|
| const colors = ['#1f77b4', '#ff7f0e', '#2ca02c'];
|
|
|
| let chart = new Chart(ctx, {
|
| type: 'scatter',
|
| data: {
|
| datasets: [
|
| {
|
| label: 'Class 0',
|
| data: points.filter(p => p[2] === 0).map(p => ({ x: p[0], y: p[1] })),
|
| backgroundColor: colors[0]
|
| },
|
| {
|
| label: 'Class 1',
|
| data: points.filter(p => p[2] === 1).map(p => ({ x: p[0], y: p[1] })),
|
| backgroundColor: colors[1]
|
| },
|
| {
|
| label: 'Test Point',
|
| data: [{ x: testPoint[0], y: testPoint[1] }],
|
| backgroundColor: 'black',
|
| pointStyle: 'triangle',
|
| radius: 7
|
| }
|
| ]
|
| },
|
| options: {
|
| responsive: true,
|
| plugins: {
|
| legend: { position: 'top' },
|
| title: { display: true, text: 'KNN Classification Plot' }
|
| },
|
| scales: {
|
| x: { type: 'linear', position: 'bottom' },
|
| y: { type: 'linear' }
|
| }
|
| }
|
| });
|
|
|
| async function sendToServer() {
|
| const k = document.getElementById('k-value').value;
|
|
|
| const response = await fetch('/knn_visual_predict', {
|
| method: 'POST',
|
| headers: { 'Content-Type': 'application/json' },
|
| body: JSON.stringify({ points, test_point: testPoint, k })
|
| });
|
|
|
| const result = await response.json();
|
|
|
| document.getElementById('output').innerHTML =
|
| `Prediction: <strong>Class ${result.prediction}</strong>`;
|
|
|
|
|
| const neighborLayer = {
|
| label: 'Nearest Neighbors',
|
| data: result.neighbors.map(p => ({ x: p[0], y: p[1] })),
|
| backgroundColor: '#d62728',
|
| pointStyle: 'rect',
|
| radius: 6
|
| };
|
|
|
| chart.data.datasets = chart.data.datasets.slice(0, 3).concat([neighborLayer]);
|
| chart.update();
|
| } |