Скачать книгу

пример.

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

      %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=x2+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')

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

      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

      print('regressionByIteration mse= ', mse)

      #и распечатаем длительность выполнения цикла градиентного спуска

      print('regressionByIterations takes ',(t1-t0))

      Получим примерно следующий вывод:

      regressionByIterations mse = 63.270782365456206

      regressionByIterations takes 0.027503490447998047

      В качестве небольшого дополнения рассчитаем показатели точности регрессии с применением библиотеки метрик sklearn.

      from sklearn.metrics import mean_squared_error, r2_score

      y_predict = h

      y_test=y

      print("Mean squared error: {:.2f}".format(mean_squared_error(y_test,y_predict)))

      print("r2_score: {:.2f}".format(r2_score(y_test, y_predict)))

      Получим следующие результаты:

      Mean squared error: 63.27

      r2_score: 0.93

      Подробнее о метриках точности классификации

Скачать книгу