Sobes.tech
Middle

K-yaxın qonşular alqoritmi (kNN) nədir?

sobes.tech Süni İntellekt

AI-dan cavab

kNN (k-yaxın qonşular) parametrik olmayan metod olub, təsnifat və reqressiya üçün istifadə olunur. Fikir sadədir: obyekt onun qonşularının çox səs çoxluğu ilə təsnif edilir, burada obyekt onun ən yaxın k qonşusunun ən çox yayılmış sinifinə təyin edilir. Reqressiya üçün, ən yaxın k qonşunun nişanlarının orta qiyməti proqnozlaşdırılır.

Əsas aspektlər:

  • k parametri: Qərar qəbul edilərkən nəzərə alınan ən yaxın qonşuların sayı. k seçimi nəticəyə çox təsir edir. Kiçik k səs-küyə həssas ola bilər, böyük k yerli strukturları nəzərə almaya bilər.
  • Məsafa metriyi: Məlumat nöqtələri arasındakı "yaxınlığı" müəyyən etmək üçün istifadə olunur. Ən çox yayılmışlar: Euklid məsafəsi, Manhattan məsafəsi.
  • Xüsusiyyətlər:
    • "Tənbəl" alqoritm: öyrənmə yoxdur və ya minimaldır (sadəcə öyrədici məlumatların saxlanması). Proqnoz yalnız sorğu zamanı həyata keçirilir.
    • Asan tətbiq və anlamaq asandır.
    • Böyük məlumat dəstləri üçün proqnoz performansı aşağı ola bilər, çünki bütün öyrədici nümunələrə məsafələrin hesablanması tələb olunur.
    • Xüsusiyyətlərin ölçüsünə həssasdır.
    • Yüksək səs-küy səviyyəsinə malik məlumatlarda pis işləyə bilər.

İş mərhələləri (sınıflandırma üçün):

  1. k dəyərini seçin.
  2. Məsafa metriyasını seçin.
  3. Yeni obyekt üçün, onun proqnoz ediləcəyi halda: a. Bu obyekt və öyrədici dəstədəki bütün obyektlər arasındakı məsafəni hesablayın. b. Öyrədici dəstədən ən yaxın k obyektləri seçin. c. Bu k obyekt arasında ən çox rast gəlinən sinfi müəyyən edin. d. Bu sinfi yeni obyektə təyin edin.

Nümunə (pseudokod):

# Euklid məsafəsini hesablamaq funksiyası
def euclidean_distance(p1, p2):
    # ... məsafənin hesablanması ...

# Ən yaxın k qonşunu tapmaq və sinfi proqnozlaşdırmaq funksiyası
def predict(training_data, new_data_point, k, distance_metric):
    məsafələr = []
    for data_point in training_data:
        dist = distance_metric(new_data_point, data_point['features'])
        məsafələr.append((dist, data_point['label']))

    # Məsafəyə görə sıralama və ən yaxın k-ni seçmə
    məsafələr.sort(key=lambda x: x[0])
    k_yaxın = məsafələr[:k]

    # Sinif səs çoxluğunun hesablanması
    sinif_səs = {}
    for dist, label in k_yaxın:
        sinif_səs[label] = sinif_səs.get(label, 0) + 1

    # Ən çox səs alan sinfi müəyyən edin
    proqnozlaşdırılan_sinif = max(sinif_səs, key=sinif_səs.get)
    return proqnozlaşdırılan_sinif