Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Линейная регрессия и стохастический градиентный спуск"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Задание основано на материалах лекций по линейной регрессии и градиентному спуску. Вы будете прогнозировать выручку компании в зависимости от уровня ее инвестиций в рекламу по TV, в газетах и по радио."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Вы научитесь:\n",
- "- решать задачу восстановления линейной регрессии\n",
- "- реализовывать стохастический градиентный спуск для ее настройки\n",
- "- решать задачу линейной регрессии аналитически"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Введение\n",
- "Линейная регрессия - один из наиболее хорошо изученных методов машинного обучения, позволяющий прогнозировать значения количественного признака в виде линейной комбинации прочих признаков с параметрами - весами модели. Оптимальные (в смысле минимальности некоторого функционала ошибки) параметры линейной регрессии можно найти аналитически с помощью нормального уравнения или численно с помощью методов оптимизации. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Линейная регрессия использует простой функционал качества - среднеквадратичную ошибку. Мы будем работать с выборкой, содержащей 3 признака. Для настройки параметров (весов) модели решается следующая задача:\n",
- "$$\\Large \\frac{1}{\\ell}\\sum_{i=1}^\\ell{{((w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}) - y_i)}^2} \\rightarrow \\min_{w_0, w_1, w_2, w_3},$$\n",
- "где $x_{i1}, x_{i2}, x_{i3}$ - значения признаков $i$-го объекта, $y_i$ - значение целевого признака $i$-го объекта, $\\ell$ - число объектов в обучающей выборке."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Градиентный спуск\n",
- "Параметры $w_0, w_1, w_2, w_3$, по которым минимизируется среднеквадратичная ошибка, можно находить численно с помощью градиентного спуска.\n",
- "Градиентный шаг для весов будет выглядеть следующим образом:\n",
- "$$\\Large w_0 \\leftarrow w_0 - \\frac{2\\eta}{\\ell} \\sum_{i=1}^\\ell{{((w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}) - y_i)}}$$\n",
- "$$\\Large w_j \\leftarrow w_j - \\frac{2\\eta}{\\ell} \\sum_{i=1}^\\ell{{x_{ij}((w_0 + w_1x_{i1} + w_2x_{i2} + w_3x_{i3}) - y_i)}},\\ j \\in \\{1,2,3\\}$$\n",
- "Здесь $\\eta$ - параметр, шаг градиентного спуска."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Стохастический градиентный спуск\n",
- "Проблема градиентного спуска, описанного выше, в том, что на больших выборках считать на каждом шаге градиент по всем имеющимся данным может быть очень вычислительно сложно. \n",
- "В стохастическом варианте градиентного спуска поправки для весов вычисляются только с учетом одного случайно взятого объекта обучающей выборки:\n",
- "$$\\Large w_0 \\leftarrow w_0 - \\frac{2\\eta}{\\ell} {((w_0 + w_1x_{k1} + w_2x_{k2} + w_3x_{k3}) - y_k)}$$\n",
- "$$\\Large w_j \\leftarrow w_j - \\frac{2\\eta}{\\ell} {x_{kj}((w_0 + w_1x_{k1} + w_2x_{k2} + w_3x_{k3}) - y_k)},\\ j \\in \\{1,2,3\\},$$\n",
- "где $k$ - случайный индекс, $k \\in \\{1, \\ldots, \\ell\\}$."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Нормальное уравнение \n",
- "Нахождение вектора оптимальных весов $w$ может быть сделано и аналитически.\n",
- "Мы хотим найти такой вектор весов $w$, чтобы вектор $y$, приближающий целевой признак, получался умножением матрицы $X$ (состоящей из всех признаков объектов обучающей выборки, кроме целевого) на вектор весов $w$. То есть, чтобы выполнялось матричное уравнение:\n",
- "$$\\Large y = Xw$$\n",
- "Домножением слева на $X^T$ получаем:\n",
- "$$\\Large X^Ty = X^TXw$$\n",
- "Это хорошо, поскольку теперь матрица $X^TX$ - квадратная, и можно найти решение (вектор $w$) в виде:\n",
- "$$\\Large w = {(X^TX)}^{-1}X^Ty$$\n",
- "Матрица ${(X^TX)}^{-1}X^T$ - [*псевдообратная*](https://ru.wikipedia.org/wiki/Псевдообратная_матрица) для матрицы $X$. В NumPy такую матрицу можно вычислить с помощью функции [numpy.linalg.pinv](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html).\n",
- "\n",
- "Однако, нахождение псевдообратной матрицы - операция вычислительно сложная и нестабильная в случае малого определителя матрицы $X$ (проблема мультиколлинеарности). \n",
- "На практике лучше находить вектор весов $w$ решением матричного уравнения \n",
- "$$\\Large X^TXw = X^Ty$$Это может быть сделано с помощью функции [numpy.linalg.solve](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html).\n",
- "\n",
- "Но все же на практике для больших матриц $X$ быстрее работает градиентный спуск, особенно его стохастическая версия."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Инструкции по выполнению"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "В начале напишем простую функцию для записи ответов в текстовый файл. Ответами будут числа, полученные в ходе решения этого задания, округленные до 3 знаков после запятой. Полученные файлы после выполнения задания надо отправить в форму на странице задания на Coursera.org."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "def write_answer_to_file(answer, filename):\n",
- " with open(filename, 'w') as f_out:\n",
- " f_out.write(str(round(answer, 3)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**1. Загрузите данные из файла *advertising.csv* в объект pandas DataFrame. [Источник данных](http://www-bcf.usc.edu/~gareth/ISL/data.html).**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "adver_data = pd.read_csv('advertising.csv')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "**Посмотрите на первые 5 записей и на статистику признаков в этом наборе данных.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div>\n",
- "<style scoped>\n",
- " .dataframe tbody tr th:only-of-type {\n",
- " vertical-align: middle;\n",
- " }\n",
- "\n",
- " .dataframe tbody tr th {\n",
- " vertical-align: top;\n",
- " }\n",
- "\n",
- " .dataframe thead th {\n",
- " text-align: right;\n",
- " }\n",
- "</style>\n",
- "<table border=\"1\" class=\"dataframe\">\n",
- " <thead>\n",
- " <tr style=\"text-align: right;\">\n",
- " <th></th>\n",
- " <th>TV</th>\n",
- " <th>Radio</th>\n",
- " <th>Newspaper</th>\n",
- " <th>Sales</th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>1</th>\n",
- " <td>230.1</td>\n",
- " <td>37.8</td>\n",
- " <td>69.2</td>\n",
- " <td>22.1</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>2</th>\n",
- " <td>44.5</td>\n",
- " <td>39.3</td>\n",
- " <td>45.1</td>\n",
- " <td>10.4</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>3</th>\n",
- " <td>17.2</td>\n",
- " <td>45.9</td>\n",
- " <td>69.3</td>\n",
- " <td>9.3</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>4</th>\n",
- " <td>151.5</td>\n",
- " <td>41.3</td>\n",
- " <td>58.5</td>\n",
- " <td>18.5</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>5</th>\n",
- " <td>180.8</td>\n",
- " <td>10.8</td>\n",
- " <td>58.4</td>\n",
- " <td>12.9</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "</div>"
- ],
- "text/plain": [
- " TV Radio Newspaper Sales\n",
- "1 230.1 37.8 69.2 22.1\n",
- "2 44.5 39.3 45.1 10.4\n",
- "3 17.2 45.9 69.3 9.3\n",
- "4 151.5 41.3 58.5 18.5\n",
- "5 180.8 10.8 58.4 12.9"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "adver_data.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div>\n",
- "<style scoped>\n",
- " .dataframe tbody tr th:only-of-type {\n",
- " vertical-align: middle;\n",
- " }\n",
- "\n",
- " .dataframe tbody tr th {\n",
- " vertical-align: top;\n",
- " }\n",
- "\n",
- " .dataframe thead th {\n",
- " text-align: right;\n",
- " }\n",
- "</style>\n",
- "<table border=\"1\" class=\"dataframe\">\n",
- " <thead>\n",
- " <tr style=\"text-align: right;\">\n",
- " <th></th>\n",
- " <th>TV</th>\n",
- " <th>Radio</th>\n",
- " <th>Newspaper</th>\n",
- " <th>Sales</th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>count</th>\n",
- " <td>200.000000</td>\n",
- " <td>200.000000</td>\n",
- " <td>200.000000</td>\n",
- " <td>200.000000</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>mean</th>\n",
- " <td>147.042500</td>\n",
- " <td>23.264000</td>\n",
- " <td>30.554000</td>\n",
- " <td>14.022500</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>std</th>\n",
- " <td>85.854236</td>\n",
- " <td>14.846809</td>\n",
- " <td>21.778621</td>\n",
- " <td>5.217457</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>min</th>\n",
- " <td>0.700000</td>\n",
- " <td>0.000000</td>\n",
- " <td>0.300000</td>\n",
- " <td>1.600000</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>25%</th>\n",
- " <td>74.375000</td>\n",
- " <td>9.975000</td>\n",
- " <td>12.750000</td>\n",
- " <td>10.375000</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>50%</th>\n",
- " <td>149.750000</td>\n",
- " <td>22.900000</td>\n",
- " <td>25.750000</td>\n",
- " <td>12.900000</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>75%</th>\n",
- " <td>218.825000</td>\n",
- " <td>36.525000</td>\n",
- " <td>45.100000</td>\n",
- " <td>17.400000</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>max</th>\n",
- " <td>296.400000</td>\n",
- " <td>49.600000</td>\n",
- " <td>114.000000</td>\n",
- " <td>27.000000</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "</div>"
- ],
- "text/plain": [
- " TV Radio Newspaper Sales\n",
- "count 200.000000 200.000000 200.000000 200.000000\n",
- "mean 147.042500 23.264000 30.554000 14.022500\n",
- "std 85.854236 14.846809 21.778621 5.217457\n",
- "min 0.700000 0.000000 0.300000 1.600000\n",
- "25% 74.375000 9.975000 12.750000 10.375000\n",
- "50% 149.750000 22.900000 25.750000 12.900000\n",
- "75% 218.825000 36.525000 45.100000 17.400000\n",
- "max 296.400000 49.600000 114.000000 27.000000"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "adver_data.describe()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Создайте массивы NumPy *X* из столбцов TV, Radio и Newspaper и *y* - из столбца Sales. Используйте атрибут *values* объекта pandas DataFrame.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 64,
- "metadata": {},
- "outputs": [],
- "source": [
- "X = adver_data[['TV', 'Radio', 'Newspaper']].values\n",
- "y = adver_data[['Sales']].values"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Отмасштабируйте столбцы матрицы *X*, вычтя из каждого значения среднее по соответствующему столбцу и поделив результат на стандартное отклонение. Для определенности, используйте методы mean и std векторов NumPy (реализация std в Pandas может отличаться). Обратите внимание, что в numpy вызов функции .mean() без параметров возвращает среднее по всем элементам массива, а не по столбцам, как в pandas. Чтобы произвести вычисление по столбцам, необходимо указать параметр axis.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 65,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([85.63933176, 14.80964564, 21.72410606])"
- ]
- },
- "execution_count": 65,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import numpy as np\n",
- "\n",
- "means, stds = X.mean(axis=0), X.std(axis=0)\n",
- "stds"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 66,
- "metadata": {},
- "outputs": [],
- "source": [
- "X = (X - means) / stds"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Добавьте к матрице *X* столбец из единиц, используя методы *hstack*, *ones* и *reshape* библиотеки NumPy. Вектор из единиц нужен для того, чтобы не обрабатывать отдельно коэффициент $w_0$ линейной регрессии.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "\n",
- "N = X.shape[0]\n",
- "ones_column = np.ones((N, 1))\n",
- "X = np.hstack((X, ones))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**2. Реализуйте функцию *mserror* - среднеквадратичную ошибку прогноза. Она принимает два аргумента - объекты Series *y* (значения целевого признака) и *y\\_pred* (предсказанные значения). Не используйте в этой функции циклы - тогда она будет вычислительно неэффективной.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def mserror(y, y_pred):\n",
- " return ((y - y_pred)**2).mean(axis=ax)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Какова среднеквадратичная ошибка прогноза значений Sales, если всегда предсказывать медианное значение Sales по исходной выборке? Запишите ответ в файл '1.txt'.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "answer1 = # Ваш код здесь\n",
- "print(answer1)\n",
- "write_answer_to_file(answer1, '1.txt')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**3. Реализуйте функцию *normal_equation*, которая по заданным матрицам (массивам NumPy) *X* и *y* вычисляет вектор весов $w$ согласно нормальному уравнению линейной регрессии.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def normal_equation(X, y):\n",
- " return np.linalg.inv # Ваш код здесь"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "norm_eq_weights = normal_equation(X, y)\n",
- "print(norm_eq_weights)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Какие продажи предсказываются линейной моделью с весами, найденными с помощью нормального уравнения, в случае средних инвестиций в рекламу по ТВ, радио и в газетах? (то есть при нулевых значениях масштабированных признаков TV, Radio и Newspaper). Запишите ответ в файл '2.txt'.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "answer2 = # Ваш код здесь\n",
- "print(answer2)\n",
- "write_answer_to_file(answer2, '2.txt')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**4. Напишите функцию *linear_prediction*, которая принимает на вход матрицу *X* и вектор весов линейной модели *w*, а возвращает вектор прогнозов в виде линейной комбинации столбцов матрицы *X* с весами *w*.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def linear_prediction(X, w):\n",
- " # Ваш код здесь"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью нормального уравнения? Запишите ответ в файл '3.txt'.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "answer3 = # Ваш код здесь\n",
- "print(answer3)\n",
- "write_answer_to_file(answer3, '3.txt')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**5. Напишите функцию *stochastic_gradient_step*, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу *X*, вектора *y* и *w*, число *train_ind* - индекс объекта обучающей выборки (строки матрицы *X*), по которому считается изменение весов, а также число *$\\eta$* (eta) - шаг градиентного спуска (по умолчанию *eta*=0.01). Результатом будет вектор обновленных весов. Наша реализация функции будет явно написана для данных с 3 признаками, но несложно модифицировать для любого числа признаков, можете это сделать.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def stochastic_gradient_step(X, y, w, train_ind, eta=0.01):\n",
- " grad0 = # Ваш код здесь\n",
- " grad1 = # Ваш код здесь\n",
- " grad2 = # Ваш код здесь\n",
- " grad3 = # Ваш код здесь\n",
- " return w - eta * np.array([grad0, grad1, grad2, grad3])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**6. Напишите функцию *stochastic_gradient_descent*, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:**\n",
- "- X - матрица, соответствующая обучающей выборке\n",
- "- y - вектор значений целевого признака\n",
- "- w_init - вектор начальных весов модели\n",
- "- eta - шаг градиентного спуска (по умолчанию 0.01)\n",
- "- max_iter - максимальное число итераций градиентного спуска (по умолчанию 10000)\n",
- "- max_weight_dist - максимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска,\n",
- "при котором алгоритм прекращает работу (по умолчанию 1e-8)\n",
- "- seed - число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42)\n",
- "- verbose - флаг печати информации (например, для отладки, по умолчанию False)\n",
- "\n",
- "**На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов $w$, а также вектор (список) ошибок.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def stochastic_gradient_descent(X, y, w_init, eta=1e-2, max_iter=1e4,\n",
- " min_weight_dist=1e-8, seed=42, verbose=False):\n",
- " # Инициализируем расстояние между векторами весов на соседних\n",
- " # итерациях большим числом. \n",
- " weight_dist = np.inf\n",
- " # Инициализируем вектор весов\n",
- " w = w_init\n",
- " # Сюда будем записывать ошибки на каждой итерации\n",
- " errors = []\n",
- " # Счетчик итераций\n",
- " iter_num = 0\n",
- " # Будем порождать псевдослучайные числа \n",
- " # (номер объекта, который будет менять веса), а для воспроизводимости\n",
- " # этой последовательности псевдослучайных чисел используем seed.\n",
- " np.random.seed(seed)\n",
- " \n",
- " # Основной цикл\n",
- " while weight_dist > min_weight_dist and iter_num < max_iter:\n",
- " # порождаем псевдослучайный \n",
- " # индекс объекта обучающей выборки\n",
- " random_ind = np.random.randint(X.shape[0])\n",
- " \n",
- " # Ваш код здесь\n",
- " \n",
- " return w, errors"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- " **Запустите $10^5$ итераций стохастического градиентного спуска. Укажите вектор начальных весов *w_init*, состоящий из нулей. Оставьте параметры *eta* и *seed* равными их значениям по умолчанию (*eta*=0.01, *seed*=42 - это важно для проверки ответов).**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "%%time\n",
- "stoch_grad_desc_weights, stoch_errors_by_iter = # Ваш код здесь"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Посмотрим, чему равна ошибка на первых 50 итерациях стохастического градиентного спуска. Видим, что ошибка не обязательно уменьшается на каждой итерации.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "%pylab inline\n",
- "plot(range(50), stoch_errors_by_iter[:50])\n",
- "xlabel('Iteration number')\n",
- "ylabel('MSE')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Теперь посмотрим на зависимость ошибки от номера итерации для $10^5$ итераций стохастического градиентного спуска. Видим, что алгоритм сходится.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "%pylab inline\n",
- "plot(range(len(stoch_errors_by_iter)), stoch_errors_by_iter)\n",
- "xlabel('Iteration number')\n",
- "ylabel('MSE')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Посмотрим на вектор весов, к которому сошелся метод.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "stoch_grad_desc_weights"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Посмотрим на среднеквадратичную ошибку на последней итерации.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "stoch_errors_by_iter[-1]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью градиентного спуска? Запишите ответ в файл '4.txt'.**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "answer4 = # Ваш код здесь\n",
- "print(answer4)\n",
- "write_answer_to_file(answer4, '4.txt')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Ответами к заданию будут текстовые файлы, полученные в ходе этого решения. Обратите внимание, что отправленные файлы не должны содержать пустую строку в конце. Данный нюанс является ограничением платформы Coursera. Мы работаем над исправлением этого ограничения.**"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement