灰色模型及matlab算法

常用的预测模型主要有以下几类

预测方法分类
下面介绍灰色预测模型

简介

灰色系统理论认为,尽管客观表象复杂,但总是有整体功能的,因此必然蕴含某种内在规律。关键在于如何选择适当的方式去挖掘和利用它。灰色系统是通对原始数据的整理来寻求其变化规律的,这是一种就数据寻求数据的现实规律的途径,即为灰色序列的生成。一切灰色序列都能通过某种生成弱化其随机性,显现其规律性。数据生成的常用方式有累加生成、累减生成和加权累加生成。

模型建立步骤:

  1. 累加生成
    假设有原始数据 x 0 = ( x 1 0 , x 2 0 , . . . . . x m 0 ) x^0=(x_1^0 ,x_2^0 ,.....x_m^0) x0=(x10,x20,.....xm0) ,把数据依次累加的过程称为累程(AGO )。由累加生成过程所得的数列称为累加生成数列。那么 x 0 x^0 x0的累加数列为
    x 1 = ( x 1 1 , x 2 1 , . . . . . x m 1 ) = ( ∑ i = 1 1 x i 0 , ∑ i = 1 2 x i 0 , ∑ i = 1 m x i 0 ) x^1=(x_1^1 ,x_2^1,.....x_m^1)=(\sum_{i=1}^1x_i^0, \sum_{i=1}^2x_i^0,\sum_{i=1}^mx_i^0) x1=(x11,x21,.....xm1)=(i=11xi0,i=12xi0,i=1mxi0)

  2. 累减生成

clc,clear;
% 参数修改
%T1是原始数据序列
%T2是预测结果序列
%pre_num 是要预测的数据个数
%%
T1 = 1999:2008;
T2 = 1999:2018;
prd_num = 10;
 
%%
syms a b;
%c=[a b]';
x0=[89677,99215,109655,120333,135823,159878,192321,222407,246619,300670]; %原始数据
x1=cumsum(x0);  %原始数据累加
n=length(x0);
%% 求原始数据的级比
lamda = x0(1:n-1)./x0(2:n);  
X = [exp(-2/(n+1)) exp(2/(n+1))]; %覆盖区间
figure(1)
plot(lamda,'bo')
hold on
h = plot(ones(1,n-1)*X(1),'r');
set(h,'LineWidth',2); 
h=plot(ones(1,n-1)*X(2),'r');
set(h,'LineWidth',2); 
legend('级比','级比覆盖下限','级比覆盖上限')
xlabel('级比序列')
ylabel('级比值')
title('数列级比')
hold off
C = (x1(1:end-1)+x1(2:end))/2;
%计算待定参数的值
Y=x0;Y(1)=[];
Y=Y';
B=[-C;ones(1,n-1)];
c=inv(B*B')*(B*Y); %#ok<MINV>
c=c';
a=c(1);  %获取a的值
b=c(2);  %获取b的值
%预测后续数据
prd_data=[];prd_data(1)=x0(1);
i=2:(n+prd_num);  %推测数据
prd_data(i) = (x0(1)-b/a)./exp(a*(i-1))+b/a; %得出解,将for循环改为矩阵运算
prd_result=[];
prd_result(1)=x0(1);
prd_result(2:n+prd_num) = prd_data(2:n+prd_num)-prd_data(1:n+prd_num-1);%求累减数列,得出预测结果,只推测后10个数据,可以从此修改,得到预测出来的数据
disp('预测值为:');
disp(prd_result);
%%
figure(2)
h=plot(T1,x0,'o',T2,prd_result,'-'); %原始数据与预测数据的比较
xlabel('数据序列号')
ylabel('数据值')
title('预测结果')
legend('原始数据','预测数据')
set(h,'LineWidth',1.5); 
%%
figure(3)
ebson = x0-prd_result(1:n)./x0; %检验残差
lou   = 1-(1-0.5*a)/(1+0.5*a)*lamda; %计算偏度
plot(ebson,'b-o')
hold on
plot(lou,'g-s')
h = plot(ones(1,length(ebson))*0.1,'r-');
set(h,'LineWidth',2); 
h=plot(ones(1,length(ebson))*0.2,'r-');
set(h,'LineWidth',2); 
xlabel('数据序列号')
title('检验结果')
legend('残差','偏度','优等结果下限','一般结果下限')


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值