Raw

4. Домашнє завдання (написання програми)

Джерело завдання. Завдання доповнює матеріали курсу (у вихідному архіві домашнє завдання для теми 12 відсутнє). Постановку сформульовано природно для теми — реалізація алгоритму FP-Growth. Готового коду тут немає — це індивідуальне завдання; техніку обчислень показано на інших даних у 2method.md та 3classroom.md.

Постановка

Реалізувати алгоритм FP-Growth: побудова FP-дерева й рекурсивний видобуток частих наборів. На вхід — транзакції з файлу (CSV/текст, одна транзакція на рядок). Вивести всі часті набори з підтримкою не меншою за заданий поріг.

Вхід і вихід

  • Вхід: шлях до файлу транзакцій — по одній транзакції на рядок, елементи розділені комою (або пробілом). Приклад рядка: Яблуко,Банан,Виноград. Порядок елементів у рядку несуттєвий; повтори в межах транзакції ігнорують. Також на вхід подають мінімальну підтримку smins_{\min} (аргумент командного рядка, параметр або запит); для середнього рівня — ще й мінімальну достовірність cminc_{\min}.
  • Вихід: щонайменше — перелік частих наборів із їхньою підтримкою, згрупований за розміром. Формат виводу (консоль/файл) — на розсуд студента; підтримку подавайте як частку (можна й у відсотках), числа округлюйте розумно (напр., 3–4 значущі цифри).

Рівні складності

Оцінка відповідає найвищому повністю й правильно виконаному рівню.

Базовий рівень — 60–74 балів

  1. Прочитати транзакції з файлу; побудувати множину елементів II і кількість транзакцій NN.
  2. 1-й прохід: порахувати частоти елементів, відкинути нечасті (<sminN< s_{\min} \cdot N) і скласти FF-список (за спаданням частоти; за рівних частот — сталий порядок).
  3. 2-й прохід: для кожної транзакції лишити часті елементи, відсортувати за FF-списком і вставити як шлях у FP-дерево; вести лічильники у вузлах і заголовну таблицю зі зв’язками між вузлами (node-links).
  4. Видобути всі часті набори рекурсивним FP-Growth (умовна база образів \to умовне FP-дерево \to рекурсія; поріг smins_{\min} застосовувати наново в кожній умовній базі) і вивести їх згруповано за розміром із підтримкою.

Середній рівень — 75–89 балів

Додатково до базового:

  1. Згенерувати асоціативні правила з кожного частого набору: розбити набір ZZ на XX і Y=ZXY = Z \setminus X усіма способами й лишити правила з confcmin\operatorname{conf} \ge c_{\min} (усі потрібні підтримки вже пораховано на етапі видобутку).
  2. Для кожного правила вивести підтримку та достовірність.
  3. Коректно опрацьовувати файл із різною довжиною транзакцій, зайвими пробілами та порожніми рядками; пороги smins_{\min}, cminc_{\min} задавати ззовні.

Високий рівень — 90–100 балів

Додатково до середнього виконати щонайменше один із пунктів (краще — обидва):

  1. Порівняти з Apriori. Реалізувати (або взяти свою реалізацію з Лабораторної 11) алгоритм Apriori і на одній і тій самій базі звірити множини частих наборів обох алгоритмів — вони мають повністю збігатися. Додатково виміряти й порівняти час роботи FP-Growth і Apriori на дедалі більших базах (напр., випадково згенерованих транзакціях), побудувати таблицю або графік «час vs розмір бази» й прокоментувати, на яких даних (щільних/розріджених) який алгоритм швидший.
  2. Дослідити пороги. Запустити FP-Growth на кількох порогах smins_{\min} для однієї бази, показати, як змінюється кількість частих наборів і розмір FP-дерева, і прокоментувати компроміс (низький поріг — лавина наборів; високий — втрата рідкісних, але цінних).
  3. Передбачити перевірку коректності вводу (порожній файл, некоректний поріг поза [0,1][0,1], рядки без елементів, дублікати елементів у рядку) з інформативним повідомленням.

Що здавати

  • Вихідний код програми (з коротким README: як запустити, формат входу, як задають пороги).
  • Приклад запуску на тестовому файлі. Обов’язково перевірте програму на даних Задачі 1–3 (фруктова лавка) за smin=0.5s_{\min} = 0.5 — очікувано три часті 1-набори ({Банан}\{\text{Банан}\} з підтримкою 0.830.83, {Яблуко}\{\text{Яблуко}\} і {Виноград}\{\text{Виноград}\} з підтримкою 0.670.67) і три часті 2-набори ({Банан,Яблуко}\{\text{Банан},\text{Яблуко}\}, {Банан,Виноград}\{\text{Банан},\text{Виноград}\}, {Яблуко,Виноград}\{\text{Яблуко},\text{Виноград}\}, усі з підтримкою 0.50.5); частих наборів розміру 3\ge 3 немає. Для високого рівня — звірте цей результат зі своєю реалізацією Apriori (мають збігтися).
  • Оформлення звіту — за 5report.md; перелік запитань до захисту — у 6questions.md.

Laboratory/Laboratory12/4task.md · 7.6 KB · updated 2026-08-05 08:37