Этот пример иллюстрирует использование нейронной сети как классификатор, чтобы идентифицировать пол крабов от физических размерностей краба.
В этом примере мы пытаемся создать классификатор, который может идентифицировать пол краба от его физических измерений. Шесть физических характеристик краба рассматриваются: разновидности, frontallip, rearwidth, длина, ширина и глубина. Проблема под рукой состоит в том, чтобы идентифицировать пол краба, учитывая наблюдаемые величины для каждых из этих 6 физических характеристик.
Нейронные сети оказались как опытные классификаторы и особенно хорошо подходят для рассмотрения нелинейных проблем. Учитывая нелинейную природу явлений реального мира, как классификация крабов, нейронные сети являются, конечно, хорошим кандидатом на то, чтобы решить задачу.
Эти шесть физических характеристик будут действовать как входные параметры к нейронной сети, и пол краба будет целью. Учитывая вход, который составляет эти шесть наблюдаемых величин для физических характеристик краба, нейронная сеть, как ожидают, идентифицирует, является ли краб штекером или розеткой.
Это достигается путем представления ранее зарегистрированных входных параметров нейронной сети и затем настройки ее, чтобы произвести желаемые целевые выходные параметры. Этот процесс называется обучением нейронной сети.
Данные для проблем классификации настраиваются для нейронной сети путем организации данных в две матрицы, входную матрицу X и целевую матрицу T.
Каждый i-ый столбец входной матрицы будет иметь шесть элементов, представляющих виды краба, frontallip, rearwidth, длину, ширину и глубину.
Каждый соответствующий столбец целевой матрицы будет иметь два элемента. Розеточные крабы представлены тем в первом элементе, штекерных крабах с тем во втором элементе. (Всеми другими элементами является нуль).
Здесь набор данных загружается.
[x,t] = crab_dataset; size(x) size(t)
ans = 6 200 ans = 2 200
Следующий шаг должен создать нейронную сеть, которая будет учиться идентифицировать пол крабов.
Поскольку нейронная сеть запускается со случайных начальных весов, результаты этого примера будут отличаться немного каждый раз, когда это запущено. Случайный seed собирается избежать этой случайности. Однако это не необходимо для ваших собственных приложений.
setdemorandstream(491218382)
2D слой (i.e. один скрытый слой), канал прямые нейронные сети могут изучить любое отношение ввода - вывода, учитывая достаточные нейроны в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.
Мы попробуем один скрытый слой 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
Одной мерой того, как хорошо нейронная сеть имеет подгонку данные, является график беспорядка. Здесь матрица беспорядка построена через все выборки.
Матрица беспорядка показывает проценты правильных и неправильных классификаций. Правильные классификации являются зелеными квадратами на диагонали матриц. Неправильные классификации формируют красные квадраты.
Если сеть училась классифицировать правильно, проценты в красных квадратах должны быть очень маленькими, указав на немного misclassifications.
Если бы дело обстоит не так затем дальнейшее обучение или обучение сети с более скрытыми нейронами, было бы желательно.
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)
Этот пример проиллюстрировал использование нейронной сети, чтобы классифицировать крабов.
Исследуйте другие примеры и документацию для большего понимания нейронных сетей и их приложений.