43、基于神经网络拟合函数的体脂估计(matlab)

news2025/2/27 23:23:02

1、神经网络拟合函数的原理及流程

神经网络拟合函数是一种基于人工神经元之间相互连接的模型,用来拟合复杂的非线性函数关系。其原理是通过多层次的神经元网络,每一层神经元通过激活函数将输入信号加权求和后输出,经过多次迭代优化权值,使得网络输出与实际值误差最小化。

流程如下:

  1. 定义神经网络结构:包括输入层、隐藏层、输出层的神经元数量,选择激活函数、损失函数等网络参数。
  2. 初始化权重和偏置:随机初始化神经元之间的连接权重和偏置值。
  3. 前向传播计算:输入训练数据,通过输入层逐层传播计算每一层神经元的输出。
  4. 计算损失函数:将网络输出与真实标签值计算损失,评估网络拟合效果。
  5. 反向传播更新参数:根据损失函数反向传播误差,调整权值和偏置。采用梯度下降或其他优化算法更新参数。
  6. 重复迭代训练:循环进行步骤3-5,直到损失函数收敛或达到最大训练轮数。
  7. 模型测试和预测:使用训练好的神经网络模型进行测试数据验证和未知数据预测。

通过上述流程,神经网络可以拟合复杂的非线性函数关系,并在训练数据集上获得良好的拟合效果

2、 神经网络拟合函数的体脂估计说明

1)解决问题

函数拟合神经网络,基于解剖学测量值来估计体脂率

2)网络构建

构建一个神经网络,该网络可以估计通过 13 个身体属性进行描述的人的体脂率

3)实验参数

年龄(岁)/重量(磅)/身高(英寸)/颈围 (cm)/胸围 (cm)/腹围 (cm)/臀围 (cm)/大腿围 (cm)/膝围 (cm)/踝围 (cm)/上臂(伸展)围 (cm)/前臂围 (cm)/腕围 (cm)

4)整体说明

是输入与相关目标输出匹配的拟合问题,希望所创建的神经网络不仅可以根据已知输入估计已知目标,还能泛化成针对未被用于设计解决方案的输入准确估计输出。
神经网络非常擅长处理函数拟合问题。具有足够元素(称为神经元)的神经网络可以以任意准确度拟合任何数据。它们特别适合处理非线性问题。鉴于真实情况(如体脂增加)的非线性特性,神经网络是处理此问题的优选方案。
十三个身体属性将作为神经网络的输入,体脂率将成为目标。该网络将设计为使用体脂率已知的人体的解剖学数据进行训练以生成目标估值。

3、准备数据

说明

通过将数据组织成两个矩阵(输入矩阵 X 和目标矩阵 T)来为神经网络设置函数拟合问题的数据。
输入矩阵的每个第 i 列都将有十三个元素,表示一个体脂率已知的人体。
目标矩阵的每个对应列都将有一个元素,表示体脂率。

1)加载数据集

代码

[X,T] = bodyfat_dataset;

2)查看输入 X 和目标 T 的大小

说明:X 和 T 都有 252 列。这表示 252 个体型(输入)和相关体脂率(目标)。输入矩阵 X 有十三行,表示十三个属性。

代码

size(X)
size(T)

 4、使用神经网络拟合函数

1)创建一个学习估计体脂率的神经网络。

说明:神经网络以随机初始权重开始,因此该示例的结果在每次运行时都会略有不同

代码

setdemorandstream(491218382)

2)具有 15 个神经元的单隐藏层 

说明:

双层(即,一个隐藏层)前馈神经网络可以拟合任何输入-输出关系,前提是隐藏层中有足够的神经元。非输出层称为隐含层。
尝试具有 15 个神经元的单隐藏层。一般情况下,问题越困难,需要的神经元和层就越多。问题越简单,需要的神经元就越少。
输入和输出的大小为 0,因为网络尚未配置成与我们的输入数据和目标数据相匹配。

代码

net = fitnet(15);
view(net)

 视图效果

 1)开始训练

说明:样本自动分为训练集、验证集和测试集。训练集用于对网络进行训练。只要网络针对验证集持续改进,训练就会继续。测试集提供完全独立的网络准确度测量。
神经网络训练工具显示正在接受训练的网络和用于训练该网络的算法。它还显示训练过程中的训练状态以及停止训练的条件(以绿色突出显示)。
底部的按钮用于打开有用的绘图,这些图可以在训练期间和训练后打开。算法名称和绘图按钮旁边的链接可打开有关这些主题的文档。

代码

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

试图效果

2) 网络性能的改善

说明:

性能以均方误差衡量,并以对数刻度显示。随着网络训练的加深,均方误差迅速降低。
绘图会显示训练集、验证集和测试集的性能。最终网络是针对验证集性能最好的网络。

代码

figure(1)
plotperform(tr)

视图效果

 5、测试神经网络

说明:

测试样本测量经过训练的神经网络的均方误差。能够了解网络在应用于真实数据时表现如何。

1)均方误差代码

testX = X(:,tr.testInd);
testT = T(:,tr.testInd);
testY = net(testX);
perf = mse(net,testT,testY)

2)回归图

说明:

衡量神经网络数据拟合程度的另一个方法是回归图,回归图显示了根据相关目标值绘制的实际网
络输出。如果网络已学会很好地拟合数据,则此输出-目标关系的线性拟合线与图边界的交点应该在左下角和右上角附近。如果不是这样,则建议进一步进行训练,或训练具有更多隐藏神经元的网络。

代码

Y = net(X);
figure(2)
plotregression(T,Y)

视图效果

 3)误差直方图

说明:

衡量神经网络数据拟合程度的第三个方法是误差直方图。该图可显示误差大小的分布方式。通常,大多数误差接近于零,很少有误差大幅偏离。

代码

e = T - Y;
figure(3)
ploterrhist(e)

视图效果

7、总结

在MATLAB中使用神经网络进行体脂估计的步骤可以总结如下:

  1. 数据准备:准备包含个人生物特征数据(如身高、体重、腰围等)和对应的体脂率数据的训练集和测试集。

  2. 数据预处理:对数据进行标准化处理,使得数据具有相似的尺度和分布,有利于神经网络的训练。

  3. 创建神经网络模型:使用MATLAB的神经网络工具箱中的函数创建一个多层感知器(MLP)神经网络模型,并定义模型的结构、激活函数等参数。

  4. 训练神经网络:使用训练集对神经网络进行训练,通过反向传播算法不断调整网络权重和偏置,使得网络能够拟合输入特征与体脂率之间的非线性关系。

  5. 模型评价:使用测试集评价训练好的神经网络模型的性能,可以计算均方误差(MSE)等指标评估模型的拟合效果。

  6. 预测体脂率:使用训练好的神经网络模型对新的个人生物特征数据进行预测,得到对应的体脂率估计值。

  7. 结果分析:分析神经网络模型的预测结果,可以进一步优化模型参数或者增加数据特征,提升体脂率的估计准确度。

总的来说,基于MATLAB的神经网络拟合函数的体脂估计可以通过数据准备、神经网络模型构建、训练优化、模型评价和预测等步骤完成,为体脂率估计提供一种有效的方法。

8、源码 

代码

%% 基于神经网络拟合函数的体脂估计
%说明:函数拟合神经网络,基于解剖学测量值来估计体脂率
%构建一个神经网络,该网络可以估计通过 13 个身体属性进行描述的人的体脂率
%参数:年龄(岁)重量(磅)身高(英寸)颈围 (cm)胸围 (cm)腹围 (cm)臀围 (cm)大腿围 (cm)膝围 (cm)踝围 (cm)上臂(伸展)围 (cm)前臂围 (cm)腕围 (cm)
%是输入与相关目标输出匹配的拟合问题,希望所创建的神经网络不仅可以根据已知输入估计已知目标,还能泛化成针对未被用于设计解决方案的输入准确估计输出。
%神经网络非常擅长处理函数拟合问题。具有足够元素(称为神经元)的神经网络可以以任意准确度拟合任何数据。它们特别适合处理非线性问题。鉴于真实情况(如体脂增加)的非线性特性,神经网络是处理此问题的优选方案。
%十三个身体属性将作为神经网络的输入,体脂率将成为目标。
%该网络将设计为使用体脂率已知的人体的解剖学数据进行训练以生成目标估值。
%% 准备数据
%说明:通过将数据组织成两个矩阵(输入矩阵 X 和目标矩阵 T)来为神经网络设置函数拟合问题的数据。
%输入矩阵的每个第 i 列都将有十三个元素,表示一个体脂率已知的人体。
%目标矩阵的每个对应列都将有一个元素,表示体脂率。
%加载数据集
[X,T] = bodyfat_dataset;
%查看输入 X 和目标 T 的大小。
%X 和 T 都有 252 列。这表示 252 个体型(输入)和相关体脂率(目标)。输入矩阵 X 有十三行,表示十三个属性。
size(X)
size(T)
%% 使用神经网络拟合函数
%创建一个学习估计体脂率的神经网络。
%神经网络以随机初始权重开始,因此该示例的结果在每次运行时都会略有不同
setdemorandstream(491218382)
%双层(即,一个隐藏层)前馈神经网络可以拟合任何输入-输出关系,前提是隐藏层中有足够的神经元。非输出层称为隐含层
%尝试具有 15 个神经元的单隐藏层。一般情况下,问题越困难,需要的神经元和层就越多。问题越简单,需要的神经元就越少。
%输入和输出的大小为 0,因为网络尚未配置成与我们的输入数据和目标数据相匹配。
net = fitnet(15);
view(net)
%开始训练
%样本自动分为训练集、验证集和测试集。训练集用于对网络进行训练。只要网络针对验证集持续改进,训练就会继续。测试集提供完全独立的网络准确度测量。
%神经网络训练工具显示正在接受训练的网络和用于训练该网络的算法。它还显示训练过程中的训练状态以及停止训练的条件(以绿色突出显示)。
%底部的按钮用于打开有用的绘图,这些图可以在训练期间和训练后打开。算法名称和绘图按钮旁边的链接可打开有关这些主题的文档。
[net,tr] = train(net,X,T);
%性能以均方误差衡量,并以对数刻度显示。随着网络训练的加深,均方误差迅速降低。
%绘图会显示训练集、验证集和测试集的性能。最终网络是针对验证集性能最好的网络。
%训练过程中网络性能的改善情况
figure(1)
plotperform(tr)
%% 测试神经网络
%测试样本测量经过训练的神经网络的均方误差。能够了解网络在应用于真实数据时表现如何。
testX = X(:,tr.testInd);
testT = T(:,tr.testInd);
testY = net(testX);
perf = mse(net,testT,testY)
%衡量神经网络数据拟合程度的另一个方法是回归图,回归图显示了根据相关目标值绘制的实际网
%络输出。如果网络已学会很好地拟合数据,则此输出-目标关系的线性拟合线与图边界的交点应该在左下角和右上角附近。
%如果不是这样,则建议进一步进行训练,或训练具有更多隐藏神经元的网络。
%回归图
Y = net(X);
figure(2)
plotregression(T,Y)
%衡量神经网络数据拟合程度的第三个方法是误差直方图。该图可显示误差大小的分布方式。通常,大多数误差接近于零,很少有误差大幅偏离。
%误差直方图
e = T - Y;
figure(3)
ploterrhist(e)




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 集合框架详谈及代码分析(Iterable->Collection->List、Set->各接口实现类、Map->各接口实现类)

目录 Java 集合框架详谈及代码分析(Iterable->Collection->List、Set->各接口实现类、Map->各接口实现类)1、集合概述1-1:Java 集合概述1-2:List、Set、Map 三者的区别?1-3:集合框架底层数据结…

python电灯开关 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python电灯开关 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 n个灯排成一排,开始时都是关着的。现进行如下操作: 所有电灯的按钮按动一次;所有编号为2的倍数的电灯按钮按动一次;所有编号为3的倍数的电灯的按钮按动一次: …所有编号为n-1的…

LeetCode 算法:删除链表的倒数第 N 个结点 c++

原题链接🔗:删除链表的倒数第 N 个结点 难度:中等⭐️⭐️ 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出&#xff1a…

详细分析Element Plus的el-pagination基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 需求:从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页,作为全栈玩家,先在前端部署一个分页的列表 相关后续的功能,是Java,推荐阅读&#x…

rockchip linux sdk指定编译配置文件

SDK&#xff1a;rk3568_linux4.19_V1.4.0 硬件平台&#xff1a;RK3566 一、指定板级配置文件 板级配置文件在<SDK>/device/rockchip/rk3566_rk3568目录下。 1、方法1 ./build.sh后⾯加上板级配置⽂件&#xff0c;例如&#xff1a; ./build.sh /device/rockchip/rk3…

STM32微控制器库指南:函数特性、应用范围与实践

在嵌入式系统的设计和开发中&#xff0c;STM32系列微控制器因其卓越的处理能力和多样的外设选项而广受推崇。STM32库函数作为开发流程中不可或缺的工具&#xff0c;扮演着至关重要的角色。本文将详细阐述STM32库函数的主要特性、应用场景及其在实际开发中的应用实例。 什么是ST…

Golang | Leetcode Golang题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; func convertToTitle(columnNumber int) string {ans : []byte{}for columnNumber > 0 {columnNumber--ans append(ans, Abyte(columnNumber%26))columnNumber / 26}for i, n : 0, len(ans); i < n/2; i {ans[i], ans[n-1-i] ans[n…

JavaScript基础部分知识点总结(Part3)

函数的概念 1. 函数的概念 在JS 里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较具有局限性&#xff0c;此时我们就可以使用JS 中的函数。函数&…

RabbitMQ实践——交换器(Exchange)和绑定(Banding)

大纲 direct型交换器默认交换器命名交换器 fanout型交换器topic型交换器headers型交换器 RabbitMQ在概念上由三部分组成&#xff1a; 交换器&#xff08;Exchange&#xff09;&#xff1a;负责接收消息发布者发布消息的结构&#xff0c;同时它会根据“绑定关系”&#xff08;Ba…

PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

界面图&#xff1a; Qt Designer中创建窗口&#xff0c;放置一个QGroupBox&#xff0c;命名为btnStation&#xff0c;这就是自定义的按钮站&#xff0c;按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮&#xff0c;每按一次状态反转并保持不变。独占按钮也是自锁功…

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错&#xff1a;asyncio.exceptions.TimeoutError 报错信息如下&#xff1a; Traceback (most recent call last): asyncio.run(main()) File “D:\miniconda3\envs\py31013\lib\asyncio\runners.py”, line 44, in…

Python酷库之旅-比翼双飞情侣库(17)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…

第三十三章 添加和使用自定义标题元素

文章目录 第三十三章 添加和使用自定义标题元素SOAP 标头元素简介如何表示 SOAP 标头 第三十三章 添加和使用自定义标题元素 本主题介绍如何添加和使用自定义 SOAP 标头元素。 有关发生故障时添加标头元素的信息&#xff0c;请参阅 SOAP 故障处理。 WS-Addressing 标头元素在…

Java swing JTable 示例

代码&#xff0c; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable;public class Mylmlk {public static void main(String[] agrs){JFrame framenew JFrame("学生成绩表");frame.setSize(500,2…

it职业生涯规划系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;职业介绍管理&#xff0c;答题管理&#xff0c;试题管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;在线答题&#xff0…

QT基础 - QMainWindow主窗口

目录 零. 简介 一. 菜单栏 二. 工具栏 三. 状态栏 四. 可停靠区域 五. 总结 零. 简介 QMainWindow 是 Qt 中用于构建主窗口的类。 它通常包含以下几个主要部分&#xff1a; 菜单栏&#xff1a;用于提供各种操作选项。工具栏&#xff1a;放置常用的操作按钮。中心区域&…

DAMA学习笔记(二)-数据治理

1.引言 数据治理&#xff08;Data Governance&#xff0c;DG&#xff09;的定义是在管理数据资产过程中行使权力和管控&#xff0c;包括计划、监控和实施。在所有组织中&#xff0c;无论是否有正式的数据治理职能&#xff0c;都需要对数据进行决策。建立了正式的数据治理规程及…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵&#xff0c; 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

排序算法及源代码

堆排序&#xff1a; 在学习堆之后我们知道了大堆和小堆&#xff0c;对于大堆而言第一个节点就是对大值&#xff0c;对于小堆而言&#xff0c;第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆&#xff0c;如此下去就可以实现建堆排…