Sobes.tech
Middle

K-yaqin qo'shni algoritmi (kNN) nima?

sobes.tech AI

AIdan javob

kNN (k-eng yaqin qo'shni) parametrik bo'lmagan usul bo'lib, tasniflash va regressiya uchun ishlatiladi. G'oyasi oddiy: ob'ekt uning yaqinlarining ko'p ovozi bilan tasniflanadi, bu yerda ob'ekt uning k eng yaqin yaqinlar orasida eng keng tarqalgan sinfga beriladi. Regressiya uchun, k eng yaqin yaqinlarning belgilari o'rtacha qiymati prognoz qilinadi.

Asosiy jihatlar:

  • k parametri: Qaror qabul qilishda hisobga olinadigan yaqinlar soni. k tanlovi natijaga katta ta'sir qiladi. Kichik k shovqinlarga sezgir bo'lishi mumkin, katta k mahalliy tuzilmalarni e'tiborsiz qoldirishi mumkin.
  • Masofa metrikasi: Ma'lumot nuqtalari orasidagi "yaqinlik"ni aniqlash uchun ishlatiladi. Eng keng tarqalganlar: Euklid masofasi, Manhattan masofasi.
  • Xususiyatlar:
    • "Lazzat" algoritmi: o'qitish yo'q yoki minimal (faqat o'qitish ma'lumotlarini saqlash). Prognoz so'rov vaqtida amalga oshiriladi.
    • Oson amalga oshirish va tushunish.
    • Katta ma'lumotlar to'plamlarida prognoz qilishda ishlash tezligi pasayishi mumkin, chunki barcha o'qitish misollariga masofalarni hisoblash talab qilinadi.
    • Xususiyatlarning o'lchoviga sezgir.
    • Yuqori shovqin darajasiga ega ma'lumotlarda yaxshi ishlamasligi mumkin.

Ish jarayonlari (tasniflash uchun):

  1. k qiymatini tanlang.
  2. Masofa metrikasini tanlang.
  3. Yangi ob'ekt uchun, unga prognoz qilish kerak bo'lsa: a. Bu ob'ekt va o'qitish to'plamidagi barcha ob'ektlar orasidagi masofani hisoblang. b. O'qitish to'plamidan eng yaqin k ob'ektni tanlang. c. Bu k ob'ekt orasida eng ko'p uchraydigan sinfni aniqlang. d. Bu sinfni yangi ob'ektga tayinlang.

Misol (pseudokod):

# Euklid masofasini hisoblash funktsiyasi
def euclidean_distance(p1, p2):
    # ... masofa hisoblash ...

# Eng yaqin k qo'shni topish va sinfni prognoz qilish funktsiyasi
def predict(training_data, new_data_point, k, distance_metric):
    masofalar = []
    for data_point in training_data:
        dist = distance_metric(new_data_point, data_point['features'])
        masofalar.append((dist, data_point['label']))

    # Masofaga qarab tartiblash va eng yaqin k ni tanlash
    masofalar.sort(key=lambda x: x[0])
    k_eng_yaqin = masofalar[:k]

    # Sinf ovozlarini hisoblash
    ovozlar = {}
    for dist, label in k_eng_yaqin:
        ovozlar[label] = ovozlar.get(label, 0) + 1

    # Eng ko'p ovoz olgan sinfni aniqlash
    prognozlangan_sinf = max(ovozlar, key=ovozlar.get)
    return prognozlangan_sinf