Sobes.tech
Middle

k-ближайших көршілер алгоритмі (kNN) дегеніміз не?

sobes.tech AI

AI-дан жауап

kNN (k-жағындағы ең жақын көршілер) — бұл классификация және регрессия үшін қолданылатын параметрлік емес әдіс. Идеясы қарапайым: объект оның көршілерінің көп дауысымен жіктеледі, мұнда объект ең көп таралған класты оның k ең жақын көршілерінің арасында алады. Регрессия үшін, k ең жақын көршілердің белгілерінің орташа мәні болжау жасалады.

Негізгі аспектілер:

  • k параметрі: Шешім қабылдау кезінде ескерілуі керек ең жақын көршілер саны. k таңдау нәтижеге қатты әсер етеді. Кіші k шуға сезімтал болуы мүмкін, үлкен k жергілікті құрылымдарды елемеуі мүмкін.
  • Қашықтық метрикасы: Деректер нүктелерінің "жақындығын" анықтау үшін қолданылады. Ең кең таралғандары: евклидтік қашықтық, Манхэттен қашықтығы.
  • Ерекшеліктер:
    • "Кешігу" алгоритмі: оқыту жоқ немесе минималды (тек оқыту деректерін сақтау). Болжау сұрау кезінде ғана орындалады.
    • Қарапайым жүзеге асыру және түсіну оңай.
    • Болжау кезеңінде өнімділігі үлкен деректер жиынтығында нашарлауы мүмкін, себебі барлық оқыту мысалдарына дейінгі қашықтықтарды есептеу қажет.
    • Белгілердің масштабына сезімтал.
    • Жоғары шу деңгейі бар деректерде нашар жұмыс істей алады.

Жұмыс кезеңдері (класификация үшін):

  1. k мәнін таңдау.
  2. Қашықтық метрикасын таңдау.
  3. Жаңа объект үшін, болжау жасау керек: a. Бұл объект пен барлық оқыту жиынтығындағы объектілер арасындағы қашықтықты есептеу. b. Оқыту жиынтығынан k ең жақын объектіні таңдау. c. Осы k объектінің ішінде ең жиі кездесетін класты анықтау. d. Жаңа объектіге осы класты тағайындау.

Псевдокод мысалы:

# Евклидтік қашықтықты есептеу функциясы
def euclidean_distance(p1, p2):
    # ... қашықтықты есептеу ...

# `k` жақын көршілерді іздеу және класты болжау функциясы
def predict(training_data, new_data_point, k, distance_metric):
    distances = []
    for data_point in training_data:
        dist = distance_metric(new_data_point, data_point['features'])
        distances.append((dist, data_point['label']))

    # Қашықтық бойынша сұрыптау және `k` жақын таңдау
    distances.sort(key=lambda x: x[0])
    k_nearest = distances[:k]

    # Кластарға дауыс беру
    class_votes = {}
    for dist, label in k_nearest:
        class_votes[label] = class_votes.get(label, 0) + 1

    # Ең көп дауыс алған класты анықтау
    predicted_class = max(class_votes, key=class_votes.get)
    return predicted_class