Классификация вин

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

Проблема: классифицируйте вина

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

  • Алкоголь

  • Яблочная кислота

  • Пепел

  • Щелочность пепла

  • Магний

  • Все фенолы

  • Флавониды

  • Фенолы нефлавонида

  • Проантоцианидины

  • Интенсивность цвета

  • Оттенок

  • OD280/OD315 разбавленных вин

  • Пролин

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

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

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

Тринадцать атрибутов окружения будут действовать как входные параметры к нейронной сети, и соответствующая цель для каждого будет вектором класса с 3 элементами с 1 в позиции связанного винного завода, № 1, № 2 или № 3.

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

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

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

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

Каждый соответствующий столбец целевой матрицы будет иметь три элемента, состоя из двух нулей и 1 в месте связанного винного завода.

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

[x,t] = wine_dataset;

Мы можем просмотреть размеры входных параметров X и предназначаемся для T.

Обратите внимание на то, что и X и T имеют 178 столбцов. Они представляют 178 винных демонстрационных атрибутов (входные параметры) и сопоставленные векторы класса винного завода (цели).

Входная матрица X имеет тринадцать строк для тринадцати атрибутов. Целевая матрица T имеет три строки, что касается каждого примера, у нас есть три возможных винных завода.

size(x)
ans = 1×2

    13   178

size(t)
ans = 1×2

     3   178

Распознавание образов с нейронной сетью

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

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

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

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

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

net = patternnet(10);
view(net)

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

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

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

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

Чтобы видеть, как производительность сети, улучшаемая во время обучения, или, нажимает кнопку "Performance" в учебном инструменте или вызывает PLOTPERFORM.

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

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

plotperform(tr)

Протестируйте сеть

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

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

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

testY = net(testX);
testIndices = vec2ind(testY)
testIndices = 1×27

     1     1     1     1     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3

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

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

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

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

plotconfusion(testT,testY)

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

[c,cm] = confusion(testT,testY)
c = 0
cm = 3×3

    11     0     0
     0     8     0
     0     0     8

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

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

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

plotroc(testT,testY)

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

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