本文介绍了运用计量统计软件Matlab(2017a MAC) 建立BP神经网络模型的方法。主要运用的方程是feedforwardnet

整理数据

本例中的数据来自于Matalab提供的内置数据,可以通过代码

load bodyfat_dataset

获得,为方便其他软件读取,已经将数据复制粘贴到Excel中

本例中,1至13列为输入变量,第14列为输出变量,即输入层包含13个神经元,输出层又一个神经元。另外设定一个隐含层,包括20个神经元

每个神经元包含252个数据点,其中最后一个点不参与训练,留作测试最终的模型,即利用前251个数据点训练模型,利用最后一个点检验模型

在Matlab中输入数据

1、点击打开 Matlab ,确保保存的Excel文件和软件路径一致

3层bp神经网络 matlab bp神经网络模型matlab_神经网络模型

2、在 Editor 界面中编辑代码,其中 clc 清除 Command Window, clear 清除 Workspace

2、在 Editor 界面中编辑代码,其中 clc 清除 Command Window, clear 清除 Workspace

clcclear

Note 1:

选中代码,点击鼠标右键,选择 Evaluate Selection 执行选中代码

3层bp神经网络 matlab bp神经网络模型matlab_3层bp神经网络 matlab_02

3、利用 xlsread 函数读取数据,其中第一格单引号内是文件名称,第二格是工作表位置,第三格单引号内是数据范围

clccleardata=xlsread('bodyfat_dataset',1,' A1:N252'

执行代码后,新的变量出现在 Workspace 页面中,其中,矩阵列表示各变量,行表示各数据

3层bp神经网络 matlab bp神经网络模型matlab_数据_03

进行BP神经网络建模

数据录入完成后,继续在Editor界面进行操作

1、首先利用feedforwardnet函数建立模型,20表示隐含层包含20个神经元,输入层至隐含层的传递函数为Hyperbolic tangent函数,隐含层至输出层的传递函数为Sigmoid函数

clccleardata = xlsread('bodyfat_dataset',1,' A1:N252');net = feedforwardnet(20);net.layers{1}.transferFcn = 'tansig';net.layers{2}.transferFcn = 'logsig';

2、对原始数据进行拆分,前251个数据用来训练,最后一个用来测试

clccleardata = xlsread('bodyfat_dataset',1,' A1:N252');net = feedforwardnet(20);net.layers{1}.transferFcn = 'tansig';net.layers{2}.transferFcn = 'logsig';input = data(1:251,1:13);inputend = data(end,1:13);target = data(1:251,14);targetend = data(end,end);

3、利用train对模型进行训练,遵循反向修改权重的原则

clccleardata = xlsread('bodyfat_dataset',1,' A1:N252');net = feedforwardnet(20);net.layers{1}.transferFcn = 'tansig';net.layers{2}.transferFcn = 'logsig';input = data(1:251,1:13);inputend = data(end,1:13);target = data(1:251,14);targetend = data(end,end);net = train(net,input',target');

在跳出的训练图中,可以看出该模型输入层个神经元,隐含层20个,输出层1个。模型训练17次就达到预期要求

3层bp神经网络 matlab bp神经网络模型matlab_权重_04

4、最后,利用留置的数据进行测试,输出值与目标值的偏差

clccleardata = xlsread('bodyfat_dataset',1,' A1:N252');net = feedforwardnet(20);net.layers{1}.transferFcn = 'tansig';net.layers{2}.transferFcn = 'logsig';input = data(1:251,1:13);inputend = data(end,1:13);target = data(1:251,14);targetend = data(end,end);net = train(net,input',target');net(inputend')-targetend

Note 1 :

重复运行代码,可以发现每次的结果并不相同,这是因为,初始权重是随机设定的

Note 2 :

由于初始权重是随机设定的,所以每次运行的结果可能有所不同,这也体现出神经网络模型的局限性,模型训练找出的误差最小权重可能只是局部上使误差最小的权重,这样的权重可能有很多个,所以结果有很多种。解决这种问题的一个方法是,留一部分数据不参加训练,而是用来测试模型的输出结果,当输出与目标值较为接近时,再利用模型进行预测

5、在代码前添加rng(0),则限定了初始权重,重复运行代码,将得到相同的结果

clcclear1rng(0)data = xlsread('bodyfat_dataset',1,' A1:N252');net = feedforwardnet(20);net.layers{1}.transferFcn = 'tansig';net.layers{2}.transferFcn = 'logsig';input = data(1:251,1:13);inputend = data(end,1:13);target = data(1:251,14);targetend = data(end,end);net = train(net,input',target');net(inputend')-targetend