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
kkiválasztása nagyban befolyásolja az eredményt. Egy kiskérzékeny lehet a zajra, egy nagykfigyelmen 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):
- Válassza ki a
kértékét. - Válassza ki a távolságmetrikát.
- 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
kpé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