|
1 | 1 | # Cost-function |
2 | 2 | In this repository, we implement and explore the cost function for linear regression with one variable. |
| 3 | +Этот код — из курса по машинному обучению (Andrew Ng, Coursera), где демонстрируется графическая интуиция для линейной регрессии. Давай подробно разберём его **построчно**. |
| 4 | + |
| 5 | +*** |
| 6 | + |
| 7 | +### Импорт библиотек |
| 8 | +```python |
| 9 | +import numpy as np |
| 10 | +%matplotlib widget |
| 11 | +import matplotlib.pyplot as plt |
| 12 | +from lab_utils_uni import plt_intuition, plt_stationary, plt_update_onclick, soup_bowl |
| 13 | +``` |
| 14 | +- `import numpy as np` — импортируем библиотеку NumPy для работы с массивами и числовыми вычислениями. |
| 15 | +- `%matplotlib widget` — Jupyter Notebook *магическая команда*. Делает графики Matplotlib *интерактивными* (можно кликать и обновлять графики прямо в окне). |
| 16 | +- `import matplotlib.pyplot as plt` — импортируем Matplotlib для построения графиков. |
| 17 | +- `from lab_utils_uni import ...` — импорт функций из вспомогательного модуля (`lab_utils_uni.py`), подготовленного авторами курса: |
| 18 | + - `plt_intuition` — рисует интуитивный график линейной регрессии (прямая + точки). |
| 19 | + - `plt_stationary` — строит статичный график для работы с данными. |
| 20 | + - `plt_update_onclick` — позволяет обновлять график при клике (менять параметры линейной регрессии). |
| 21 | + - `soup_bowl` — отображает "чашу супа" (график функции стоимости в 3D), иллюстрирующий минимум ошибки. |
| 22 | + |
| 23 | +*** |
| 24 | + |
| 25 | +### Создание обучающих данных |
| 26 | +```python |
| 27 | +x_train = np.array([1.0, 2.0]) |
| 28 | +y_train = np.array([300.0, 500.0]) |
| 29 | +``` |
| 30 | +- `x_train` — массив значений признака (например, площадь квартиры). |
| 31 | +- `y_train` — массив целевых значений (например, цена квартиры). |
| 32 | + Здесь задаются всего два примера: площадь $$1.0$$ и $$2.0$$, соответствующие ценам $$300$$ и $$500$$. |
| 33 | + |
| 34 | +*** |
| 35 | + |
| 36 | +### Функция стоимости (Cost Function) |
| 37 | +```python |
| 38 | +def compute_cost(x, y, w, b): |
| 39 | + m = x.shape[0] |
| 40 | + cost_sum = 0 |
| 41 | + for i in range(m): |
| 42 | + f_wb = w * x[i] + b |
| 43 | + cost = (f_wb - y[i]) ** 2 |
| 44 | + cost_sum = cost_sum + cost |
| 45 | + total_cost = (1 / (2 * m)) * cost_sum |
| 46 | + return total_cost |
| 47 | +``` |
| 48 | +- `def compute_cost(x, y, w, b):` — определяем функцию для вычисления стоимости (Mean Squared Error с коэффициентом 1/2). |
| 49 | +- `m = x.shape` — получаем количество обучающих примеров. |
| 50 | +- `cost_sum = 0` — инициализация суммы ошибок. |
| 51 | +- `for i in range(m):` — пробегаем по всем примерам. |
| 52 | +- `f_wb = w * x[i] + b` — вычисляем предсказание гипотезы (линейная модель). |
| 53 | +- `cost = (f_wb - y[i]) ** 2` — считаем квадрат ошибки каждого примера. |
| 54 | +- `cost_sum = cost_sum + cost` — суммируем ошибки. |
| 55 | +- `total_cost = (1 / (2 * m)) * cost_sum` — усредняем ошибку по всем примерам и умножаем на 1/2. |
| 56 | +- `return total_cost` — возвращаем итоговую стоимость. |
| 57 | + |
| 58 | +*** |
| 59 | + |
| 60 | +### Визуализация интуиции |
| 61 | +```python |
| 62 | +plt_intuition(x_train, y_train) |
| 63 | +``` |
| 64 | +- Строится график точек $$ (x, y) $$ и прямая (линейная регрессия) для интуитивного понимания. |
| 65 | + |
| 66 | +*** |
| 67 | + |
| 68 | +### Новые тренировочные данные |
| 69 | +```python |
| 70 | +x_train = np.array([1.0, 1.7, 2.0, 2.5, 3.0, 3.2]) |
| 71 | +y_train = np.array([250, 300, 480, 430, 630, 730,]) |
| 72 | +``` |
| 73 | +- Создаем новый набор данных из 6 точек. Теперь наша база чуть "реалистичнее". |
| 74 | + |
| 75 | +*** |
| 76 | + |
| 77 | +### Закрытие старых графиков |
| 78 | +```python |
| 79 | +plt.close('all') |
| 80 | +``` |
| 81 | +- Закрывает все ранее открытые графики Matplotlib (нужно, чтобы старые фигуры не мешались новым). |
| 82 | + |
| 83 | +*** |
| 84 | + |
| 85 | +### Создание статичной визуализации |
| 86 | +```python |
| 87 | +fig, ax, dyn_items = plt_stationary(x_train, y_train) |
| 88 | +``` |
| 89 | +- `plt_stationary` строит график с точками и «заготовленной» линией. |
| 90 | +- `fig, ax` — стандартные объекты Figure и Axes в Matplotlib. |
| 91 | +- `dyn_items` — динамические элементы (например, сама линия, предсказания и легенды), которые будут обновляться. |
| 92 | + |
| 93 | +*** |
| 94 | + |
| 95 | +### Добавление интерактивности |
| 96 | +```python |
| 97 | +updater = plt_update_onclick(fig, ax, x_train, y_train, dyn_items) |
| 98 | +``` |
| 99 | +- Связывает график с функцией обновления: теперь при клике мышкой будут изменяться параметры $$w$$ и $$b$$, и пересчитываться линия регрессии/ошибка. |
| 100 | + |
| 101 | +*** |
| 102 | + |
| 103 | +### Визуализация функции стоимости |
| 104 | +```python |
| 105 | +soup_bowl() |
| 106 | +``` |
| 107 | +- Показывает 3D-график стоимости $$J(w, b)$$. |
| 108 | +- Поверхность напоминает «чашу супа», у которой минимум находится в центре: именно туда должен стремиться градиентный спуск. |
| 109 | + |
| 110 | +*** |
0 commit comments