Quick actions

cmd+k|ctrl+k

Navigation

Languages

KNN

Snippet info

Language

Cpp

Visibility

public

Author

karelerlangga67

Created

2024-08-28T06:43:44.133968Z

Updated

2024-08-28T06:43:44.133968Z

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;
}
INFO