include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
// Struktur untuk menyimpan data titik dan label
struct DataPoint {
std::vector<double> features;
int label;
};
// Fungsi untuk menghitung jarak Euclidean antara dua titik
double euclideanDistance(const std::vector<double>& a, const std::vector<double>& b) {
double sum = 0.0;
for (size_t i = 0; i < a.size(); ++i) {
sum += (a[i] - b[i]) * (a[i] - b[i]);
}
return std::sqrt(sum);
}
// Fungsi untuk melakukan KNN dan mengembalikan label prediksi
int knnClassify(const std::vector<DataPoint>& trainingData, const std::vector<double>& testPoint, int k) {
std::vector<std::pair<double, int>> distances;
// Hitung jarak dari titik uji ke setiap titik data latih
for (const auto& point : trainingData) {
double dist = euclideanDistance(testPoint, point.features);
distances.push_back({dist, point.label});
}
// Urutkan jarak dari yang terkecil ke yang terbesar
std::sort(distances.begin(), distances.end(),
[](const std::pair<double, int>& a, const std::pair<double, int>& b) {
return a.first < b.first;
});
// Hitung frekuensi label dari k tetangga terdekat
std::vector<int> labelCount(10, 0); // Anggap kita memiliki 10 label
for (int i = 0; i < k; ++i) {
labelCount[distances[i].second]++;
}
// Temukan label dengan frekuensi tertinggi
int maxCount = 0;
int predictedLabel = -1;
for (int i = 0; i < labelCount.size(); ++i) {
if (labelCount[i] > maxCount) {
maxCount = labelCount[i];
predictedLabel = i;
}
}
return predictedLabel;
}
int main() {
// Contoh data pelatihan
std::vector<DataPoint> trainingData = {
{{1.0, 2.0}, 0},
{{2.0, 3.0}, 0},
{{3.0, 3.0}, 1},
{{4.0, 5.0}, 1},
{{5.0, 5.0}, 1}
};
// Titik uji
std::vector<double> testPoint = {3.5, 4.0};
// Jumlah tetangga terdekat
int k = 3;
// Lakukan klasifikasi
int predictedLabel = knnClassify(trainingData, testPoint, k);
std::cout << "Prediksi label: " << predictedLabel << std::endl;
return 0;
}