вёнмей 2020-10-18 16:01 采纳率: 0%
浏览 352

matlab实现Bp神经网络拟合函数100*(x2-x1^2)^2+(1-x1)^2=f误差太大

clc,clear
Data = -5:1:5;
Value = zeros(11,11);
for i = 1:11
for j = 1:11
x1 = Data(i);
x2 = Data(j);
Value(i,j) = 100*(x2-x1^2)^2+(1-x1)^2;
end
end
W1 = rand(20,1);%输入层x1与隐含层之间的权重
W12 = rand(20,1);%输入层x2与隐含层之间的权重
B1 = rand(20,1);%隐含层神经元的阈值
W2 = rand(1,20);%隐含层与输出层之间的权重
B2 = rand();%输出层神经元的阈值
yita = 0.0005;
loop = 5000;
E = zeros(1,loop);%误差随迭代次数的变化
for loopi = 1:loop
tempsume = 0;
Y = zeros(11,11);%模型输出的结果
for i = 1:11
for k = 1:11
x1= Data(i);%输入层输入数据
x2= Data(k);
hidein = x1*W1+x2*W12-B1;%隐含层的输入数据
hideout = zeros(20,1);%隐含层的输出数据
for j = 1:20
hideout(j) = sigmod(hidein(j));
end
y = W2*hideout-B2;%输出
Y(i,k) = y;
e = y-Value(i,k);%误差
%反馈,修改参数
dB2 = -1*yita*e;
dW2 = e*yita*hideout';
dB1 = zeros(20,1);
for j = 1:20
dB1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*(-1)*e*yita;
end
dW1 = zeros(20,1);
dW12 =zeros(20,1);
for j = 1:20
dW1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*x1*e*yita;
dW12(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*x2*e*yita;
end
W1 = W1-dW1;
W12 = W12-dW12;
B1 = B1-dB1;
W2 = W2-dW2;
B2 = B2-dB2;
tempsume = tempsume + abs(e);
end
end
E(loopi) = tempsume;
end

figure(1)
plot(E,'-r')
hold on
grid on
Data1=-5:0.5:5;
Value1 = zeros(21,21);
for i = 1:21
for j = 1:21
x1 = Data1(i);
x2 = Data1(j);
Value1(i,j) = 100*(x2-x1^2)^2+(1-x1)^2;
end
end
Y1 = zeros(21,21);
for i = 1:21
for k = 1:21
x1= Data1(i);%输入层输入数据
x2= Data1(k);
hidein = x1*W1+x2*W12-B1;%隐含层的输入数据
hideout = zeros(20,1);%隐含层的输出数据
for j = 1:20
hideout(j) = sigmod(hidein(j));
end
y = W2*hideout-B2;%输出
Y1(i,k) = y;
e(i,k) = y-Value1(i,k);%误差
end
end
figure(2)
plot(e,'-g')
hold on
grid on

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 02:50
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要解决这个问题,首先我们需要了解BP神经网络的基本原理和如何调整权重和偏置以最小化误差。然后,我们可以使用MATLAB的fitnlnet库来训练一个简单的BP神经网络。

    以下是一个简化的示例,展示了如何使用MATLAB的fitnlnet库来训练一个BP神经网络,并对数据进行拟合:

    % 数据准备
    data = [-5:0.5:5]; % 输入数据范围
    values = zeros(size(data)); % 初始化结果矩阵
    for i = 1:length(data)
        values(i,:) = 100*(data(i).^2)-data(i).^(2)+1;
    end
    
    % 建立神经网络
    layers = [1 10 1];
    options = fitnlnetOptions('HuberLoss', 'MaxIter', 1000);
    model = fitnlnet(values, data(:,1), layers, options);
    
    % 拟合函数
    function f(x)
        hidden = model.layers(1).inputs(1) * x(1) + model.layers(1).inputs(2) * x(2) - model.layers(1).bias;
        output = model.layers(end).weights(1) * hidden + model.layers(end).bias;
        return output;
    end
    
    % 评估拟合效果
    x = linspace(min(data(:,1)), max(data(:,1)), 100);
    y = x.^2;
    fitted = f(x);
    plot(x, y, 'o');
    hold on;
    plot(x, fitted, '-r');
    legend('真实数据','拟合曲线');
    

    这个例子中,我们首先定义了输入数据和目标值。然后,我们创建了一个包含两个隐藏层的神经网络,其中第一个隐藏层有10个节点,第二个隐藏层有1个节点。在这个例子中,我们使用了“HuberLoss”损失函数,因为它在大多数情况下表现得更好,特别是在具有尖峰的数据集上。

    接下来,我们使用fitnlnet函数来训练神经网络。fitnlnet函数接受输入数据、目标值、层数以及一些选项参数,例如最大迭代次数等。

    最后,我们定义了一个函数f,它接收一个新的输入x并返回相应的输出。这将用于评估我们的神经网络是否能够正确地拟合给定的目标值。

    注意:这个例子是基于简单线性回归的例子,实际应用时可能需要根据具体问题调整神经网络结构和参数。

    评论

报告相同问题?

悬赏问题

  • ¥15 暴雪战网api相关问题
  • ¥15 而使用UE5引擎的 工具选项里 打开c++ visual studio 就会有部分显示加载失败 如图 加载失败的这张图 请问是什么原因
  • ¥15 mysql 对多个字段模糊查询,返回第一个匹配的字段
  • ¥15 the testing results of the whole dataset is empty
  • ¥15 can问题,往哥解决
  • ¥15 FFmpeg 成功推流到 Nginx RTMP 服务器但无法用 ffplay 或 VLC 播放
  • ¥15 请修改以下C语言代码使其能正确输出最短路径
  • ¥20 抖音商城拉码器安卓报错求解决办法或者有新的拉码脚本也可以介绍一下
  • ¥15 MPLAB IDE V2.35 报错make[2]: *** [build/default/production/_ext/1472/MSSP_I2C.p1] Error 1
  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。