老饼讲解:一步一步上手学习
好了,这节我们开始讲BP神经网络实际建模中的内容,而在这节,我们先来说一下BP神经网络的简捷建模。为什么说是简捷建模呢,因为往往我们拿到一些数据,只是想简单地看看使用BP神经网络的效果,那么我们就只是图个快、简单,而对效果有个大概、差不多就行了,这其实也算是我们建模的第一步,就是看个大概的效果。好了,闲话不多说,让我们一步一步来看看这个应该怎么搞吧!
好了,我们还是以matlab提供的考试成绩examgrades数据来举例吧。
examgrades数据如下:

假设,我们现在要用前四个科目的成绩,来预测科目五的成绩,那么BP神经网络能不能搞定它呢?当,我们拿到数据时,就可以使用一个简单的BP神经网络来看看BP在这个问题上的大概效果了。这时我们只打算简单看看效果,而不是非常精致的建模,一个字,要快!
一如继往的,仍然是用三层的BP神经网络,隐层为tanh激活函数,而输出层为purelin输出函数,训练使用lm算法,唯一要确定的,其实就只有隐节点个数,这个也是比较好办的,参考"20个输入变量,使用7-10个隐节点"这个经验,来大概地推测一下就可以了,例如我们上面的这个问题,只有四个输入变量,那我大概地设4个隐节点就好了。
然后就可以编写代码啦,具体如下:
clear all;close all ; % 清空历史变量与窗口
setdemorandstream(88888); % 指定随机种子,实际使用中不需要
% 数据加载
load examgrades.mat % 加载acetylene数据
X = grades(:,1:4)'; % 将前4列作为输入数据
Y = grades(:,5)'; % 将第5列作为输出数据
%初始化BP神经网络,并设置一些常用关键参数
net = newff(X,Y,6,{'tansig','purelin'},'trainlm'); % 初始化BP神经网络
net.trainparam.goal = 0.00001; % 训练目标:均方误差低于0.0001
net.trainparam.show = 400; % 每训练400次展示一次结果
net.trainparam.epochs = 15000; % 最大训练次数:15000.
net.divideParam.trainRatio = 0.7; % 用于训练的数据占比
net.divideParam.valRatio = 0.15 ; % 用于验证过拟合的数据占比
net.divideParam.testRatio = 0.15; % 用于测试的数据占比
net.trainparam.max_fail = 6; % 过拟合验证失败次数
[net,tr,Z] = train(net,X,Y); % 用数据数训练网络
% ===========画图=========
figure
subplot(2,1,1); % 第1个子图
title('训练数据的拟合效果') % 标题
hold on % 先hold on
plot(1:length(tr.trainInd), Y(tr.trainInd),'b*-') % 训练数据的真实值
plot(1:length(tr.trainInd), Z(tr.trainInd),'ro-') % 训练数据的预测值
subplot(2,1,2); % 第2个子图
title('测试数据的拟合效果') % 标题
hold on % 先hold on
plot(1:length(tr.testInd),Y(tr.testInd),'b*-') % 测试数据的真实值
plot(1:length(tr.testInd), Z(tr.testInd),'ro-') % 测试数据的预测值
% --------指标-------------
train_mae = mean(abs(Y(tr.trainInd)-Z(tr.trainInd))) % 训练数据的MAE
test_mae = mean(abs(Y(tr.testInd) -Z(tr.testInd))) % 测试数据的MAE
% 计算归一化数据的mae
[Yn,ps] = mapminmax(Y,0,1); % 将真实值Y归一化到[0,1]
Zn = mapminmax('apply',Z,ps); % 将预测值Z归一化到[0,1]
train_mae_norm = mean(abs(Yn(tr.trainInd)-Zn(tr.trainInd))) % 计算归一化后,训练数据的MAE
test_mae_norm = mean(abs(Yn(tr.testInd) -Zn(tr.testInd))) % 计算归一化后,测试数据的MAE
%=============模型对新输入的使用============
z = sim(net,X); % 实际与上面train中返回的Z一致运行结果如下:

train_mae = 2.2375
test_mae = 2.6596
train_mae_norm = 0.0932
test_mae_norm = 0.1108
好了,这里我们先简单地展示一下问题和代码,以及代码的运行结果,接下来我们再慢慢说说代码是什么意思、要注意什么内容、以及为什么这么做,最后再说说要看些结果和内容。
评论