好玩的MATLAB 发表于 2023-12-21 22:21:00

【算法对比图】回归、时序预测的多算法对比图


点击上方蓝字关注我们

   注明:此推文来自公众号Lvy的口袋,欢迎大家关注Lvy小姐姐公众号~多种算法对比图是常用的科研绘图,你知道几种合适的绘图样式呢?




1.真实值和预测值展示图


Tips:数据比较多、算法多的适合比较难看出实际的效果
数据就是各个算法预测值和真实值数据(工具箱直接导出)
[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]data_pre_all=[]; %记录预测数据load(' 多元线性回归17_Dec_11_34_33 train_result_train_vaild_test.mat')data1=data_Oriny_prey.y_test_predict;data_pre_all=;data_true=data_Oriny_prey.test_y;load('SSA麻雀搜索算法 随机森林回归17_Dec_11_35_55 train_result_train_vaild_test.mat')data2=data_Oriny_prey.y_test_predict;data_pre_all=;load(' SVM-RF回归17_Dec_11_37_18 train_result_train_vaild_test.mat')data3=data_Oriny_prey.y_test_predict;data_pre_all=;load(' MLP回归17_Dec_11_38_31 train_result_train_vaild_test.mat')data4=data_Oriny_prey.y_test_predict;data_pre_all=;load(' LSTM回归17_Dec_11_40_29 train_result_train_vaild_test.mat')data5=data_Oriny_prey.y_test_predict;data_pre_all=;str={'真实值','多元线性回归','SSA麻雀搜索算法 随机森林回归','SVM-RF回归' ,'MLP回归','LSTM回归'};figure('Units', 'pixels', ...    'Position', );plot(data_true,'--*') hold onfor i=1:size(data_pre_all,2)    plot(data_pre_all(:,i))    hold on endlegend(str)set (gca,"FontSize",12,'LineWidth',1.2)box offlegend Box off



2.误差柱状对比图

Tips:建议选取量纲差别不大的误差衡量指标,不然可能会有点丑
[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]Test_all=[];for j=1:size(data_pre_all,2)    y_test_predict=data_pre_all(:,j);    test_y=data_true;    test_MAE=sum(abs(y_test_predict-test_y))/length(test_y) ;         test_MAPE=sum(abs((y_test_predict-test_y)./test_y))/length(test_y);      test_MSE=(sum(((y_test_predict-test_y)).^2)/length(test_y));   test_RMSE=sqrt(sum(((y_test_predict-test_y)).^2)/length(test_y));      test_R2= 1 - (norm(test_y - y_test_predict)^2 / norm(test_y - mean(test_y))^2);       Test_all=;end%%str={'真实值','多元线性回归','SSA麻雀搜索算法 随机森林回归','SVM-RF回归' ,'MLP回归','LSTM回归'};str1=str(2:end);str2={'MAE','MAPE','MSE','RMSE','R2'};data_out=array2table(Test_all);data_out.Properties.VariableNames=str2;data_out.Properties.RowNames=str1;disp(data_out)%% 柱状图 MAE MAPE RMSE 柱状图适合量纲差别不大的color=    ;figure('Units', 'pixels', ...    'Position', );plot_data_t=Test_all(:,)';b=bar(plot_data_t,0.8);hold on
for i = 1 : size(plot_data_t,2)    x_data(:, i) = b(i).XEndPoints'; end
for i =1:size(plot_data_t,2)b(i).FaceColor = color(i,:);b(i).EdgeColor=;b(i).LineWidth=1.2;end
for i = 1 : size(plot_data_t,1)-1    xilnk=(x_data(i, end)+ x_data(i+1, 1))/2;    b1=xline(xilnk,'--','LineWidth',1.2);    hold onend
ax=gca;legend(b,str1,'Location','best')ax.XTickLabels ={'MAE', 'MAPE', 'RMSE'};set(gca,"FontSize",12,"LineWidth",2)box offlegend box off




3.误差散点对比图

Tips:可以任意选择两个误差衡量维度
[*][*][*][*][*][*][*][*][*][*][*][*][*][*]figureplot_data_t1=Test_all(:,)';MarkerType={'s','o','pentagram','^','v'};for i = 1 : size(plot_data_t1,2)   scatter(plot_data_t1(1,i),plot_data_t1(2,i),120,MarkerType{i},"filled")   hold onendset(gca,"FontSize",12,"LineWidth",2)box offlegend box offlegend(str1,'Location','best')xlabel('MAE')ylabel('R2')grid on



4.误差密度散点图


[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]figure('Units', 'pixels', ...    'Position', );for i=1:5    subplot(2,3,i)   n=50;   X=double(data_true);   Y=double(data_pre_all(:,i));   M=polyfit(X,Y,1);   Y1=polyval(M,X);    XList=linspace(min(X),max(X),n);    YList=linspace(min(Y),max(Y),n);    =meshgrid(XList,YList);    F=ksdensity(,);    ZMesh=reshape(F,size(XMesh));    H=interp2(double(XMesh),double(YMesh),double(ZMesh),X,Y);    scatter(data_true,data_pre_all(:,i),35,'filled','CData',H,'MarkerFaceAlpha',.5);    hold on    plot(X(1:10:end),Y1(1:10:end),'--','LineWidth',1.2)    hold on    str_label=;    title(str_label)    set(gca,"FontSize",10,"LineWidth",1.5)    xlabel('true')    ylabel('predict')end




5.误差雷达图

Tips:为了让图片更美观将多个维度评价指标进行归一化处理了
[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]figure('Units', 'pixels', ...    'Position', );Test_all1=Test_all./sum(Test_all);%把各个指标归一化到一个量纲Test_all1(:,end)=1-Test_all(:,end);RC=radarChart(Test_all1);str3={'A-MAE','A-MAPE','A-MSE','A-RMSE','1-R2'};RC.PropName=str3;RC.ClassName=str1;RC=RC.draw(); RC.legend();colorList=./255;for n=1:RC.ClassNum    RC.setPatchN(n,'Color',colorList(n,:),'MarkerFaceColor',colorList(n,:))end
本图参考了公众号:slandarer随笔
https://mp.weixin.qq.com/s/8Lu7yBs3cLlZk9bPStdgUA

调用函数
[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]classdef radarChart% @Author : slandarer% 公众号: slandarer随笔% 知乎    : hikari
    properties      ax;arginList={'ClassName','PropName','Type'}      XData;RTick=[];RLim=[];SepList=      Type='Line';      PropNum;ClassNum      ClassName={};      PropName={};
      BC=./255;
      % 句柄      ThetaTickHdl;RTickHdl;RLabelHdl;LgdHdl;PatchHdl;PropLabelHdl;BkgHdl    end
    methods      function obj=radarChart(varargin)            if isa(varargin{1},'matlab.graphics.axis.Axes')                obj.ax=varargin{1};varargin(1)=[];            else                obj.ax=gca;            end            % 获取版本信息            tver=version('-release');            verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;            if verMatlab                hold on            else                hold(obj.ax,'on')            end
            obj.XData=varargin{1};varargin(1)=[];            obj.PropNum=size(obj.XData,2);            obj.ClassNum=size(obj.XData,1);            obj.RLim=,)];
            % 获取其他信息            for i=1:2:(length(varargin)-1)                tid=ismember(obj.arginList,varargin{i});                if any(tid)                obj.(obj.arginList{tid})=varargin{i+1};                end            end            if isempty(obj.ClassName)                for i=1:obj.ClassNum                  obj.ClassName{i}=['class ',num2str(i)];                end            end            if isempty(obj.PropName)                for i=1:obj.PropNum                  obj.PropName{i}=['prop ',num2str(i)];                end            end            help radarChart      end
      function obj=draw(obj)            obj.ax.XLim=[-1,1];            obj.ax.YLim=[-1,1];            obj.ax.XTick=[];            obj.ax.YTick=[];            obj.ax.XColor='none';            obj.ax.YColor='none';            obj.ax.PlotBoxAspectRatio=;            % 绘制背景圆形            tt=linspace(0,2*pi,200);            obj.BkgHdl=fill(cos(tt),sin(tt),./255,'EdgeColor',./255,'LineWidth',1);            % 绘制Theta刻度线            tn=linspace(0,2*pi,obj.PropNum+1);tn=tn(1:end-1);            XTheta=);nan()];            YTheta=);nan()];            obj.ThetaTickHdl=plot(XTheta(:),YTheta(:),'Color',./255,'LineWidth',1);            % 绘制R刻度线            if isempty(obj.RTick)                dr=diff(obj.RLim);                sepR=dr./3;                multiE=ceil(log(sepR)/log(10));                sepR=sepR.*10^(1-multiE);                sepR=obj.SepList(find(sepR
                sepNum=floor(dr./sepR);                obj.RTick=obj.RLim(1)+(0:sepNum).*sepR;                if obj.RTick(end)~=obj.RLim(2)                  obj.RTick=;                end            end            obj.RLim(obj.RLim            obj.RLim(obj.RLim>obj.RLim(2))=[];
            XR=cos(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);XR=)];            YR=sin(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);YR=)];            obj.RTickHdl=plot(XR(:),YR(:),'Color',./255,'LineWidth',1.1,'LineStyle','--');
            % 绘制雷达图            for i=1:size(obj.XData,1)                XP=cos(tn).*(obj.XData(i,:)-obj.RLim(1))./diff(obj.RLim);                YP=sin(tn).*(obj.XData(i,:)-obj.RLim(1))./diff(obj.RLim);                switch obj.Type                  case 'Line'                        obj.PatchHdl(i)=plot(,,...                            'Color',obj.BC(mod(i-1,size(obj.BC,1))+1,:),'Marker','o',...                            'LineWidth',1.8,'MarkerFaceColor',obj.BC(mod(i-1,size(obj.BC,1))+1,:));                  case 'Patch'                        obj.PatchHdl(i)=patch(XP,YP,obj.BC(mod(i-1,size(obj.BC,1))+1,:),...                            'EdgeColor',obj.BC(mod(i-1,size(obj.BC,1))+1,:),'FaceAlpha',.2,...                            'LineWidth',1.8);
                end            end
            % 绘制R标签文本            tnr=(tn(1)+tn(2))/2;            for i=1:length(obj.RTick)                obj.RLabelHdl(i)=text(cos(tnr).*(obj.RTick(i)-obj.RLim(1))./diff(obj.RLim),...                                    sin(tnr).*(obj.RTick(i)-obj.RLim(1))./diff(obj.RLim),...                                    sprintf('%.2f',obj.RTick(i)),'FontName','Arial','FontSize',11);            end
            % 绘制属性标签            for i=1:obj.PropNum                obj.PropLabelHdl(i)=text(cos(tn(i)).*1.1,sin(tn(i)).*1.1,obj.PropName{i},...                  'FontSize',12,'HorizontalAlignment','center');            end
      end% =========================================================================      function obj=setBkg(obj,varargin)            set(obj.BkgHdl,varargin{:})      end
      % 绘制图例      function obj=legend(obj)            obj.LgdHdl=legend(,obj.ClassName,'FontSize',12,'Location','best');      end      % 设置图例属性      function obj=setLegend(obj,varargin)            set(obj.LgdHdl,varargin{:})      end
      % 设置标签      function obj=setPropLabel(obj,varargin)            for i=1:obj.PropNum                set(obj.PropLabelHdl(i),varargin{:})            end      end      function obj=setRLabel(obj,varargin)            for i=1:length(obj.RLabelHdl)                set(obj.RLabelHdl(i),varargin{:})            end      end
      % 设置轴      function obj=setRTick(obj,varargin)            set(obj.RTickHdl,varargin{:})      end      function obj=setThetaTick(obj,varargin)            set(obj.ThetaTickHdl,varargin{:})      end
      % 设置patch属性      function obj=setPatchN(obj,N,varargin)            set(obj.PatchHdl(N),varargin{:})      end    end% @author : slandarer% 公众号: slandarer随笔% 知乎    : hikariend




6.误差罗盘图

[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]figure('Units', 'pixels', ...    'Position', );t = tiledlayout('flow','TileSpacing','compact');for i=1:length(Test_all(:,1))nexttileth1 = linspace(2*pi/length(Test_all(:,1))/2,2*pi-2*pi/length(Test_all(:,1))/2,length(Test_all(:,1)));r1 = Test_all(:,i)'; = pol2cart(th1,r1);M=compass(u1,v1);for j=1:length(Test_all(:,1))    M(j).LineWidth = 2;    M(j).Color = colorList(j,:);
end   title(str2{i})set(gca,"FontSize",10,"LineWidth",1)end legend(M,str1,"FontSize",10,"LineWidth",1,'Box','off','Location','southoutside')
时序的和回归的算法比较也是类似的,【领取数据和代码方式】,在公众号【Lvy的口袋】(下方链接直接进行公众号)后台回复关键词【算法对比图】领取,还有什么比较合适的对比图可以私发小编看能不能复现奥~



ps.合适的绘图之后可能会更新到工具箱中,全家桶大力更新中~早上车早实惠

全家桶系列
一键打包公众号过去和未来所有的作品~持续更新中【获取方式】扫码获取或者点击链接
https://mbd.pub/o/bread/mbd-ZJabmJ9v






END




长按二维码识别关注
往期精彩回顾
推荐 | 神器系列大更新!|一键实现百种高效算法|轻松解决评价、降维、聚类、回归、分类、时序预测、多输入多输出问题推荐 | 一句命令实现神经网络超参数优化推荐 | 四种降维方法及可视化      流2群【756559035】
页: [1]
查看完整版本: 【算法对比图】回归、时序预测的多算法对比图