Middle
Mis on k-lähedaste naabrite algoritm (kNN)?
sobes.tech AI
Vastus AI-lt
kNN (k-lähim naabrid) on mitteparameetriline meetod, mida kasutatakse klassifikatsiooniks ja regressiooniks. Idee on lihtne: objekt klassifitseeritakse selle naabrite enamuse häälteenamusega, kus objektile omistatakse klass, mis on kõige levinum tema k lähima naabri seas. Regressiooni puhul prognoositakse k lähima naabri märkide keskmist väärtust.
Põhipunktid:
- k parameeter: Lähimate naabrite arv, mida arvestatakse otsuse tegemisel.
kvalik mõjutab tulemust tugevalt. Väikekvõib olla tundlik müra suhtes, suurkvõib ignoreerida kohalikke struktuure. - Kauguse metrika: Kasutatakse andmepunktide "läheduse" määramiseks. Kõige levinumad: Eukleidiline kaugus, Manhattan kaugus.
- Omadused:
- "Hiline" algoritm: õppimine puudub või on minimaalne (lihtsalt salvestatakse õppandmed). Ennustamine toimub ainult päringu ajal.
- Lihtne teostada ja mõista.
- Ennustamise jõudlus võib suurte andmekogumite puhul kannatada, kuna tuleb arvutada kaugused kõigi õppemudelite näidete vahel.
- Tundlik tunnuste skaalale.
- Võib halbade tulemustega töötada andmetel, millel on kõrge müra tase.
Tööetapid (klassifikatsiooni jaoks):
- Valige
kväärtus. - Valige kauguse metrika.
- Uue objekti jaoks, mille jaoks tuleb teha ennustus:
a. Arvutage kaugus selle objekti ja kõigi õppematerjalide vahel.
b. Valige
klähimat objekti õppematerjalist. c. Määrake nendekobjekti kõige sagedamini esinev klass. d. Omistage sellele uuele objektile see klass.
Näide (pseudokood):
# Eukleidilise kauguse arvutamise funktsioon
def euclidean_distance(p1, p2):
# ... kauguse arvutamine ...
# Funktsioon leida `k` lähimat naabrit ja teha prognoos klassile
def predict(training_data, new_data_point, k, distance_metric):
kaugused = []
iga data_point kohta — training_data:
dist = distance_metric(new_data_point, data_point['features'])
kaugused.append((dist, data_point['label']))
# Sorteeri kauguse järgi ja vali `k` lähimat
kaugused.sort(key=lambda x: x[0])
k_lähimat = kaugused[:k]
# Hääletuse arvutamine klasside vahel
hääled = {}
iga dist, label — k_lähimat:
hääled[label] = hääled.get(label, 0) + 1
# Määra klass, millel on kõige rohkem hääli
prognoositud_klass = max(hääled, key=hääled.get)
tagasta prognoositud_klass