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):
    қашықтықтар = []
    әрбір data_point үшін — training_data:
        dist = distance_metric(new_data_point, data_point['features'])
        қашықтықтар.append((dist, data_point['label']))

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

    # Сынып дауысын есептеу
    дауыс = {}
    әрбір dist, label — k_жақын:
        дауыс[label] = дауыс.get(label, 0) + 1

    # Ең көп дауыс алған сыныпты анықтау
    болжанған_сынып = max(дауыс, key=дауыс.get)
    қайтару болжанған_сынып