自从开始在CSDN上写博客之后,每天看着点击量,一点点增加,总算是体会到一丝成长的滋味。
但这也带来了更多的期待,那我下个月的点击量大概会到多少呢?
对于这样预测未来的模型,在样本数据足够少的情况下我们可以使用灰色预测模型
本文分为四个部分来例说此法:
一:灰色预测模型的概述.
二:灰色预测模型的使用方法.
三:灰色预测模型代码实现及输出结果分析.
一:灰色预测模型的概述
当我们用运筹学的思想去解决实际问题,来制定战略和政策,进行重大问题的决策时,都必须要对未来进行科学的预测。
立足现在,回望过去,展望未来,而灰色模型主要就是用于预测事物的发展规律,进行合理科学的假设和判断。
目前常用的一些预测方法,比如说:回归分析 需要很大的样本,如果说样本较小的话,则会造成较大的误差,使目标评测失效。
而灰色预测模型所需要的建模的信息少,运算方便,而且建模的精度较高。
此模型是1982年华中理工大学邓聚龙教授所提出。
1.2灰色模型的组成
灰色系统也是黑箱概念的一种推广,它里面既含有一支信息又含有未知信息,我们将这种系统称之为灰色系统,
作为两个极端信息未完全确定的系统,我们将其称之为黑色系统,
而信息完全确定的是白色系统,
区分黑色系统和白色系统的重要标志是系统各个因素之间是否有确定的关系?
二:灰色预测模型的使用方法
2.1数据初始化处理:灰色生成
在拿到数据之后我们一般都会将原始数据按照某种要求进行数据处理,这这一步在灰色预测系统里面叫做灰色生成。
常用的灰色系统生成方式由累加生成,累减生成,均值生成及级比生成。
2.2累加生成简述
下面我们主要介绍一下累加生成。
现在有一个原始数列,代表了我的CSDN在1月到10月的博客点击量:
[724, 746, 778, 800, 827,871, 912, 954, 995, 1037]
我们将此数列各个时刻的数据依次累加,就会得到一个新的数列。
如图:
公式如下图,这是一次累加生成。
2.3预测公式:使用GM(1,1,)预测
在进行完灰色生成之后,我们怎么得出预测公式呢?
可以使用GM(1,1,)模型。
具体的公式推导如下。
大家看不懂也没有关系,直接用程序就可以。
2.4灰色模型精度检验
在进行完预测公式之后,一定要经过检验才能判断它是否合理。
灰色模型的精度检验一般有三种方式:相对误差大小检验法,关联度减法和后验差检验法,
2.4.1后验查检验法
下面我们主要介绍一下后验查检验法。
后验差比越小代表预测越好。
但是这个C要多小才好呢?我们可以根据精度检验等级参考表。
三:灰色预测模型代码实现及输出结果分析
我们在构建完整个模型之后就可以把第一个月到第10个月的博客点击量数据代入。
这里使用一维数组,代入之后系统提示,预测精度好,红色的是我们输入的数据,而蓝色的则是系统预测的数据。
根据结果提示,我们只到了第11个月和第12个月的博客点击量,分别为1079,和1125。
过程如图:
function []=greymodel(y)
% 本程序主要用来计算根据灰色理论建立的模型的预测值。
% 应用的数学模型是 GM(1,1)。
% 原始数据的处理方法是一次累加法。
y=input('请输入数据 ');
n=length(y);
yy=ones(n,1);
yy(1)=y(1);
for i=2:n
yy(i)=yy(i-1)+y(i);
end
B=ones(n-1,2);
for i=1:(n-1)
B(i,1)=-(yy(i)+yy(i+1))/2;
B(i,2)=1;
end
BT=B';
for j=1:n-1
YN(j)=y(j+1);
end
YN=YN';
A=inv(BT*B)*BT*YN;
a=A(1);
u=A(2);
t=u/a;
i=1:n+2;
yys(i+1)=(y(1)-t).*exp(-a.*i)+t;
yys(1)=y(1);
for j=n+2:-1:2
ys(j)=yys(j)-yys(j-1);
end
x=1:n;
xs=2:n+2;
yn=ys(2:n+2);
plot(x,y,'^r',xs,yn,'*-b');
det=0;
sum1=0;
sumpe=0;
for i=1:n
sumpe=sumpe+y(i);
end
pe=sumpe/n;
for i=1:n;
sum1=sum1+(y(i)-pe).^2;
end
s1=sqrt(sum1/n);
sumce=0;
for i=2:n
sumce=sumce+(y(i)-yn(i));
end
ce=sumce/(n-1);
sum2=0;
for i=2:n;
sum2=sum2+(y(i)-yn(i)-ce).^2;
end
s2=sqrt(sum2/(n-1));
c=(s2)/(s1);
disp(['后验差比值为:',num2str(c)]);
if c<0.35
disp('系统预测精度好')
else if c<0.5
disp('系统预测精度合格')
else if c<0.65
disp('系统预测精度勉强')
else
disp('系统预测精度不合格')
end
end
end
disp(['下个拟合值为 ',num2str(ys(n+1))]);
disp(['再下个拟合值为',num2str(ys(n+2))]);