1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| clear;clc year =[1995:1:2004]'; x0 = [174,179,183,189,207,234,220.5,256,270,285]';
figure(1); plot(year,x0,'o-'); grid on; set(gca,'xtick',year(1:1:end)) xlabel('年份'); ylabel('排污总量');
ERROR = 0;
if sum(x0<0) > 0 disp('亲,灰色预测的时间序列中不能有负数哦') ERROR = 1; end
n = length(x0); disp(strcat('原始数据的长度为',num2str(n))) if n<=3 disp('亲,数据量太小,我无能为力哦') ERROR = 1; end
if n>10 disp('亲,这么多数据量,一定要考虑使用其他的方法哦,例如ARIMA,指数平滑等') end
if size(x0,1) == 1 x0 = x0'; end if size(year,1) == 1 year = year'; end
if ERROR == 0 disp('------------------------------------------------------------') disp('准指数规律检验') x1 = cumsum(x0); rho = x0(2:end) ./ x1(1:end-1) ; figure(2) plot(year(2:end),rho,'o-',[year(2),year(end)],[0.5,0.5],'-'); grid on; text(year(end-1)+0.2,0.55,'临界线') set(gca,'xtick',year(2:1:end)) xlabel('年份'); ylabel('原始数据的光滑度'); disp(strcat('指标1:光滑比小于0.5的数据占比为',num2str(100*sum(rho<0.5)/(n-1)),'%')) disp(strcat('指标2:除去前两个时期外,光滑比小于0.5的数据占比为',num2str(100*sum(rho(3:end)<0.5)/(n-3)),'%')) disp('参考标准:指标1一般要大于60%, 指标2要大于90%,你认为本例数据可以通过检验吗?') Judge = input('你认为可以通过准指数规律的检验吗?可以通过请输入1,不能请输入0:'); if Judge == 0 disp('亲,灰色预测模型不适合你的数据哦~ 请考虑其他方法吧 例如ARIMA,指数平滑等') ERROR = 1; end disp('------------------------------------------------------------') end
if ERROR == 0 if n > 7 test_num = 3; else test_num = 2; end train_x0 = x0(1:end-test_num); disp('训练数据是: ') disp(mat2str(train_x0')) test_x0 = x0(end-test_num+1:end); disp('试验数据是: ') disp(mat2str(test_x0')) disp('------------------------------------------------------------') disp(' ') disp('***下面是GM(1,1)模型预测的详细过程***') result1 = gm11(train_x0, test_num); disp(' ') disp('------------------------------------------------------------') test_year = year(end-test_num+1:end); figure(3) plot(test_year,test_x0,'o-',test_year,result1,'*-'); grid on; set(gca,'xtick',year(end-test_num+1): 1 :year(end)) legend('试验组的真实数据','GM(1,1)预测结果') xlabel('年份'); ylabel('排污总量'); predict_num = input('请输入你要往后面预测的期数: '); [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num); disp('------------------------------------------------------------') disp('对原始数据的拟合结果:') for i = 1:n disp(strcat(num2str(year(i)), ' : ',num2str(x0_hat(i)))) end disp(strcat('往后预测',num2str(predict_num),'期的得到的结果:')) for i = 1:predict_num disp(strcat(num2str(year(end)+i), ' : ',num2str(result(i)))) end figure(4) subplot(2,1,1) plot(year(2:end), relative_residuals,'*-'); grid on; legend('相对残差'); xlabel('年份'); set(gca,'xtick',year(2:1:end)) subplot(2,1,2) plot(year(2:end), eta,'o-'); grid on; legend('级比偏差'); xlabel('年份'); set(gca,'xtick',year(2:1:end)) disp(' ') disp('****下面将输出对原数据拟合的评价结果***') average_relative_residuals = mean(relative_residuals); disp(strcat('平均相对残差为',num2str(average_relative_residuals))) if average_relative_residuals<0.1 disp('残差检验的结果表明:该模型对原数据的拟合程度非常不错') elseif average_relative_residuals<0.2 disp('残差检验的结果表明:该模型对原数据的拟合程度达到一般要求') else disp('残差检验的结果表明:该模型对原数据的拟合程度不太好,建议使用其他模型预测') end average_eta = mean(eta); disp(strcat('平均级比偏差为',num2str(average_eta))) if average_eta<0.1 disp('级比偏差检验的结果表明:该模型对原数据的拟合程度非常不错') elseif average_eta<0.2 disp('级比偏差检验的结果表明:该模型对原数据的拟合程度达到一般要求') else disp('级比偏差检验的结果表明:该模型对原数据的拟合程度不太好,建议使用其他模型预测') end disp(' ') disp('------------------------------------------------------------') figure(5) plot(year,x0,'-o', year,x0_hat,'-*m', year(end)+1:year(end)+predict_num,result,'-*b' ); grid on; hold on; plot([year(end),year(end)+1],[x0(end),result(1)],'-*b') legend('原始数据','拟合数据','预测数据') set(gca,'xtick',[year(1):1:year(end)+predict_num]) xlabel('年份'); ylabel('排污总量'); end
|