明天不会很远/但依旧在演 2024-04-03 10:46 采纳率: 33.3%
浏览 16
已结题

基于Matalb的BP算法和改进的BP算法求解广义逆矩阵

这个代码的本意是对比BP算法和改进的BP算法对求解广义逆矩阵的误差对比图,但是代码求出来的没有误差,得到的误差不全为零,突出不了改进的BP算法的优越性,想修改一下算法突出其优越性,目标误差需要这么大但是gradient(梯度不兼容),怎么修改比较好,急!希望能得到建议!(要是能重新帮写也行,内容是BP算法和改进的BP算法求解广义逆矩阵,然后绘制误差比较图,另外报酬)
BP算法及改进的BP算法求解广义逆矩阵:

% 示例矩阵 A
A = [0, 6, 2, 2;5, 3 , 1 ,0];
% 目标误差
target_error = 1e-16;

% BP算法求解广义逆矩阵
function G = BP_algorithm(A, target_error)
    % 初始化G矩阵
    G = pinv(A);
    error = norm(A * G * A - A, 'fro');
    while error > target_error
        % 计算梯度
        gradient = -2 * (A' * (A * G - A));
        % 更新G矩阵
        G = G + 0.1 * gradient; % 这里的学习率可以根据需要调整
        error = norm(A * G * A - A, 'fro');
    end
end

% 改进的BP算法求解广义逆矩阵
function G = improved_BP_algorithm(A, target_error)
    % 初始化G矩阵
    G = pinv(A);
    error = norm(A * G * A - A, 'fro');
    while error > target_error
        % 计算梯度
        gradient = -2 * (A' * (A * G - A) * A);
        % 更新G矩阵
        G = G + 0.1 * gradient; % 这里的学习率可以根据需要调整
        error = norm(A * G * A - A, 'fro');
    end
end

% 调用BP算法求解
G_BP = BP_algorithm(A, target_error);

% 调用改进的BP算法求解
G_improved_BP = improved_BP_algorithm(A, target_error);

% 计算误差
error_BP = norm(A * G_BP * A - A, 'fro');
error_improved_BP = norm(A * G_improved_BP * A - A, 'fro');

% 打印误差
fprintf('BP算法求解的误差: %f\n', error_BP);
fprintf('改进的BP算法求解的误差: %f\n', error_improved_BP);

% 绘制误差对比图
figure;
plot([1, 2], [error_BP, error_improved_BP], '-o', 'LineWidth', 2); % 使用'-'线型和'o'标记点
xticks([1, 2]);
xticklabels({'BP算法', '改进的BP算法'});
ylabel('误差');
title('BP算法与改进的BP算法求解广义逆矩阵的误差对比');
grid on; % 添加网格线以增强可视化效果

img

img

img

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-03 10:46
    关注

    以下引自强大而免费的微信小程序:皆我百晓生

    从您提供的代码和报错信息来看,主要问题在于绘制误差对比图时使用了错误的绘图函数。您试图使用bar函数绘制曲线图,但bar函数通常用于绘制条形图,而不是曲线图。对于您的需求,应该使用plot函数来绘制曲线图。另外,报错信息指出输入参数类型不正确,这是因为bar函数期待接收数值数据作为输入,而非字符串和数值的混合。

    下面是修改后的代码,使用plot函数绘制误差对比曲线图:

    % 示例矩阵 A
    A = [4, 1, 0; 3, 0, 3];
    
    % 目标误差
    target_error = 1e-6;
    
    % 调用BP算法求解
    G_BP = BP_algorithm(A, target_error);
    
    % 调用改进的BP算法求解
    G_improved_BP = improved_BP_algorithm(A, target_error);
    
    % 计算误差
    error_BP = norm(A * G_BP * A - A, 'fro');
    error_improved_BP = norm(A * G_improved_BP * A - A, 'fro');
    
    % 打印误差
    fprintf('BP算法求解的误差: %f\n', error_BP);
    fprintf('改进的BP算法求解的误差: %f\n', error_improved_BP);
    
    % 绘制误差对比图
    figure;
    plot([1, 2], [error_BP, error_improved_BP], '-o', 'LineWidth', 2); % 使用'-'线型和'o'标记点
    xticks([1, 2]);
    xticklabels({'BP算法', '改进的BP算法'});
    ylabel('误差');
    title('BP算法与改进的BP算法求解广义逆矩阵的误差对比');
    grid on; % 添加网格线以增强可视化效果
    

    这段代码首先计算了两个算法的误差,并打印结果。接着,创建一个新的图形窗口并使用plot函数绘制误差对比曲线图。这里使用了线型'-'表示连续曲线,并添加了标记点'o'。通过xticksxticklabels函数设置X轴标签为算法名称。最后,添加了网格线以提高图表的可读性。

    现在,这段代码应该能成功绘制出BP算法与改进的BP算法求解广义逆矩阵的误差对比曲线图。如果您还有其他问题或需要进一步的指导,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月11日
  • 已采纳回答 4月10日
  • 修改了问题 4月9日
  • 修改了问题 4月9日
  • 展开全部

悬赏问题

  • ¥15 网络分析仪面板参数解释
  • ¥15 车载image sensor的 datasheet
  • ¥15 kotlin multiplaform 的共享模块支持蓝牙吗还是说安卓和ios的蓝牙都要自己配
  • ¥15 为什么我的查询总是显示无数据,该怎么修改呢(语言-java)
  • ¥15 IDDPM采样结果异常
  • ¥100 求一个,王者荣耀查询隐藏战绩的教材,爬虫代码
  • ¥60 Cocos creator缓动问题
  • ¥15 专业问题提问,7月5号2点之前
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量