📄 hanshubijin.m
字号:
%用神经网络进行函数逼近
%所要逼近的函数y = x^2
clear
clc
NNTWARN OFF
x = [1 2 3 4 5 6 7 8 9 10 11 12]';
y = [1 4 9 16 25 36 49 64 81 100 121 144]';
P = x;
T = y; %样本准备完毕,输入P,目标输出T
S1 = 5; %隐含层神经元数目
[R, Q] = size(P);
[S2, Q] = size(T);
[W1, B1] = rands(S1, R);
[W2, B2] = rands(S2, S1); %初始化权值
ErrGoal = 0.01; %期望误差
MaxEpoch = 100; %最大循环数
lr = 0.1; %学习速度
for epoch = 1:MaxEpoch
A1 = logsig(W1 * P, B1);
A2 = purelin(W2 * A1, B2); %第一层采用对数S型激活函数,第二层采用线性激活函数
E = T - A2;
SSE = sumsqr(E); %误差
if SSE < ErrGoal
epoch = epoch - 1;
break;
end
D2 = deltalin(A2, E);
D1 = deltalog(A1, D2, W2);
[dW1, dB1] = learnbp(P, D1, lr);
[dW2, dB2] = learnbp(A1, D2, lr);
W1 = W1 + dW1;
B1 = B1 + dB1;
W2 = W2 + dW2;
B2 = B2 + dB2;
%SSE = sumsqr(T - purelin(W2 * logsig((W1 * P), B1), B2));
end
%训练完毕,或达到最大循环次数退出
%验证网络的效果
x1 = [1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5]';
P = x1;
Ay = purelin(W2 * logsig((W1 * P), B1), B2);
plot(x, y, P, Ay, 'r');
xlabel('红色曲线是通过BP计算所得');
fprintf('未归一化时所用的循环次数为:%i\n',epoch);
x = [1 2 3 4 5 6 7 8 9 10 11 12]';
y = [1 4 9 16 25 36 49 64 81 100 121 144]';
%进行归一化处理
x(:,1)=(x(:,1)-min(x(:,1)))/(max(x(:,1))-min(x(:,1)));
y(:,1)=(y(:,1)-min(y(:,1)))/(max(y(:,1))-min(y(:,1)));
P = x;
T = y; %样本准备完毕,输入P,目标输出T
S1 = 5; %隐含层神经元数目
[R, Q] = size(P);
[S2, Q] = size(T);
[W1, B1] = rands(S1, R);
[W2, B2] = rands(S2, S1); %初始化权值
ErrGoal = 0.001; %期望误差
MaxEpoch = 100; %最大循环数
lr = 0.1; %学习速度
for epoch = 1:MaxEpoch
A1 = logsig(W1 * P, B1);
A2 = purelin(W2 * A1, B2); %第一层采用对数S型激活函数,第二层采用线性激活函数
E = T - A2;
SSE = sumsqr(E); %误差
if SSE < ErrGoal
epoch = epoch - 1;
break;
end
D2 = deltalin(A2, E);
D1 = deltalog(A1, D2, W2);
[dW1, dB1] = learnbp(P, D1, lr);
[dW2, dB2] = learnbp(A1, D2, lr);
W1 = W1 + dW1;
B1 = B1 + dB1;
W2 = W2 + dW2;
B2 = B2 + dB2;
%SSE = sumsqr(T - purelin(W2 * logsig((W1 * P), B1), B2));
end
%训练完毕,或达到最大循环次数退出
%验证网络的效果
x1 = [1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5]';
x1(:,1)=(x1(:,1)-min(x1(:,1)))/(max(x1(:,1))-min(x1(:,1)));
P = x1;
Ay = purelin(W2 * logsig((W1 * P), B1), B2);
figure
x(:,1) = min(x(:,1)) + x(:,1) * (max(x(:,1))-min(x(:,1)));
y(:,1) = min(y(:,1)) + y(:,1) * (max(y(:,1))-min(y(:,1)));
x1(:,1) = min(x1(:,1)) + x1(:,1) * (max(x1(:,1))-min(x1(:,1)));
Ay(:,1) = min(Ay(:,1)) + Ay(:,1) * (max(Ay(:,1))-min(Ay(:,1)));
P = x1;
plot(x, y, P, Ay, 'r');
xlabel('红色曲线是通过BP计算所得');
fprintf('归一化后所用的循环次数为:%i\n',epoch);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -