算法介绍
概念 【数学建模|神经网络(ANN)】人工神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经神经系统对真实世界物体所作出的交互反应。在实际应用中,80%-90%的人工神经网络模型是采用误差反转算法或其变形形式的网络模型。
一个神经网络的典型结构:
文章图片
作用 1.拟合 ->预测。
2.分离 -> 聚类分析。
神经网络模型和网络结构 1.神经元
大脑可视作为1000多亿神经元组成的神经网络。
文章图片
下面为神经元的工作过程:
文章图片
2.神经元信息传递
神经元的信息传递和处理是一种电化学活动,树突由于电化学作用接受外界的刺激;通过胞体内的活动体现为轴突电位,当轴突电位达到一定的值则形成神经脉冲或动作电位;再通过轴突末梢传递给其他的神经元。从控制论的观点来看,这一过程可以看作一个多输入单输出非线性系统的过程。
3.人工神经元的模型
文章图片
x1-xn是从其他神经元传来的输入信号。
wij表示从神经元j到神经元i的连接权值。
另一个自变量表示阈值,或称为偏置。
神经元的输入与输出的关系:
文章图片
4.激活函数
激活函数是对净激活函数与输出进行映射的函数。一些常用的激活函数,由于输入数据与期望值之间可能并不是量级一样,所以需要激活。
文章图片
S形和双极S形函数图像:
文章图片
S形和双极S形函数的导函数均为连续函数。
5.网络模型
根据网络中神经元的互联方式的不同,网络模型分为:
前馈神经网络:只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到达到输出层,层间没有向后的输出信号。
文章图片
反馈神经网络:从输出到输入具有反馈连接的神经网络,其结构要比前馈网络复杂的多。
文章图片
自组织网络:通过自动寻找样本中的内在规律和本质属性,自组织,自适应地改变网络参数与结构。
文章图片
6.工作状态
神经网络的工作状态分为学习和工作状态。
学习:利用学习算法来调整神经元间的连接权重,使得网络输出更符合实际。
工作:神经元间的连接权值不变,可以作为分类器或者预测数据之用。
7.学习方式
学习方式分为有导师学习(监督学习)和无导师学习(非监督学习)。
有导师学习:将一组训练集送入网络,根据网络的实际输出与期望输出间的差别来调整连接权。(如:BP算法)
文章图片
无导师学习:抽取样本集合中蕴含的统计特性,并以神经元之间的联接权的形式存于网络中。(如:Hebb学习率)
文章图片
建立和应用神经网络的步骤 (1)网络结构的确定
包括网络的拓扑结构和每个神经元相应函数的选取。
(2)权重和阈值的确定
通过学习得到,为有指导的学习,也就是利用已知的一组正确的输入、输出数据,调整权和阈值使得网络输出与理想输出偏差尽量小。
(3)工作阶段
用带有确定权值和阈值的神经网络解决实际问题的过程,也叫做模拟。
BP算法 采用BP学习算法的前馈神经网络称为BP神经网络。
文章图片
BP算法基本原理:利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层反传下去,就获得了所有其他各层的误差估计。
预测类代码
% 读取数据
input = rand(2,200);
output = input(1,:) .* input(2, :);
% 训练集,测试集
input_train = input(:, 1:150);
output_train = output(1:150);
input_test = input(:, 151:end);
output_test = output(151:end);
% 数据归一化
[inputn, inputps] = mapminmax(input_train, 0, 1);
[outputn, outputps] = mapminmax(output_train);
inputn_test = mapminmax('apply', input_test, inputps);
% 构建BP神经网络
net = newff(inputn, outputn, [8, 7]) % 输入层,输出层,隐含层神经元个数% 网络参数
net.trainParam.epochs = 1000;
% 训练次数
net.trainParam.lr = 0.01;
% 学习速率
net.trainParam.goal = 0.000001 % 训练目标最小误差% BP神经网络训练
net = train(net, inputn, outputn);
% BP神经网络测试
an = sim(net, inputn_test);
% 用训练好的模型进行仿真
test_simu = mapminmax('reverse', an, outputps);
% 预测结果反归一化error = test_simu - output_test;
% 预测值和真实值的误差% 真实值与预测值误差比较
figure(1)
plot(output_test, 'bo-')
hold on
plot(test_simu, 'r*-')
hold on
plot(error, 'square', 'MarkerFaceColor', 'b')
legend('期望值', '预测值', '误差值')
xlabel('数据组数'),ylabel('值'),title('测试集预测值和期望值的误差对比'),set(gca,'fontsize',12)%计算误差
[~,len] = size(output_test);
MAE1 = sum(abs(error ./ output_test)) / len;
MSE1 = error * error' / len;
RMSE1 = MSE1 ^ (1/2);
disp(['---------------误差计算---------------'])
disp(['平均绝对误差MAE为:', num2str(MAE1)])
disp(['均方误差MSE为:', num2str(MSE1)])
disp(['均方根误差RMSE为:', num2str(RMSE1)])
推荐阅读
- 数学建模|系统(层次)聚类
- 大数据|《2022年道德黑客洞察报告》(不少人计划当全职漏洞猎人)
- 网络|开源linux_对技术的热爱导致Linux和开源
- 一板网电子论坛|使用Arduino开发板进行语音识别
- 营销模式|保健食品市场前景如何()
- 课程作业记录博客|计算机体系结构第五次实验——Branch-Target Buffers(BTB)
- 计算机视觉|一个网络两种用途!南开&哈工程提出TINet,通过细化纹理和边缘,在显著性目标检测和伪装目标检测上实现双SOTA!...
- ROS进阶教程|【ROS进阶篇】第九讲 基于Rviz和Arbotix控制的机器人模型运动
- 历史上的今天|【历史上的今天】7 月 31 日(“缸中之脑”的提出者诞生;Wi-Fi 之父出生;USB 3.1 标准发布)