Middle
k-жакынкы көршүлөр алгоритми (kNN) эмне?
sobes.tech AI
AIден жооп
kNN (k-жакын көршілер) — бұл параметрлік емес әдіс, ол классификациялау және регрессия үшін қолданылады. Идеясы қарапайым: объект оның көршілерінің көп дауысымен жіктеледі, мұнда объект ең жақын k көршілерінің арасында ең кең таралған сыныпқа беріледі. Регрессия үшін k жақын көршілердің белгілерінің орташа мәні болжанады.
Негізгі аспектілер:
- k параметрі: Шешім қабылдау кезінде ескерілуі керек жақын көршілер саны.
kтаңдау нәтижеге қатты әсер етеді. Кішіkшуға сезімтал болуы мүмкін, үлкенkжергілікті құрылымдарды елемеуі мүмкін. - Қашықтық метрикасы: Деректер нүктелері арасындағы "жақындық" анықтау үшін пайдаланылады. Ең кең тарағандары: Евклид қашықтығы, Манхэттен қашықтығы.
- Ерекшеліктері:
- "Күйсіз" алгоритм: оқыту жоқ немесе минималды (тек оқыту деректерін сақтау). Болжау сұрау кезінде ғана орындалады.
- Жеңіл жүзеге асыру және түсіну.
- Болжау кезеңінде өнімділік үлкен деректер жиынтығында нашарлауы мүмкін, себебі барлық оқыту мысалдарына дейінгі қашықтықтарды есептеу қажет.
- Ерекшеліктердің масштабына сезімтал.
- Жоғары шу деңгейі бар деректерде нашар жұмыс істей алады.
Жұмыс кезеңдері (класификация үшін):
kмәнін таңдаңыз.- Қашықтық метрикасын таңдаңыз.
- Жаңа объект үшін, болжау жасау керек:
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)
қайтару болжанған_сынып