Оценка жира в организме

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

Задача: Оценить процент жира в организме

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

  • Возраст (лет)

  • Вес (фунтов)

  • Высота (дюймы)

  • Окружность шеи (см)

  • Окружность грудной клетки (см)

  • Окружность брюшка (см)

  • Окружность бедра (см)

  • Окружность бедра (см)

  • Окружность колена (см)

  • Окружность лодыжки (см)

  • Бицепс (удлиненный) по окружности (см)

  • Окружность предплечья (см)

  • Окружность запястья (см)

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

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

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

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

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

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

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

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

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

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

[X,T] = bodyfat_dataset;

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

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

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

size(X)
size(T)
ans =

    13   252


ans =

     1   252

Аппроксимация функции нейронной сетью

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

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

setdemorandstream(491218382)

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

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

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

net = fitnet(15);
view(net)

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

Neural Network Training Tool показывает обучаемую сеть и алгоритмы, используемые для ее обучения. В нем также отображается состояние обучения во время обучения, и критерии, которые остановили обучение, будут выделены зеленым цветом.

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

[net,tr] = train(net,X,T);
nntraintool
nntraintool('close')

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

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

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

plotperform(tr)

Проверка нейронной сети

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

testX = X(:,tr.testInd);
testT = T(:,tr.testInd);

testY = net(testX);

perf = mse(net,testT,testY)
perf =

   36.9404

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

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

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

Y = net(X);

plotregression(T,Y)

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

e = T - Y;

ploterrhist(e)

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

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