Sobes.tech
Middle

რა არის k-ახლოს მეზობლების ალგორითმი (kNN)?

sobes.tech AI

პასუხი AI-სგან

kNN (k-ახლოს მეზობლები) — ეს არის პარამეტრიანი მეთოდი, რომელიც გამოიყენება კლასიფიკაციასა და რეგრესიისთვის. იდეა მარტივია: ობიექტი კლასიფიცირებულია მისი მეზობლების უმრავლესობის ხმებით, სადაც ობიექტი მიენიჭება იმ კლასს, რომელიც ყველაზე გავრცელებულია მისი k-ბClosest მეზობელთა შორის. რეგრესიისთვის პროგნოზირებულია k-Closest მეზობელთა ნიშნების საშუალო მნიშვნელობა.

ძირითადი ასპექტები:

  • 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)
    დაბრუნება პროგნოზირებული_კლასი