(x), которая минимизирует стоимость J(θ).

2.2. Линейная регрессия одной переменной

Задача линейной регрессии формулируется как поиск минимальной функции стоимости (см. формулу 2.1) при условии, что функция гипотезы является линейной h= θ>0 + θ>1x. Очевидно, что подобная функция соответствует линии в двумерном пространстве (рисунок 3.1a). Для нахождения оптимальной функции h(x) применяется алгоритм градиентного спуска (gradient descent), суть которого заключается в последовательном изменении параметров θ>0, θ>1 с использованием выражения:



где α – параметр обучения; а

является производной функции стоимости по θ>j. Знак := означает присваивание, в отличие от знака равенства (=), применяемого в алгебраических выражениях.

При этом шаги алгоритма выполняются так, что вначале происходит одновременное изменение обоих параметров на основании выражения 2.2 и только затем использование их для расчета новых значений функции стоимости. Другими словами, алгоритмическая последовательность одного из шагов цикла для случая двух параметров, выраженная на псевдокоде, будет следующей:



Отметим, что выражение функции гипотезы можно преобразовать следующим образом:



и записать в виде:



с учетом того, что x>0 = 1. Последнее выражение позволяет вычислять функцию гипотезы путем матричного умножения матрицы X, первая колонка которой всегда состоит из единиц, на вектор θ.

С учетом дифференцирования выражения 1.3 и 1.4 можно переписать в виде:



В зависимости от параметра обучения α алгоритм может достигать минимума (сходиться) или же при слишком большом α не сходиться.

Наиболее простой в реализации, но не оптимальный по времени выполнения пакетный алгоритм градиентного спуска (Batch Gradient Descent) использует все обучающие примеры на каждом шаге алгоритма. Вместо алгоритма градиентного спуска для нахождения параметров θ>j можно использовать матричное выражение:



где θ – вектор параметров; (X>TX)>-1 – обратная матрица X>TX; X>T – транспонированная матрица X.

Преимуществом матричных операций является то, что нет необходимости подбирать параметр α и выполнять несколько итераций алгоритма. Недостаток связан с необходимостью получения обратной матрицы, сложность вычисления которой пропорциональна O(n>3), а также c невозможностью получения обратной матрицы в некоторых случаях.


Рассмотрим пример.

Решим гипотетическую задачу нахождения параметров линейной регрессии методом градиентного спуска. Во-первых, подключим необходимые библиотеки:


%matplotlib inline

import matplotlib.pyplot as plt

import numpy as np

import time


Отметим, что библиотека time позволит нам рассчитать время выполнения программы. Ее применение будет понятно из нижеследующего кода. Сформируем обучающее множество, состоящее из 30 примеров:


xr=np.matrix(np.linspace(0,10,30))

x=xr.T

#значения функции зададим в виде следующего выражения

y=np.power(x,2)+1

#Построим график (рисунок) командами

plt.figure(figsize=(9,9))

plt.plot(x,y,'.')


Рисунок 2.2. График функции y=x>2+1


В нашем случае мы задали фиксированное множество примеров (m = 30), однако в дальнейшем мы можем его изменить. Для тогo чтобы программа воспринимала любое множество примеров, определим его, используя метод size:


m=x.size

#сформируем первую колонку матрицы X, состоящую из единиц

on=np.ones([m,1])

#и сформируем матрицу X, объединив колонки

X=np.concatenate((on,x),axis=1)


Это матрица, в первой колонке которой стоят единицы, а во второй – значения x>(1), x>(2),…, x>(m). Затем зададим абсолютно произвольно начальные значения коэффициентов регрессии:


theta=np.matrix('0.1;1.3')

#и рассчитаем значения функции гипотезы