Проблема XOR

Здравствуйте и добро пожаловать на занятия по логистической регрессии на языке Python.

Это последняя лекция в этой части, и на ней мы рассмотрим ещё одну практическую проблему, связанную с логистической регрессией, называемую проблемой XOR.

Итак, в отличие от предыдущей проблемы, здесь у нас всего четыре точки входных данных.

import numpy as np

import matplolib.pyplot as plt

N = 4

D = 2

XOR, оно же исключающее ИЛИ, имеет две входящих переменных, каждая из которых принимает значение «истина» или «ложь». При этом в качестве выхода функция выдаёт значение «истина», если входящие переменные имеют разные значения, и «ложь» – если одинаковые.

Таким образом, у нас есть четыре точки данных, представляющие различные комбинации значений «истина» и «ложь» нашей целевой функции. Мы можем записать их вручную.

X = np.array([

[0, 0],

[0, 1],

[1, 0],

[1, 1],

])

T = np.array([0, 1, 1, 0])

Вновь добавим столбец из единиц для наших входных данных и изобразим это графически, чтобы вы смогли увидеть, как это выглядит.

ones = np.array([[1]*N]).T

plt.scatter(X[:,0], X[:,1], c=T)

plt.show()

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

Фокус решения проблемы XOR заключается в том, что мы вновь создадим ещё одну размерность наших входных данных, преобразуя, таким образом, двухмерную задачу в трёхмерную. После этого мы легко сможем нарисовать прямую между двумя классами данных.

Если у вас есть опыт в построении трёхмерных изображений, вы легко можете увидеть, что сведя переменные x и y в новую переменную, мы можем преобразовать данные в линейно разделяемые.

xy = np.matrix(X[:,0] * X[:,1]).T

Xb = np.array(np.concatenate((ones, xy, X), axis=1))

Весь остальной код остаётся прежним; его можно скопировать из кода предыдущих программ.

w = np.random.randn(D + 2)

z = Xb.dot(w)

def sigmoid(z):

return 1/(1 + np.exp(-z))

Y = sigmoid(z)

def cross_entropy(T, Y):

E = 0

for i in xrange(N):

if T[i] == 1:

E -= np.log(Y[i])

else:

E -= np.log(1 – Y[i])

return E

Вернёмся к нашему коду. Он остаётся практически прежним, разве что коэффициент обучения установлен равным 0,001.

learning_rate = 0.001

error = []

for i in xrange(5000):

e = cross_entropy(T, Y)

error.append(e)

if i % 100 == 0:

print e

w += learning_rate * ( np.dot((T – Y).T, Xb) – 0.01*w)

Y = sigmoid(Xb.dot(w))

plt.plot(error)

plt.title(‘’Cross-entropy per iteration’’)

print ‘’Final w’’, w

print ‘’Final classification rate:’’, 1 – np.abs(T – np.round(Y)). sum / N

Запустим программу и посмотрим, какой у нас получился коэффициент классификации.

На диаграмме видим кросс-энтропийную функцию ошибок и её изменение с течением времени. Возможно, вы захотите увеличить количество итераций или изменить коэффициент обучения, потому что мне потребовалось запустить программу несколько раз, чтобы добиться наилучшего коэффициента классификации.

Наши два последних примера приводят к интересному выводу, а именно: когда речь заходит о машинном обучении, то, как вы могли видеть, мы можем применить логистическую регрессию к ряду сложных задач путём ручного изменения параметров. Мы оценивали наши данные и изменяли параметры, чтобы улучшить показатели классификации.

Что касается машинного обучения, в идеале машина может сама научиться делать такие вещи – это в точности то, что делают нейронные сети. Поэтому в будущем я собираюсь создать несколько курсов по нейронным сетям, которые могут автоматически обучаться подобным вещам.

Как достичь успеха в использовании логистической регрессии и машинном обучении?

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

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

Эти навыки нужны не только специально для логистической регрессии или глубокого обучения. Это общие знания по программированию. Лишь используя абстрактные концепции, которые вы узнали в курсе логистической регрессии, в других  знакомых вам областях знаний, вы можете быть уверенным, что вы действительно хорошо поняли материал.

Возьмём, к примеру, проблему XOR и «проблему пончика». На самом деле это искусственно созданные наборы данных, но они иллюстрируют ту важную идею, что ваши данные могут и не быть линейно разделяемыми. Они также показывают, что вы можете сделать данные линейно разделяемыми, переформулировав определение признаков. Это настоящее искусство, требует креативности и, конечно, усилий с вашей стороны.

Более того, единственное, что действительно придаст вам опытности, – это практика. При этом когда вы наблюдаете, как мы берем производные, это практикой не считается. Вы должны начать с чистого листа и пытаться самостоятельно выводить уравнения для модифицикации весовых коэффициентов. Вот это уже практика. Вы не добьётесь успеха, сколько бы часов вы не потратили, наблюдая за работой других. Успех придёт лишь тогда, когда вы будете работать самостоятельно.

Итак, вот список вещей, которые, по нашему мнению, вы должны уметь делать самостоятельно после окончания чтения данной рубрики. Вы должны знать, зачем мы берём логарифм функции правдоподобия и как его вычислить для вашего набора данных. Вы должны понимать, почему мы используем градиентный спуск вместо того, чтобы напрямую вычислить весовые коэффициенты, – хотя мы настоятельно рекомендуем попытаться это сделать, чтобы вы сами увидели, на каком месте застрянете. Вы должны уметь находить производную функции затрат относительно весовых коэффициентов. Вы должны понимать, как и почему используются матричные операции в библиотеке Numpy. Вы должны быть способными написать логистическую регрессию с использованием регуляризации с нуля, а также уметь применять её к практическим задачам вроде анализа отношения, медицинских снимков или чего-либо другого на ваш выбор.

 

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: