# Домашнє завдання · Нейрон і перцептрон

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Усі три рівні працюють на тій самій дошці оголошень, що й у практиці. Код генерації
таблиці бери з першої частини зошита без змін — інакше числа не збігатимуться.
Функцію `навчити_перцептрон` теж бери з практики: писати її заново не треба.

---

## 🟢 Рівень 1 — База

У практиці ми навчали перцептрон із одного-єдиного старту. Перевір обіцянку теореми
збіжності: вона стверджує, що на роздільних даних правило зупиниться **хоч би з яких
ваг ти почав**.

1. Запусти `навчити_перцептрон` на тих самих 569 оголошеннях із чотирьох різних
   стартів: `[0, 0]`, `[1, 1]`, `[-1, 1]` і `[5, -5]`, зсув усюди `0`.
2. Для кожного випиши: скільки епох знадобилось, скільки виправлень було в першій
   епосі, які кінцеві ваги.
3. Для кожного набору кінцевих ваг порахуй, під яким кутом стоїть межа: відношення
   `-w1 / w2` — це нахил прямої `довідкова = k · ціна`.

**Зроблено, якщо:** є таблиця з чотирьох рядків, у якій остання епоха всюди має нуль
виправлень, кінцеві ваги різні, а нахили `-w1 / w2` всі лежать між 1.7 і 2.3 — тобто
прямі різні, але всі проходять у тому самому вузькому проміжку між класами.

---

## 🟡 Рівень 2 — Плюс

Теорема збіжності обіцяє скінченну кількість кроків, але не каже, скільки саме. Оцінка
зростає, коли **запас** між класами меншає. Перевір це експериментом.

1. Візьми ті самі 569 оголошень і посунь клас приманок ближче до чесних: заміни ціну
   кожної приманки на `ціна + доля * (0.56 * довідкова - ціна)`, де `доля` пробігає
   значення `0.0, 0.2, 0.4, 0.6, 0.8, 0.95`. При `доля = 0` дані не змінились, при
   `доля = 0.95` приманки майже впритул до чесних, але ще з правильного боку.
2. Для кожного значення `доля` навчи перцептрон із нульових ваг і запиши, скільки
   виправлень він зробив **усього** (сума по всіх епохах) до зупинки.
3. Один прогін дуже шумний: кількість виправлень залежить від порядку, у якому
   трапляються приклади. Тому для кожної `доля` зроби **20 прогонів** із різним
   перемішуванням рядків (`rng.permutation`) і бери середнє.
4. Побудуй графік: по горизонталі `доля`, по вертикалі середня кількість виправлень.
   Вісь `y` зроби логарифмічною — інакше остання точка розчавить решту.

**Зроблено, якщо:** є графік із шести точок, на якому середня кількість виправлень
зростає з наближенням класів і при `доля = 0.95` перевищує значення при `доля = 0`
щонайменше в сто разів, **і** два-три речення про те, чому дані лишаються роздільними
при будь-якій `доля < 1`, а робота правила при цьому росте на порядки. Окремо назви,
чому одного прогону тут замало.

---

## 🔴 Рівень 3 — Виклик

У розділі 8 лекції ми зібрали XOR із трьох нейронів, виписавши ваги руками. Зроби те
саме для дошки оголошень — і теж руками.

Задача: побудувати з трьох нейронів зі сходинкою класифікатор, який ловить **обидва**
види приманок — і занижені, і завищені ціни, — на повних 1 100 оголошеннях
(`X_усі`, `y_усі` з практики). Одна пряма з цим не впорається, бо шахрайство лежить
по обидва боки від чесних оголошень; смуга з двох прямих — упорається.

1. Підбери два нейрони прихованого шару так, щоб `h1` спрацьовував на «ціна помітно
   нижча за довідкову», а `h2` — на «ціна помітно вища за довідкову».
2. Вихідний нейрон має реалізувати АБО над `h1` і `h2` — випиши його ваги й зсув.
3. Порахуй точність усієї конструкції на 1 100 оголошеннях і порівняй із трьома
   числами: точністю моделі «усе чесне», точністю `LogisticRegression` із практики
   і точністю одного перцептрона, навченого правилом Розенблата на тих самих даних.

**Зроблено, якщо:** є таблиця чотирьох точностей із реальними числами, ручна
конструкція перемагає всі три **і** написано два-три речення про те, чому правило
Розенблата не могло знайти ці ваги само — з посиланням на те, що для прихованих
нейронів правильної відповіді ніхто не задає.

---

## Підказки

- У рівні 1 нахил `-w1 / w2` має сенс лише тоді, коли `w2` не нуль. Якщо ваги вийшли
  такими, що межа вертикальна, — це вже сигнал, що щось не так зі стартом.
- У рівні 2 не забудь, що після зсуву цін дані треба перебудувати повністю, а не
  дописати колонку: у матриці `X` перша колонка — саме ціна. І став `епох` із
  великим запасом (кілька тисяч), інакше при `доля = 0.95` цикл обірветься раніше
  за збіжність і числа збрешуть.
- У рівні 3 «помітно нижча» й «помітно вища» — це два пороги на відношенні
  `ціна / довідкова`. Подивись у практиці, у яких межах це відношення лежить у чесних
  оголошень, і став пороги трохи ззовні від них.
- Нейрон зі сходинкою на порозі відношення виглядає як `w1·ціна + w2·довідкова + b`,
  де відношення ніде явно не рахується. Пороговий нейрон уміє порівнювати ціну
  з часткою довідкової — саме тому ваги мають різні знаки.
