Равиль Ильгизович Мухамедиев "Введение в машинное обучение"

Учебник поможет студентам различных специальностей освоить современные технологии машинного обучения и практически использовать их в работе и научных проектах. В настоящем пособии даются весьма краткие теоретические и относительно подробные практические сведения о применении отдельных алгоритмов классификации и регрессии. Для практического освоения материала достаточно базовых навыков работы с языком Python. При этом освоение возможностей основных библиотек, таких как matplotlib, numpy, pandas, sklearn происходит в процессе решения задач. Используя полученные знания и навыки, студенты смогут решать широкий круг задач классификации, регрессии, анализировать влияние отдельных признаков на работу классификаторов и регрессионных моделей, снижать размерность данных, визуализировать результаты и оценивать качество моделей машинного обучения. Издание рекомендовано УМО РУМС.

date_range Год издания :

foundation Издательство :Автор

person Автор :

workspaces ISBN :

child_care Возрастное ограничение : 16

update Дата обновления : 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

Все книги на сайте предоставены для ознакомления и защищены авторским правом