Sobes.tech
Middle

Mi az a k-legközelebbi szomszédok (kNN) algoritmus?

sobes.tech MI

Válasz az MI-től

kNN (k-legközelebbi szomszéd) nem paraméteres módszer, amelyet osztályozásra és regresszióra használnak. Az ötlet egyszerű: egy objektumot a szomszédai többségi szavazata alapján osztályoznak, ahol az objektumot a leggyakoribb osztályhoz rendelik a k legközelebbi szomszédjai között. Regresszió esetén a k legközelebbi szomszéd címkéinek átlagértékét jósolják.

Kulcsfontosságú szempontok:

  • k paraméter: A döntéshez figyelembe vett legközelebbi szomszédok száma. A k kiválasztása nagyban befolyásolja az eredményt. Egy kis k érzékeny lehet a zajra, egy nagy k figyelmen kívül hagyhatja a helyi struktúrákat.
  • Távolságmetrika: A "közeliséget" határozza meg az adatok között. A leggyakoribbak: Euklideszi távolság, Manhattan távolság.
  • Jellemzők:
    • "Lusta" algoritmus: nincs vagy minimális tanulás (csak a tanító adatok tárolása). A jóslás csak a kérés során történik.
    • Könnyen megvalósítható és érthető.
    • A teljesítmény a jóslási szakaszban romolhat nagy adathalmazok esetén, mivel minden tanító példára távolságokat kell számítani.
    • Érzékeny a jellemzők skálájára.
    • Rosszul működhet magas zajszintű adatokon.

Működési lépések (osztályozás esetén):

  1. Válassza ki a k értékét.
  2. Válassza ki a távolságmetrikát.
  3. Egy új objektum esetén, amelyhez jóslatot kell készíteni: a. Számítsa ki a távolságot az objektum és az összes tanító példány között. b. Válassza ki a legközelebbi k példányt. c. Határozza meg a leggyakrabban előforduló osztályt ezek között. d. Rendelje ezt az osztályt az új objektumhoz.

Példa (pseudokód):

# Euklideszi távolság számítására szolgáló függvény
def euclidean_distance(p1, p2):
    # ... távolság számítása ...

# A legközelebbi k szomszéd keresése és osztály jóslása
def predict(training_data, new_data_point, k, distance_metric):
    távolságok = []
    for data_point in training_data:
        dist = distance_metric(new_data_point, data_point['features'])
        távolságok.append((dist, data_point['label']))

    # Rendezés távolság szerint és a legközelebbi k kiválasztása
    távolságok.sort(key=lambda x: x[0])
    k_legközelebbi = távolságok[:k]

    # Szavazatok számlálása az osztályok között
    osztály_szavazatok = {}
    for dist, label in k_legközelebbi:
        osztály_szavazatok[label] = osztály_szavazatok.get(label, 0) + 1

    # A legtöbb szavazatot kapott osztály meghatározása
    jósolt_osztály = max(osztály_szavazatok, key=osztály_szavazatok.get)
    return jósolt_osztály