Классификация крабов

Этот пример иллюстрирует использование нейронной сети в качестве классификатора для идентификации пола крабов из физических размерностей краба.

Задача: классификация крабов

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

Почему нейронные сети?

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

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

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

Подготовка данных

Данные для задач классификации настраиваются для нейронной сети путем организации данных в две матрицы, входную матрицу X и целевую матрицу T.

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

Каждый соответствующий столбец целевой матрицы будет иметь два элемента. Самки крабов представлены одним в первом элементе, самцы крабов с одним во втором элементе. (Все остальные элементы равны нулю).

Здесь загружается набор данных.

[x,t] = crab_dataset;
size(x)
size(t)
ans =

     6   200


ans =

     2   200

Создание классификатора нейронной сети

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

Поскольку нейронная сеть начинается со случайных начальных весов, результаты этого примера будут незначительно различаться каждый раз, когда он запускается. Случайный seed устанавливается, чтобы избежать этой случайности. Однако для собственных приложений это не обязательно.

setdemorandstream(491218382)

Двухслойная (то есть однослойная) передача прямых нейронных сетей может узнать любую зависимость «вход-выход», учитывая достаточное количество нейронов в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.

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

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

net = patternnet(10);
view(net)

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

[net,tr] = train(net,x,t);
nntraintool

nntraintool('close')

Чтобы увидеть, как улучшилась производительность сети во время обучения, либо нажмите кнопку «Эффективность» в обучающем инструменте, либо вызовите PLOTPERFORM.

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

Эффективность показана для каждого из наборов обучения, валидации и тестирования.

plotperform(tr)

Проверка классификатора

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

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

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testIndices = vec2ind(testY)
testIndices =

  Columns 1 through 13

     2     2     2     1     2     2     2     1     2     2     2     2     1

  Columns 14 through 26

     1     2     2     2     1     2     2     1     2     1     1     1     1

  Columns 27 through 30

     1     2     2     1

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

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

Если сеть научилась классифицировать правильно, проценты в красных квадратах должны быть очень маленькими, что указывает на несколько неправильных классификаций.

Если это не так, было бы целесообразно продолжить обучение или обучить сеть с более скрытыми нейронами.

plotconfusion(testT,testY)

Вот общие проценты правильной и неправильной классификации.

[c,cm] = confusion(testT,testY)

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
c =

    0.0333


cm =

    12     1
     0    17

Percentage Correct Classification   : 96.666667%
Percentage Incorrect Classification : 3.333333%

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

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

plotroc(testT,testY)

Этот пример иллюстрировал использование нейронной сети для классификации крабов.

Исследуйте другие примеры и документацию для получения дополнительной информации о нейронных сетях и их приложениях.