Этот пример иллюстрирует использование нейронной сети в качестве классификатора для идентификации пола крабов по физическим размерам краба.
В этом примере мы пытаемся построить классификатор, который может идентифицировать пол краба по его физическим измерениям. Рассматриваются шесть физических характеристик краба: вид, фронтальип, ширина, длина, ширина и глубина. Проблема состоит в том, чтобы определить пол краба, учитывая наблюдаемые значения для каждой из этих 6 физических характеристик.
Нейронные сети зарекомендовали себя как квалифицированные классификаторы и особенно хорошо подходят для решения нелинейных проблем. Учитывая нелинейность явлений реального мира, таких как классификация краба, нейронные сети, безусловно, являются хорошим кандидатом для решения задачи.
Шесть физических характеристик будут действовать как входы в нейронную сеть, и пол краба будет целью. Учитывая входные данные, которые составляют шесть наблюдаемых значений для физических характеристик краба, ожидается, что нейронная сеть определит, является ли краб самцом или самкой.
Это достигается путем представления ранее записанных входных данных в нейронную сеть и последующей ее настройки для получения желаемых целевых выходных данных. Этот процесс называется обучением нейронной сети.
Данные для задач классификации настраиваются для нейронной сети путем организации данных в две матрицы, входную матрицу X и целевую матрицу T.
Каждый i-й столбец входной матрицы будет иметь шесть элементов, представляющих вид краба, фронталлип, ширину, длину, ширину и глубину.
Каждый соответствующий столбец целевой матрицы будет иметь два элемента. Самки крабов представлены одним в первом элементе, самцы крабов - другим во втором элементе. (Все остальные элементы равны нулю).
Здесь загружается набор данных.
[x,t] = crab_dataset; size(x) size(t)
ans =
6 200
ans =
2 200
Следующий шаг - создание нейронной сети, которая научится идентифицировать пол крабов.
Поскольку нейронная сеть начинается со случайных начальных весов, результаты этого примера будут немного отличаться при каждом запуске. Случайное начальное число устанавливается, чтобы избежать этой случайности. Однако это не обязательно для собственных приложений.
setdemorandstream(491218382)
Двухслойные (то есть однослойные скрытые) передающие нейронные сети могут узнать любую взаимосвязь между входом и выходом, учитывая достаточное количество нейронов в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.
Мы попробуем один скрытый слой из 10 нейронов для этого примера. В общем, более сложные проблемы требуют больше нейронов и, возможно, больше слоев. Более простые проблемы требуют меньше нейронов.
Входные и выходные данные имеют размеры 0, поскольку сеть еще не настроена на соответствие нашим входным и целевым данным. Это произойдет, когда сеть будет обучена.
net = patternnet(10); view(net)

Сейчас сеть готова к обучению. Образцы автоматически разделяются на обучающие, проверочные и тестовые наборы. Обучающий набор используется для обучения сети. Обучение продолжается до тех пор, пока сеть продолжает улучшаться на наборе проверки. Тестовый набор обеспечивает полностью независимое измерение точности сети.
[net,tr] = train(net,x,t); nntraintool

nntraintool('close')
Чтобы узнать, как улучшилась производительность сети во время обучения, нажмите кнопку «Performance» в инструменте обучения или вызовите команду 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)

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