TIF_E41202429/Mobile/patrolin/skripsi/lib/controller/cPerhitunganKNN.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);
}
}