BP神经网络的简单实现
一、简介
BP(Back Propagation)神经网络是一种多层前馈神经网络,广泛应用于模式识别、分类和预测等问题,BP神经网络通过梯度下降法不断调整网络权值,以最小化输出误差,本文将介绍如何在MATLAB中实现一个简单的BP神经网络,并通过具体实例进行说明。
二、数据准备
我们使用以下简单的数据集进行训练和测试:
x1 = [-3, -2.7, -2.4, -2.1, -1.8, -1.5, -1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; x2 = [-2, -1.8, -1.6, -1.4, -1.2, -1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2]; y = [0.6589, 0.2206, -0.1635, -0.4712, -0.6858, -0.7975, -0.8040, -0.7113, -0.5326, -0.2875, 0, 0.3035, 0.5966, 0.8553, 1.0600, 1.1975, 1.2618];
三、网络结构设置
1. 节点个数设置
输入层:2个节点(对应x1和x2)
隐层:3个节点
输出层:1个节点(对应y)
2. 传递函数设置
隐层:tansig函数
输出层:purelin函数
3. 训练方式
trainlm
四、代码实现
下面是使用MATLAB实现BP神经网络的代码示例:
% 数据准备 x1 = [-3, -2.7, -2.4, -2.1, -1.8, -1.5, -1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; x2 = [-2, -1.8, -1.6, -1.4, -1.2, -1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2]; y = [0.6589, 0.2206, -0.1635, -0.4712, -0.6858, -0.7975, -0.8040, ... -0.7113, -0.5326, -0.2875, 0, 0.3035, 0.5966, 0.8553, 1.0600, 1.1975, 1.2618]; inputData = [x1'; x2']; % 输入数据 outputData = y; % 输出数据 % 设置随机种子,保证每次训练结果一致 setdemorandstream(88888); % 创建BP神经网络 net = newff(inputData, outputData, 3, {'tansig', 'purelin'}, 'trainlm'); % 设置训练参数 net.trainParam.goal = 0.0001; % 训练目标:均方误差低于0.0001 net.trainParam.show = 400; % 每400次迭代显示一次结果 net.trainParam.epochs = 15000; % 最大训练次数:15000 net.trainParam.lr = 0.01; % 学习率 % 训练网络 [net, tr] = train(net, inputData, outputData); % 仿真网络,得到预测结果 simout = sim(net, inputData); % 绘图对比原始数据和预测结果 figure; t = 1:length(simout); plot(t, y, 'b', t, simout, 'r'); legend('Original Data', 'Predicted Data'); title('BP Neural Network Prediction');
五、代码详细解说
1. 数据准备
x1 = [-3, -2.7, -2.4, -2.1, -1.8, -1.5, -1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; x2 = [-2, -1.8, -1.6, -1.4, -1.2, -1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2]; y = [0.6589, 0.2206, -0.1635, -0.4712, -0.6858, -0.7975, -0.8040, ... -0.7113, -0.5326, -0.2875, 0, 0.3035, 0.5966, 0.8553, 1.0600, 1.1975, 1.2618]; inputData = [x1'; x2']; % 将x1和x2作为输入数据 outputData = y; % 将y作为输出数据 setdemorandstream(88888); % 指定随机种子,这样每次训练出来的网络都一样。
这段代码定义了输入数据x1
和x2
,以及对应的输出数据y
,然后将输入数据组合成矩阵inputData
,输出数据存储在outputData
中,最后指定随机种子以保证每次运行结果一致。
2. 创建BP神经网络
net = newff(inputData, outputData, 3, {'tansig', 'purelin'}, 'trainlm');
这行代码使用newff
函数创建一个前馈神经网络,该网络有三层:输入层、隐层和输出层,隐层包含3个节点,传递函数分别为tansig
和purelin
,训练函数为trainlm
。
3. 设置训练参数
net.trainParam.goal = 0.0001; % 训练目标:均方误差低于0.0001 net.trainParam.show = 400; % 每400次迭代显示一次结果 net.trainParam.epochs = 15000; % 最大训练次数:15000 net.trainParam.lr = 0.01; % 学习率
这些代码设置了训练参数,包括训练目标、显示频率、最大训练次数和学习率。
4. 训练网络
[net, tr] = train(net, inputData, outputData);
这行代码调用MATLAB自带的train
函数对网络进行训练,训练过程中会根据设定的参数调整网络的权重和偏置,以达到预定的训练目标。
5. 仿真网络,得到预测结果
simout = sim(net, inputData); % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
使用训练好的网络对输入数据进行仿真,得到预测结果simout
。
6. 绘图对比原始数据和预测结果
figure; % 新建画图窗口窗口 t = 1:length(simout); % t为时间向量,从1到simout的长度 plot(t, y, 'b', t, simout, 'r'); % 画图,对比原来的y和网络预测的y legend('Original Data', 'Predicted Data'); % 添加图例 title('BP Neural Network Prediction'); % 标题
这段代码绘制了原始数据y
和预测结果simout
的对比图,方便直观地观察网络的性能。
通过上述步骤,我们实现了一个简单的BP神经网络,并使用MATLAB对其进行了训练和测试,BP神经网络具有较强的非线性映射能力和容错能力,适用于各种复杂的模式识别和分类问题,BP神经网络也存在一些局限性,如容易陷入局部最优解、训练速度较慢等,为了克服这些问题,可以采用改进的训练算法(如动量法、自适应学习率法等)或引入更多的优化技术(如正则化、Dropout等)。
相关问题与解答栏目
Q1: 如何选择合适的隐层节点数?
A1: 选择合适的隐层节点数通常依赖于具体的问题和经验公式,可以从较小的节点数开始测试,逐步增加节点数,直到达到满意的性能,常用的经验公式是k = sqrt(m + n) + a
,其中m
是输入层节点数,n
是输出层节点数,a
是一个常数(通常取值在1到10之间)。
Q2: 如何避免BP神经网络陷入局部最优解?
A2: 为了避免陷入局部最优解,可以尝试以下方法:
1、使用不同的初始化方法:如Xavier初始化或He初始化。
2、引入正则化项:如L2正则化或L1正则化。
3、使用改进的训练算法:如动量法、RMSprop、Adam等。
4、调整学习率:采用自适应学习率或手动调整学习率。
5、增加数据集:确保数据集足够大且多样化,以覆盖更多的情况。
各位小伙伴们,我刚刚为大家分享了有关“bp神经网络的简单实现”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/694767.html