BP神经网络

来源:互联网 发布:淘宝代销如何看进价 编辑:程序博客网 时间:2024/06/15 19:54
BP神经网络属于多层前向网络,是前向神经网络的核心部分,也是人工神经网络体系中的精华,主要应用于分类识别、逼近、回归、压缩等领域。

BP神经网络的结构

(1).BP神经网络拓扑图
这里写图片描述
(2).BP神经网络的特点
1.网络由多层构成,层之间全连接,同层无连接。
2.BP网络的激活函数必须可微,一般使用以下函数:
这里写图片描述
3.采用误差反向传播算法进行学习

BP网络的学习算法

实现算法:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

BP网络的设计

由于BP神经网络采用有监督的学习,因此BP网络解决实际问题,首先需要一个训练集。BP网络的设计主要包括:网络层数、输入层节点数、隐含层节点数、输入层节点数及传输函数、训练方法、训练参数的设置等几个方面。
1.网络层数
BP网络可以包含一到多个隐含层。理论上已经证明,单个隐含层可以通过适当增加神经元节点的个数实现任意非线性映射。对于大部分应用场合基本上可以满足。但如果样本较多,增加一个隐含层可以明显减少网络规模。
2.输入层节点数
输入层节点数取决于输入向量的维数。如8*8的图像,输入向量应为64维。
3.隐含层节点数
通常采用经验公式给出的估计值:
这里写图片描述
4.输出层神经元个数
输出层神经元的个数同样需要根据从实际问题得到抽象模型来确定。如输出有4种情况,因此采用二维输出即可覆盖,00、01、10、11分别表示一种类型,使用输出神经元的个数为4。
5.传递函数的选择
一般隐含层使用Sigmoid函数,而输出层采用线性函数。
6.初始权值
BP网络采用迭代更新的方法确定权值,因此需要一个初始值。一般初始值都是随机给的。
7.训练集归一化
这里写图片描述

BP神经网络的缺陷:

(1)容易形成局部极小值而得不到全局最优值。BP神经网络中极小值比较多,所以很容易陷入局部极小值,这就要求对初始权值和阀值有要求,要使得初始权值和阀值随机性足够好,可以多次随机来实现。
(2)训练次数多使得学习效率低,收敛速度慢。
(3)隐含层的选取缺乏理论的指导。
(4)训练时学习新样本有遗忘旧样本的趋势。

BP神经网络MATLAB实现:

数据集、代码下载链接:
http://download.csdn.net/detail/qq_35842523/9887521

%% I. 清空环境变量clear allclc%% II. 训练集/测试集产生%%% 1. 导入数据load spectra_data.mat%%% 2. 随机产生训练集和测试集temp = randperm(size(NIR,1));% 训练集——50个样本P_train = NIR(temp(1:50),:)';T_train = octane(temp(1:50),:)';% 测试集——10个样本P_test = NIR(temp(51:end),:)';T_test = octane(temp(51:end),:)';N = size(P_test,2);%% III. 数据归一化[p_train, ps_input] = mapminmax(P_train,0,1);p_test = mapminmax('apply',P_test,ps_input);[t_train, ps_output] = mapminmax(T_train,0,1);%% IV. BP神经网络创建、训练及仿真测试%%% 1. 创建网络net = newff(p_train,t_train,9);%%% 2. 设置训练参数net.trainParam.epochs = 1000;net.trainParam.goal = 1e-3;net.trainParam.lr = 0.01;%%% 3. 训练网络net = train(net,p_train,t_train);%%% 4. 仿真测试t_sim = sim(net,p_test);%%% 5. 数据反归一化T_sim = mapminmax('reverse',t_sim,ps_output);%% V. 性能评价%%% 1. 相对误差errorerror = abs(T_sim - T_test)./T_test;%%% 2. 决定系数R^2R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); %%% 3. 结果对比result = [T_test' T_sim' error']%% VI. 绘图figureplot(1:N,T_test,'b:*',1:N,T_sim,'r-o')legend('真实值','预测值')xlabel('预测样本')ylabel('辛烷值')string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};title(string)
原创粉丝点击