⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanshubijin.m

📁 用bp神经网络的进行函数逼近
💻 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 + -