引言:灰色预测模型是通过少量的信息、不完全的信息,建立数学模型并做出预测的一种预测方法,相比于其他预测模型,如回归分析,需要的数据信息少,运算方便,建模精度高,在各种领域都有着广泛的应用,是处理小样本预测问题的有效工具
精度检验:
(3)预测精度等级参照表:
预测精度等级 | P | C |
好 | ||
合格 | ||
勉强 | ||
不合格 |
接下来是算法的实现(此处使用MATLAB实现),预测第6个和第7个数:
%灰色预测模型
clear all
clc
%数据累加
y1 = input('请输入数据:');%y1为原始数据
n = length(y1);
y2 = ones(n,1);%y2用来放置累加数据
y2(1) = y1(1);
%累加操作
for i = 2:n
y2(i) = y2(i-1) + y1(i);
end
%建立矩阵B
B = ones(n-1,2);
for i = 1:n-1
B(i,1) = -(y2(i) + y2(i+1))/2;
B(i,2) = 1;
end
%求逆矩阵
BT = B';
%建立矩阵y
for i = 1:n-1
y(i) = y1(i+1);
end
y = y';
%求解U矩阵
U = inv(BT*B)*BT*y;
a = U(1);
u = U(2);
%利用求解出来的微分方程,预测未知数据
t_test = input('输入预测的个数:');
k = 1:t_test+n;
y3(k+1) = (y2(1)-u/a).*exp(-a.*k)+u/a;%根据微分方程预测出来的累加拟合数据
y3(1)=y1(1);
for i = n+t_test:-1:2
y4(i) = y3(i) - y3(i-1);
end
x1 = 1:n;
xs = 1:n+t_test;
ys = [y1(1) y4(2:n+t_test)];
plot(x1,y1,'^r',xs,ys,'*-b')
legend('原始数据','预测数据')
%检验
det = 0;
for i = 2:n
det = det + abs(ys(i)-y1(i));
end
det = det / (n + 1);
X = mean(y1);%原始数据的均值
for i = 1:n
E(i) = y1(i) - ys(i);%残差
end
%计算原始数据的残差
temp1 = 0;
for i = 1:n
temp1 = temp1 + (y1(i) - X)^2;
end
S1 = sqrt(temp1/n);
%计算残差的方差
temp2 = 0;
for i = 1:n
temp2 = temp2 + E(i) - mean(E);
end
S2 = sqrt(temp2/(n-1));
C = S2 / S1
disp(['百分绝对误差为:',num2str(det),'%']);
disp(['预测值为:',num2str(ys(n+1:n+t_test))]);
%%----------------------------以下是输出结果
请输入数据:[1 3 8 10 15]
输入预测的个数:2
C =
1.3160e-09
百分绝对误差为:0.47793%
预测值为:22.7307 34.2451
从图中可以看到的,预测的数据还是比较好的:
灰色系统对于小数据样本预测有非常好的效果,本文推导的是一阶一元灰色模型,希望以上内容对你能有所帮助,感想观看!