# 4. Домашнє завдання (написання програми) > **Джерело завдання.** Формулювання взято **з методичних матеріалів курсу**. > Готового коду тут **немає** — це індивідуальне завдання; техніку обчислень > показано на інших даних у [2method.md](2method.md) та [3classroom.md](3classroom.md). ## Постановка **Реалізувати програму, що бере навчальну вибірку з CSV файлу (як приклад можна розглянути вибірки з Kaggle), запитує атрибути елементу, який потрібно класифікувати, та класифікує його за допомогою алгоритму kNN.** Мову програмування студент обирає самостійно. Навчальна вибірка — таблиця, де рядок є об'єктом: кілька стовпців-**ознак** і один стовпець-**клас** (мітка). Наприклад, класичні набори з [Kaggle](https://www.kaggle.com/datasets) — Iris (класифікація квітки за розмірами пелюсток) чи Wine. ## Вхід і вихід - **Вхід:** - шлях до файлу **CSV** з навчальною вибіркою (ознаки + стовпець класу); - значення ознак об'єкта, який треба класифікувати (програма їх **запитує** — з консолі, аргументів або окремого файла); - параметр $k$ (число сусідів). - **Вихід:** передбачений **клас** об'єкта. Бажано також показати самих $k$ найближчих сусідів із відстанями та розподіл їхніх голосів. ## Рівні складності Оцінка відповідає найвищому **повністю й правильно** виконаному рівню. ### Базовий рівень — 60–74 балів 1. Прочитати навчальну вибірку з файлу CSV (числові ознаки + стовпець класу). 2. Запитати ознаки об'єкта для класифікації та значення $k$. 3. Обчислити **евклідові** відстані від об'єкта до всіх навчальних точок, відібрати $k$ найближчих і віднести об'єкт до **найпоширенішого** серед них класу (мажоритарне голосування). 4. Обчислення відстані та голосування реалізувати **самостійно** (не викликати готовий класифікатор як основне рішення). ### Середній рівень — 75–89 балів Додатково до базового: 5. Додати **нормалізацію ознак** (мінімакс або $z$-стандартизація) і показати, як вона змінює результат порівняно з «сирими» ознаками. 6. Реалізувати **вибір $k$** (параметром) і **різні функції відстані** на вибір користувача: евклідову, манхеттенську, Мінковського (і, за наявності категоріальних ознак, Геммінга). 7. Коректно опрацьовувати файл із **заголовком** і довільним числом стовпців-ознак (стовпець класу задають параметром чи за назвою). ### Високий рівень — 90–100 балів Додатково до середнього: 8. Реалізувати **зважений** kNN (вага $1/d$ або $1/d^2$) і порівняти його результат зі звичайним голосуванням. 9. Поділити дані на **тренувальну** й **тестову** множини, класифікувати тестові об'єкти та **оцінити якість**: побудувати **матрицю невідповідності** й обчислити **правильність (accuracy), точність (precision) і чутливість (recall)**. 10. Дослідити **вплив $k$**: побудувати залежність якості (напр. правильності) на тестовій вибірці від $k$ і вибрати найкраще $k$; передбачити перевірку коректності вводу (порожній файл, нечислові значення, пропуски). ## Що здавати - Вихідний код програми (з коротким `README`: як запустити, формат вхідного CSV, який рівень складності виконано). - Приклад запуску на **навчальному** наборі (напр. Iris). Обов'язково перевірте програму на даних [Задачі 1](3classroom.md): подайте ті $8$ точок як навчальну вибірку, а $q = (4,4)$ — як об'єкт; очікувано клас **A** для $k = 1$ і $k = 3$. - Для високого рівня — матрицю невідповідності й метрики на тестовій вибірці. - Оформлення звіту — за [5report.md](5report.md); перелік запитань до захисту — у [6questions.md](6questions.md).