電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 23|回復(fù): 0
收起左側(cè)

【算法對比圖】回歸、時序預(yù)測的多算法對比圖

[復(fù)制鏈接]

229

主題

229

帖子

1277

積分

三級會員

Rank: 3Rank: 3

積分
1277
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-12-21 22:21:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
! k& a5 L2 _; K, K) W2 P) G
點擊上方藍字關(guān)注我們% ^+ e' i( t' N4 T+ J# u7 U$ i

! E# ]! e! r2 h6 ]! [   注明:此推文來自公眾號Lvy的口袋,歡迎大家關(guān)注Lvy小姐姐公眾號~    多種算法對比圖是常用的科研繪圖,你知道幾種合適的繪圖樣式呢?8 m1 L  ^4 _& n+ b6 S9 y

; \5 z% e. O7 U' W $ V3 Y' Y% L. ?1 I# @
( o; R5 Q/ ~( l5 W$ b1 k) T

7 C8 m/ |; Z, Z) l1.真實值和預(yù)測值展示圖$ S; J& ?$ J. q: \  j

7 y  R9 ?' j* T9 h. y; s
/ T0 S, b* q" q+ I/ K$ ^7 UTips:數(shù)據(jù)比較多、算法多的適合比較難看出實際的效果
/ a; o( M3 i  D! t9 W* x  Z數(shù)據(jù)就是各個算法預(yù)測值和真實值數(shù)據(jù)(工具箱直接導(dǎo)出)
; R* e6 W8 e0 I1 p0 m# K; z+ q
  • data_pre_all=[]; %記錄預(yù)測數(shù)據(jù)load(' 多元線性回歸  17_Dec_11_34_33 train_result_train_vaild_test.mat')data1=data_Oriny_prey.y_test_predict;data_pre_all=[data_pre_all,data1];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=[data_pre_all,data2];load(' SVM-RF回歸  17_Dec_11_37_18 train_result_train_vaild_test.mat')data3=data_Oriny_prey.y_test_predict;data_pre_all=[data_pre_all,data3];load(' MLP回歸  17_Dec_11_38_31 train_result_train_vaild_test.mat')data4=data_Oriny_prey.y_test_predict;data_pre_all=[data_pre_all,data4];load(' LSTM回歸  17_Dec_11_40_29 train_result_train_vaild_test.mat')data5=data_Oriny_prey.y_test_predict;data_pre_all=[data_pre_all,data5];str={'真實值','多元線性回歸','SSA麻雀搜索算法 隨機森林回歸','SVM-RF回歸' ,'MLP回歸','LSTM回歸'};figure('Units', 'pixels', ...    'Position', [300 300 860 375]);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 off7 A* \( p7 Q  K6 O9 g' \1 r/ E
    , ?  s% P  \% j- C

    % T& N2 Z7 S- ?6 r; W
    . t7 m% R  ]# \4 N. `2.誤差柱狀對比圖
    # y- Y: v" K$ ]4 S) ?2 v" f4 O  D  \ 4 ^# M/ Z- B! U4 ^" d  k4 e$ k
    Tips:建議選取量綱差別不大的誤差衡量指標,不然可能會有點丑: M/ p. N" O0 m" a- y
  • 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=[Test_all;test_MAE test_MAPE test_MSE test_RMSE test_R2];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=    [0.1569    0.4706    0.7098    0.6039    0.7882    0.8588    0.9725    0.6745    0.5490    0.8549    0.9373    0.8275       0.7451    0.7216    0.8627    0.7843    0.1412    0.1373    1.0000    0.5333    0.5176      0.5569    0.8118    0.7882       1.0000    0.5333    0.5176];figure('Units', 'pixels', ...    'Position', [300 300 660 375]);plot_data_t=Test_all(:,[1,2,4])';b=bar(plot_data_t,0.8);hold on  G6 S2 u3 c' q2 ~
    for i = 1 : size(plot_data_t,2)    x_data(:, i) = b(i).XEndPoints'; end
    ! u- r5 l4 v  rfor i =1:size(plot_data_t,2)b(i).FaceColor = color(i,:);b(i).EdgeColor=[0.6353    0.6314    0.6431];b(i).LineWidth=1.2;end
    # n* Y/ ]. J! Y. ~! ufor 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
    ! i. \/ K$ a' J& [/ z  n5 J. u% dax=gca;legend(b,str1,'Location','best')ax.XTickLabels ={'MAE', 'MAPE', 'RMSE'};set(gca,"FontSize",12,"LineWidth",2)box offlegend box off
    8 ?( o' d  ^  f
    1 {8 \/ O. y4 A& P: T2 t
    . P/ o/ f3 y) n: Y% z: h. ]7 B

    7 r$ W9 m7 t, w. F8 i2 q
    + O, L5 }; i7 R2 U' U9 h9 ?3.誤差散點對比圖6 i$ _* c& X0 N1 d# d$ ]& d
    ( s, m8 o! }9 R( E5 z; J! I# x
    Tips:可以任意選擇兩個誤差衡量維度, c" a! P* s& \
  • figureplot_data_t1=Test_all(:,[1,5])';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
    * X8 }5 {+ z1 i: B

    / h0 R$ a& p) v/ t7 |9 C( }/ G7 E2 g
    * Q6 F4 b! W# N! S- C- ?+ o
    9 U# p  M$ y; ]% f& O0 T; X6 |4.誤差密度散點圖
    $ u( b8 g! q4 D- h( \/ z' x 8 j% I1 a( Z# u9 o: E4 E+ ?
    8 c% Y9 F4 S( y) I( Y; c) z' q
  • figure('Units', 'pixels', ...    'Position', [150 150 920 500]);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);    [XMesh,YMesh]=meshgrid(XList,YList);    F=ksdensity([X,Y],[XMesh(:),YMesh(:)]);    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=[str1{1,i},' ','R2=',num2str(Test_all(i,end))];    title(str_label)    set(gca,"FontSize",10,"LineWidth",1.5)    xlabel('true')    ylabel('predict')end- ]/ \1 I2 R0 Y( T7 Q8 b8 e3 G" h* P

    . ^: ^! c/ `/ k$ j- O* F
    9 C) _4 @% G8 `0 i
    ' p3 e9 h# |9 d: ]
    3 l6 i& B7 h2 I& f! W: `5 ~4 q$ x5.誤差雷達圖
    ; s6 x  [" q* B9 E* D# h% M
    9 D3 D' @3 I" [* V+ U" Q$ qTips:為了讓圖片更美觀將多個維度評價指標進行歸一化處理了
    6 M' x2 ?+ g6 w- a& o1 E! l
  • figure('Units', 'pixels', ...    'Position', [150 150 520 500]);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=[78 101 155;          138 140 191;          184 168 207;          231 188 198;          253 207 158;          239 164 132;          182 118 108]./255;for n=1:RC.ClassNum    RC.setPatchN(n,'Color',colorList(n,:),'MarkerFaceColor',colorList(n,:))end
    2 Z2 q* Z1 G( [/ o( O本圖參考了公眾號:slandarer隨筆
    % P& B1 f( q. Z5 p, `$ Mhttps://mp.weixin.qq.com/s/8Lu7yBs3cLlZk9bPStdgUA8 n9 W% S! b  n0 e2 A! C0 t

    0 d% {" b( _9 Q8 o  ^* T7 R調(diào)用函數(shù)9 [4 c7 H# B2 K  o6 I
  • classdef radarChart% @Author : slandarer% 公眾號  : slandarer隨筆% 知乎    : hikari, X% t. _8 h6 ^5 z
        properties        ax;arginList={'ClassName','PropName','Type'}        XData;RTick=[];RLim=[];SepList=[1,1.2,1.5,2,2.5,3,4,5,6,8]        Type='Line';        PropNum;ClassNum        ClassName={};        PropName={};
    * a8 Y; S. y0 G1 y( c        BC=[198,199,201;  38, 74, 96; 209, 80, 51; 241,174, 44; 12,13,15;            102,194,165; 252,140, 98; 142,160,204; 231,138,195;             166,217, 83; 255,217, 48; 229,196,148; 179,179,179]./255;! |5 t: ]: ~) e: ~* u
            % 句柄        ThetaTickHdl;RTickHdl;RLabelHdl;LgdHdl;PatchHdl;PropLabelHdl;BkgHdl    end4 j. c$ T4 Z7 [
        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/ l9 j+ b+ X5 L( D
                obj.XData=varargin{1};varargin(1)=[];            obj.PropNum=size(obj.XData,2);            obj.ClassNum=size(obj.XData,1);            obj.RLim=[0,max(obj.XData,[],[1,2])];& H  S* t# h& S9 x8 H
                % 獲取其他信息            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
    , Z9 R  x( \& p+ E* H5 \8 ?        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=[1,1,1];            % 繪制背景圓形            tt=linspace(0,2*pi,200);            obj.BkgHdl=fill(cos(tt),sin(tt),[252,252,252]./255,'EdgeColor',[200,200,200]./255,'LineWidth',1);            % 繪制Theta刻度線            tn=linspace(0,2*pi,obj.PropNum+1);tn=tn(1:end-1);            XTheta=[cos(tn);zeros([1,obj.PropNum]);nan([1,obj.PropNum])];            YTheta=[sin(tn);zeros([1,obj.PropNum]);nan([1,obj.PropNum])];            obj.ThetaTickHdl=plot(XTheta(:),YTheta(:),'Color',[200,200,200]./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(sepR8 G" x# h  e- H
                    sepNum=floor(dr./sepR);                obj.RTick=obj.RLim(1)+(0:sepNum).*sepR;                if obj.RTick(end)~=obj.RLim(2)                    obj.RTick=[obj.RTick,obj.RLim];                end            end            obj.RLim(obj.RLim            obj.RLim(obj.RLim>obj.RLim(2))=[];
    % O/ l$ P7 ~* r( H  p5 n( M9 K4 h* t            XR=cos(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);XR=[XR;nan([1,length(obj.RTick)])];            YR=sin(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);YR=[YR;nan([1,length(obj.RTick)])];            obj.RTickHdl=plot(XR(:),YR(:),'Color',[200,200,200]./255,'LineWidth',1.1,'LineStyle','--');7 }8 H2 D* y) w4 W' Z$ b
                % 繪制雷達圖            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([XP,XP(1)],[YP,YP(1)],...                            '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);
    0 A. N4 C' E5 G6 K, Q                end            end
    9 q  ?4 A& `. u  f8 `2 B            % 繪制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);            end5 n' w' m2 k2 G: G: ?% D
                % 繪制屬性標簽            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, S& ?5 ?. P1 F) n* W) q" b
            end% =========================================================================        function obj=setBkg(obj,varargin)            set(obj.BkgHdl,varargin{:})        end
    1 u1 G% Y5 T7 D/ ^        % 繪制圖例        function obj=legend(obj)            obj.LgdHdl=legend([obj.PatchHdl],obj.ClassName,'FontSize',12,'Location','best');        end        % 設(shè)置圖例屬性        function obj=setLegend(obj,varargin)            set(obj.LgdHdl,varargin{:})        end6 q" m* F3 U3 V7 h& k' t% A2 _$ V4 g. L
            % 設(shè)置標簽        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
    6 o/ L8 x0 P7 {$ h2 K7 L$ K        % 設(shè)置軸        function obj=setRTick(obj,varargin)            set(obj.RTickHdl,varargin{:})        end        function obj=setThetaTick(obj,varargin)            set(obj.ThetaTickHdl,varargin{:})        end2 ~  c6 W% }$ Z6 J; \+ E! c. ^; {
            % 設(shè)置patch屬性        function obj=setPatchN(obj,N,varargin)            set(obj.PatchHdl(N),varargin{:})        end    end% @author : slandarer% 公眾號  : slandarer隨筆% 知乎    : hikariend8 y" h$ w, R3 u
    * M9 I! V( n- d+ _) G0 d- B

    ' T7 [2 Q- C/ \/ Y1 O6 ^* g" Q4 |. A% f0 i' Q9 u
    + \9 Z1 _1 k* [. n
    6.誤差羅盤圖
    - L/ V; V4 \- x3 y4 z* b6 u
    " i# H1 d3 w7 ~; n" t* @
  • figure('Units', 'pixels', ...    'Position', [150 150 920 600]);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)';[u1,v1] = pol2cart(th1,r1);M=compass(u1,v1);for j=1:length(Test_all(:,1))    M(j).LineWidth = 2;    M(j).Color = colorList(j,:);( \2 O" h: \3 t# c) o1 A8 [& W2 t. G4 m
    end   title(str2{i})set(gca,"FontSize",10,"LineWidth",1)end legend(M,str1,"FontSize",10,"LineWidth",1,'Box','off','Location','southoutside')+ y% J. O8 @0 X3 X3 d( T
    時序的和回歸的算法比較也是類似的,【領(lǐng)取數(shù)據(jù)和代碼方式】,在公眾號【Lvy的口袋】(下方鏈接直接進行公眾號)后臺回復(fù)關(guān)鍵詞【算法對比圖】領(lǐng)取,還有什么比較合適的對比圖可以私發(fā)小編看能不能復(fù)現(xiàn)奧~
    # s0 W6 Z& ~) ?4 q& ^& W+ X5 h" G( m
      f- Q% ]- z, M3 O- f

    2 J, F6 X; K4 D% xps.合適的繪圖之后可能會更新到工具箱中,全家桶大力更新中~早上車早實惠( w" w1 j1 X+ V

    ' }' @2 I1 e# X5 i6 [- s全家桶系列0 E: d* T1 E# G5 Z; o3 u$ j
    一鍵打包公眾號過去和未來所有的作品~持續(xù)更新中獲取方式】掃碼獲取或者點擊鏈接
    ( }  {, R% J8 xhttps://mbd.pub/o/bread/mbd-ZJabmJ9v$ H. h+ O; c* Y  ^, _- d5 V7 D" r) _. J

    * |  z! }* r1 P! R/ A7 j
    : O. A7 h4 g: L# `- r- H8 i- V1 f
    # V. s* j* B& F! f' s( u/ r" b% w
    ; g' h( ?; J- L7 x! O$ X: |, Q1 g$ c: F2 _# s! J

    ; K8 Y" C- ]6 {0 G* ZEND( r8 ], u7 K0 Q

    ( R6 j% A" c2 ^! @$ F8 W* ]
    9 o9 Q) Y3 S$ Q" J2 r8 u+ {5 W/ Y" |# H( P
    ( M/ W1 g: B5 [- b8 F# P4 Q& [
    長按二維碼識別關(guān)注  `2 u( |' w& M( \' c  \
    往期精彩回顧
    9 L4 _% _: ~2 _/ n2 K推薦 | 神器系列大更新!|一鍵實現(xiàn)百種高效算法|輕松解決評價、降維、聚類、回歸、分類、時序預(yù)測、多輸入多輸出問題推薦 | 一句命令實現(xiàn)神經(jīng)網(wǎng)絡(luò)超參數(shù)優(yōu)化推薦 | 四種降維方法及可視化      流2群【756559035】
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表