51 lines
1.4 KiB
Dart
51 lines
1.4 KiB
Dart
// ignore_for_file: file_names
|
|
|
|
import 'dart:math';
|
|
|
|
class PerhitunganKNN {
|
|
List<List<double>> features;
|
|
List<String> labels;
|
|
|
|
PerhitunganKNN(this.features, this.labels);
|
|
|
|
Map<String, dynamic> classify(List<double> newPoint, int k) {
|
|
List<Map<String, dynamic>> distances = [];
|
|
|
|
// Hitung jarak dari newPoint ke setiap titik dalam features
|
|
for (int i = 0; i < features.length; i++) {
|
|
double dist = euclideanDistance(features[i], newPoint);
|
|
distances.add({'index': i, 'distance': dist});
|
|
}
|
|
|
|
// Urutkan berdasarkan jarak
|
|
distances.sort((a, b) => a['distance'].compareTo(b['distance']));
|
|
|
|
// Pilih K tetangga terdekat
|
|
Map<String, int> votes = {};
|
|
List<String> nearestNeighbors = [];
|
|
for (int i = 0; i < k; i++) {
|
|
String label = labels[distances[i]['index']];
|
|
nearestNeighbors.add(label);
|
|
votes[label] = votes.containsKey(label) ? votes[label]! + 1 : 1;
|
|
}
|
|
|
|
// Tentukan mayoritas kelas dari K tetangga terdekat
|
|
String majorityLabel =
|
|
votes.entries.reduce((a, b) => a.value > b.value ? a : b).key;
|
|
|
|
return {
|
|
'result': majorityLabel,
|
|
'nearestNeighbors': nearestNeighbors,
|
|
'distances': distances
|
|
};
|
|
}
|
|
|
|
double euclideanDistance(List<double> p1, List<double> p2) {
|
|
double sum = 0.0;
|
|
for (int i = 0; i < p1.length; i++) {
|
|
sum += pow((p1[i] - p2[i]), 2);
|
|
}
|
|
return sqrt(sum);
|
|
}
|
|
}
|