【13】 数学建模 您所在的位置:网站首页 灰度关联性分析怎么写 【13】 数学建模

【13】 数学建模

2023-12-12 19:38| 来源: 网络整理| 查看: 265

在这里插入图片描述

一、灰色预测使用的场景 数据是以年份度量的非负数据(如果是月份或者季度数据一定要用我们上一讲学过的时间序列模型);数据能经过准指数规律的检验(除了前两期外,后面至少90%的期数的光滑比要低于0.5);数据的期数较短且和其他数据之间的关联性不强(小于等于10,也不能太短了,比如只有3期数据),要是数据期数较长,一般用传统的时间序列模型比较合适 二、预测题型的一些常识 看到数据后先画时间序列图并简单的分析下趋势(例如:学过的时间序列分解)将数据分为训练组和试验组,尝试使用不同的模型对训练组进行建模,并利用试验组的数据判断哪种模型的预测效果最好(比如我们可以使用SSE这个指标来挑选模型,常见的模型有指数平滑、ARIMA、灰色预测、神经网络等选择上一步骤中得到的预测误差最小的那个模型,并利用全部数据来重新建模,并对未来的数据进行预测画出预测后的数据和原来数据的时序图,看看预测的未来趋势是否合理 三、灰色预测的一个案例

对长江水质污染的预测:2005年国赛A题中给出长江在过去10年中废水排放总量,如果不采取保护措施,请对今后10年的长江水质污染的发展趋势做出预测 在这里插入图片描述

四、灰色预测之GM(1,1)模型分析

算法流程(可以用流程图在实现一遍)

第一步:画出原始数据的时间序列图,并判断原始数据中是否有负数或期数是否低于4期,如果是的话则报错,否则执行下一步;

第二步:对一次累加后的数据进行准指数规律检验,返回两个指标:

指标1:光滑比小于0.5的数据占比(一般要大于60%)

指标2:除去前两个时期外,光滑比小于0.5的数据占比(一般大于90%)

并让用户决定数据是否满足准指数规律,满足则输入1,不满足则输入0

第三步:如果上一步用户输入0,则程序停止;如果输入1,则继续下面的步骤

第四步:让用户输入需要预测的后续期数,并判断原始数据的期数

数据期数为4:分别计算出传统的GM(1,1)模型、新信息GM(1,1)模型和新陈代谢GM(1,1)模型对于 未来期数的预测结果,为了保证结果的稳健性,对三个结果求平均值作为预测值。数据期数为5,6或7:取最后两期为试验组,前面的n‐2期为训练组;用训练组的数据分别训练三种GM模型,并将训练出来的模型分别用于预测试验组的两期数据;利用试验组两期的真实数据和预测出来的两期数据,可分别计算出三个模型的SSE;选择SSE最小的模型作为我们建模的模型。数据期数大于7:取最后三期为试验组,其他的过程和4.2类似。

第五步:5. 输出并绘制图形显示预测结果,并进行残差检验和级比偏差检验。

具体代码:

传统的GM(1,1)模型 function [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num) % 函数作用:使用传统的GM(1,1)模型对数据进行预测 % x0:要预测的原始数据 % predict_num: 向后预测的期数 % 输出变量 (注意,实际调用时该函数时不一定输出全部结果,就像corrcoef函数一样~,可以只输出相关系数矩阵,也可以附带输出p值矩阵) % result:预测值 % x0_hat:对原始数据的拟合值 % relative_residuals: 对模型进行评价时计算得到的相对残差 % eta: 对模型进行评价时计算得到的级比偏差 n = length(x0); % 数据的长度 x1=cumsum(x0); % 计算一次累加值 z1 = (x1(1:end-1) + x1(2:end)) / 2; % 计算紧邻均值生成数列(长度为n-1) % 将从第二项开始的x0当成y,z1当成x,来进行一元回归 y = kx +b y = x0(2:end); x = z1; % 下面的表达式就是第四讲拟合里面的哦~ 当是要注意,此时的样本数应该是n-1,少了一项哦 k = ((n-1)*sum(x.*y)-sum(x)*sum(y))/((n-1)*sum(x.*x)-sum(x)*sum(x)); b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/((n-1)*sum(x.*x)-sum(x)*sum(x)); a = -k; %注意:k = -a哦 % 注意: -a就是发展系数, b就是灰作用量 disp('现在进行GM(1,1)预测的原始数据是: ') disp(mat2str(x0')) % mat2str可以将矩阵或者向量转换为字符串显示 disp(strcat('最小二乘法拟合得到的发展系数为',num2str(-a),',灰作用量是',num2str(b))) disp('***************分割线***************') x0_hat=zeros(n,1); x0_hat(1)=x0(1); % x0_hat向量用来存储对x0序列的拟合值,这里先进行初始化 for m = 1: n-1 x0_hat(m+1) = (1-exp(a))*(x0(1)-b/a)*exp(-a*m); end result = zeros(predict_num,1); % 初始化用来保存预测值的向量 for i = 1: predict_num result(i) = (1-exp(a))*(x0(1)-b/a)*exp(-a*(n+i-1)); % 带入公式直接计算 end % 计算绝对残差和相对残差 absolute_residuals = x0(2:end) - x0_hat(2:end); % 从第二项开始计算绝对残差,因为第一项是相同的 relative_residuals = abs(absolute_residuals) ./ x0(2:end); % 计算相对残差,注意分子要加绝对值,而且要使用点除 % 计算级比和级比偏差 class_ratio = x0(2:end) ./ x0(1:end-1) ; % 计算级比 sigma(k) = x0(k)/x0(k-1) eta = abs(1-(1-0.5*a)/(1+0.5*a)*(1./class_ratio)); % 计算级比偏差 end

2.新信息GM(1,1)模型

function [result] = new_gm11(x0, predict_num) % 函数作用:使用新信息的GM(1,1)模型对数据进行预测 % 输入变量 % x0:要预测的原始数据 % predict_num: 向后预测的期数 % 输出变量 % result:预测值 result = zeros(predict_num,1); % 初始化用来保存预测值的向量 for i = 1 : predict_num result(i) = gm11(x0, 1); % 将预测一期的结果保存到result中 x0 = [x0; result(i)]; % 更新x0向量,此时x0多了新的预测信息 end end

3.新陈代谢GM(1,1)模型

function [result] = metabolism_gm11(x0, predict_num) % 函数作用:使用新陈代谢的GM(1,1)模型对数据进行预测 % 输入变量 % x0:要预测的原始数据 % predict_num: 向后预测的期数 % 输出变量 % result:预测值 result = zeros(predict_num,1); % 初始化用来保存预测值的向量 for i = 1 : predict_num result(i) = gm11(x0, 1); % 将预测一期的结果保存到result中 x0 = [x0(2:end); result(i)]; % 更新x0向量,此时x0多了新的预测信息,并且删除了最开始的那个向量 end end

4.main函数部分

%% 输入原始数据并做出时间序列图 clear;clc year =[1995:1:2004]'; % 横坐标表示年份,写成列向量的形式(加'就表示转置) x0 = [174,179,183,189,207,234,220.5,256,270,285]'; %原始数据序列,写成列向量的形式(加'就表示转置) % year = [2009:2015]; % 其实本程序写成了行向量也可以,因为我怕你们真的这么写了,所以在后面会有判断。 % x0 = [730, 679, 632, 599, 589, 532, 511]; % year = [2010:2017]'; % 该数据很特殊,可以通过准指数规律检验,但是预测效果却很差 % x0 = [1.321,0.387,0.651,0.985,1.235,0.987,0.854,1.021]'; % year = [2014:2017]'; % x0 = [2.874,3.278,3.337,3.390]'; % 画出原始数据的时间序列图 figure(1); % 因为我们的图形不止一个,因此要设置编号 plot(year,x0,'o-'); grid on; % 原式数据的时间序列图 set(gca,'xtick',year(1:1:end)) % 设置x轴横坐标的间隔为1 xlabel('年份'); ylabel('排污总量'); % 给坐标轴加上标签 %% 因为我们要使用GM(1,1)模型,其适用于数据期数较短的非负时间序列 ERROR = 0; % 建立一个错误指标,一旦出错就指定为1 % 判断是否有负数元素 if sum(x0 0 % x01}.size. % net.inputs{1}.size % 这里要注意,我们要将指标变为列向量,然后再用sim函数预测 sim(net, new_X(1,:)') % 写一个循环,预测接下来的十个样本的辛烷值 predict_y = zeros(10,1); % 初始化predict_y for i = 1: 10 result = sim(net, new_X(i,:)'); predict_y(i) = result; end disp('预测值为:') disp(predict_y)

更多有关于预测问题的经典获奖论文,关注公众号,回复,“预测模型”,即可免费领取!!! 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有