资源简介
基于MATLAB的BP神经网络来逼近双变量非线性函数,最后的逼近误差小于0.05
代码片段和文件信息
%使用BP神经网络来对函数:y = sin(x1)+cos(x2)进行逼近
clc; %清屏
close all; %关闭已打开的所有视图窗口
clear all; %清除工作空间中的所有变量
l = 0.1;
Input1 = -2 : l : 2;
Input2 = -2 : l : 2; %网络的训练样本
[feature1 sample1] = size(Input1); %得到网络的输入特征数以及训练网络所用的样本数
[feature2 sample2] = size(Input2);
input = feature1 + feature2; %输入层的节点数(即输入的特征个数)
sample = sample1 * sample2; %训练样本数
middle = 19; %隐含层的节点数=19,这一层的激励函数选用Sigmoid函数
output = 1; %输出层的节点数=1,这一层的激励函数选用线性函数
%初始化隐含层及输出层对应的权重和阈值矩阵
weight2 = rand(output middle) - 2 * rand(output middle); %初始化输出层对应的权重矩阵
weight1 = rand(middle input) - 2 * rand(middle input); %初始化隐含层对应的权重矩阵
thre2 = rand(output 1) - 2 * rand(output 1); %初始化输出层对应的阈值矩阵
thre1 = rand(middle 1) - 2 * rand(middle 1); %初始化隐含层对应的阈值矩阵
RunCnt = 0; %运行次数
e1 = 0; %逼近误差
MaxError = 0.05; %网络可容忍的逼近误差的最大值
assistS1 = zeros(middle middle); %存储变量以辅助计算s1
assistS2 = zeros(output output); %存储变量以辅助计算s2
alpha = 0.1; %网络的学习率
%程序的主循环
while(RunCnt < 10000 && e1 < MaxError)
e1 = 0; %每一次样本循环开始时,将样本的逼近误差置为零
for i = 1 : sample1 %根据每一个训练样本对网络进行更新
for j = 1 : sample2
netMiddle = weight1 * [Input1(: i) ; Input2(: j)] + thre1; %计算隐含层的输出
netMiddle = 1 ./ (1 + exp(-netMiddle)); %经过激励函数之后的隐含层的输出,隐含层的激励函数为logistic函数
netOutput = weight2 * netMiddle + thre2; %计算网络前向传播中输出层的值
assistS1 = diag((1 - netMiddle) .* netMiddle);
assistS2
评论
共有 条评论