ISBN :
Возрастное ограничение : 16
Дата обновления : 17.01.2024
с учетом того, что x
= 1. Последнее выражение позволяет вычислять функцию гипотезы путем матричного умножения матрицы X, первая колонка которой всегда состоит из единиц, на вектор ?.
С учетом дифференцирования выражения 1.3 и 1.4 можно переписать в виде:
В зависимости от параметра обучения ? алгоритм может достигать минимума (сходиться) или же при слишком большом ? не сходиться.
Наиболее простой в реализации, но не оптимальный по времени выполнения пакетный алгоритм градиентного спуска (Batch Gradient Descent) использует все обучающие примеры на каждом шаге алгоритма. Вместо алгоритма градиентного спуска для нахождения параметров ?
можно использовать матричное выражение:
где ? – вектор параметров; (X
X)
– обратная матрица X
X; X
– транспонированная матрица X.
Преимуществом матричных операций является то, что нет необходимости подбирать параметр ? и выполнять несколько итераций алгоритма. Недостаток связан с необходимостью получения обратной матрицы, сложность вычисления которой пропорциональна O(n
), а также 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
+1
В нашем случае мы задали фиксированное множество примеров (m = 30), однако в дальнейшем мы можем его изменить. Для тогo чтобы программа воспринимала любое множество примеров, определим его, используя метод size:
m=x.size
#сформируем первую колонку матрицы X, состоящую из единиц
on=np.ones([m,1])
#и сформируем матрицу X, объединив колонки
X=np.concatenate((on,x),axis=1)
Это матрица, в первой колонке которой стоят единицы, а во второй – значения x
, x
,…, x
. Затем зададим абсолютно произвольно начальные значения коэффициентов регрессии:
theta=np.matrix('0.1;1.3')
#и рассчитаем значения функции гипотезы
h=np.dot(X,theta)
#дополним предыдущий график регрессионной прямой
plt.plot(x,h)
Получим график вида:
Рисунок 2.3. Начальное положение прямой регрессии
На графике видно, что прямая функция гипотезы далека от идеальной. Применим алгоритм градиентного спуска для нахождения оптимальных значений параметров регрессионной прямой (функции гипотезы):
t0=time.time()
alpha=0.05
iterations=500
for i in range(iterations):
theta=theta-alpha*(1/m)*np.sum(np.multiply((h-y),x))
h=np.dot(X,theta)
t1=time.time()
#Построим графики
plt.figure(figsize=(9,9))
plt.plot(x,y,'.')
plt.plot(x,h,label='regressionByIteration')
leg=plt.legend(loc='upper right',shadow=True,fontsize='x-small')
leg.get_frame().set_facecolor('#0055DD')
leg.get_frame().set_facecolor('#eeeeee')
leg.get_frame().set_alpha(0.5)
plt.show()
Получим следующий график регрессионной прямой:
Рисунок 2.4. Результат выполнения алгоритма градиентного спуска
#рассчитаем среднеквадратическую ошибку
mse=np.sum(np.power((h-y),2))/m
Все книги на сайте предоставены для ознакомления и защищены авторским правом