查看原文
其他

2021数维杯B题参考思路+资料

老铁们,数维杯B题思路资料有需要得小伙伴自提哈


本题总体难度系数较低,主要是进行数据的定量分析并探究相应的规律;首先针对问题一,先把题目的各项指标搞清楚,在这里给大家列了一下;其中比较关键的是降水量和气温以及气压等数据紧密相关;有很多同学在这里准备对数据进行预处理,预处理的前提是数据缺失或存在错误等,在这里要经过仔细的观察后再去看是否需要要预处理;由于是分析降水量的年变化特征,因此首先求出年平均降水量,得到年平均降水量后即可进行相关分析,在这里可以选择两方面的分析,第一是突变分析、第二是周期关系分析;

 

 

首先是突变分析,突变分析主要是研究在哪些年份发生了比较明显的变化,可以采用M-K检验法对变异点进行初步的识别。M-K法具有检测范围宽、人为性少等特点,是目前在突变检验中应用较多的方法。可以综合研究降水量和气温、降水量和气压等特征的分析;

 

% M-K检验法matlab代码

function [UFk,UBk] = MKTest(y)

%y:原时间序列,可以是气温、降水量等,注意替换!

%UFk:顺序结果;UBk:逆序结果

n=length(y);

% 正序列计算---------------------------------

r=zeros(n,1);

for i=2:n

    for j=1:i

        if y(i)>y(j)

            r(i)=r(i)+1;

        end

    end

end

sk=zeros(n,1);

for i=2:n

    for j=1:i

        sk(i)=sk(i)+r(j);

    end

end

UFk=zeros(n,1);  % 定义统计量UFk=(sk-E)/sqrt(var)

for i=2:n

    E=i*(i-1)/4; % Sk(i)的均值

    Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差

    UFk(i)=(sk(i)-E)/sqrt(Var);

end

% 正序列计算结束---------------------------------

 

% 逆序列计算---------------------------------

y2=flipud(y);

r2=zeros(n,1);

for i=2:n

    for j=1:i

        if y2(i)>y2(j)

            r2(i)=r2(i)+1;

        end

    end

end

sk2=zeros(n,1);

for i=2:n

    for j=1:i

        sk2(i)=sk2(i)+r2(j);

    end

end

UFk2=zeros(n,1);

for i=2:n

    E=i*(i-1)/4; % Sk(i)的均值

    Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差

    UFk2(i)=(sk2(i)-E)/sqrt(Var);

end

UBk=zeros(n,1);

UBk=flipud(-UFk2);

% 逆序列计算结束---------------------------------

 

%绘图

plot(1:n,UFk,'r-','linewidth',1.5);

hold on;

plot(1:n,UBk,'b-','linewidth',1.5);

plot(1:n,0*ones(n,1),'-.','linewidth',1);  %绘制横轴0值线

plot(1:n,1.96*ones(n,1),':','linewidth',1); %绘制95%置信区间界限

plot(1:n,-1.96*ones(n,1),':','linewidth',1);%绘制95%置信区间界限

axis([1,n,-4,8]);%设置横坐标范围和纵坐标范围

legend('UF','UB','95%显著区间'); %设置图例

xlabel('t','FontName','TimesNewRoman','FontSize',12);%设置x轴标签

ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);%设置y轴标签

%plot(1:n,2.32*ones(n,1),':','linewidth',1); %绘制99%置信区间界限

%plot(1:n,-2.32*ones(n,1),':','linewidth',1);%绘制99%置信区间界限

%MK检验统计量绝对数值≥1.28/1.96/2.32分别表明90%/95%/99%的置信区间

 

% 把UF、UB计算结果写入xlsx文件:C:\test.xls

% 目标表单:Sheet1

% 目标区域:UFk从A1开始,UBk从B1开始

xlswrite('C:\test.xlsx',UFk,'Sheet1','A1');

xlswrite('C:\test.xlsx',UBk,'Sheet1','B1');

End

 

得到类似的突变结果

 


 

然后是周期关系分析,周期关系是最能体现时间序列数据变化特征的关键指标,目前我们常用到的周期关系分析方法主要是小波分析,常用到的是Morlet小波,通过小波分析后可以分析年平均降水量在时间尺度上有什么样的变化特征。

小波分析的方法和步骤相对较为复杂,为此专门给大家整理了一套流程,完全可以自己操作,需要的可以直接加助理领取哈,领取方式:关注公众号【老哥带你学数模】,回复【数维杯】即可领取

 

 

 

对于降水量较高的年份通过对应的年平均降水量的趋势图就能看出来。

对郑州市2021年洪水的定量分析可以利用变化率、方差等定量分析方法进行论述即可

 


问题2:您能否收集和整理我国更多城市多年来的降水数据,并分析这些城市的降水趋势?(有必要明确说明数据来源和获取方式)

 

这里主要是让大家利用问题一构建的分析方法来对其他城市进行模拟;降雨量数据可以在国家气象数据中心下载:http://data.cma.cn/,在这里就2~3个典型城市进行分析即可,没必要罗列太多城市,但经过问题三可知是需要进行极端天气预测和验证的,因此在这里最好找一下之前发生过强降雨等洪涝灾害的城市,方便后面做验证。关键是分析出这些城市的降雨量随时间的变化情况,也就是利用问题一中的模型得出各城市关键的突变点数据和周期信息;

 

问题3:您能否使用收集的城市天气数据进行预测和分析根据不同的方法预测未来可能出现极端降雨的城市,并比较和分析您的预测效果?

 

该问题主要是预测类问题,通过问题二收集到的各城市的数据在这里进行相应的预测即可。在这里题目说了用不同的方法来预测,所以可以选择多种预测模型进行建模,常见的在时间序列层面预测的模型有:支持向重机、朴素贝叶斯、逻辑回归、普通深度神经网络和LSTM神经网络模型等;首先可以将原始数据划分为两部分,一部分用于建模,一部分用于验证,看上述模型中那个模型的精度最高,然后利用这个模型再对未来进行预测即可得出未来什么时间将会出现极端降雨情况

 

由于页面有限,上述预测模型的代码给大家整理好了,没法放在这里,仅放上LSTM神经网络模型的代码,其它模型代码可以加助理领取,领取方式:关注公众号【老哥带你学数模】,回复【数维杯】即可领取




 

data=xlsread(filenam)%读取降雨量数据

%%

%序列的前 90% 用于训练,后 10% 用于测试

numTimeStepsTrain = floor(0.9*numel(data));

dataTrain = data(1:numTimeStepsTrain+1);

dataTest = data(numTimeStepsTrain+1:end);

 

%数据预处理,将训练数据标准化为具有零均值和单位方差。

mu = mean(dataTrain);

sig = std(dataTrain);

dataTrainStandardized = (dataTrain - mu) / sig;

 

%输入LSTM的时间序列交替一个时间步

XTrain = dataTrainStandardized(1:end-1);

YTrain = dataTrainStandardized(2:end);

 

%%

%创建LSTM回归网络,指定LSTM层的隐含单元个数96*3

%序列预测,因此,输入一维,输出一维

numFeatures = 1;

numResponses = 1;

numHiddenUnits = 96*3;

 

layers = [ ...

    sequenceInputLayer(numFeatures)

    lstmLayer(numHiddenUnits)

    fullyConnectedLayer(numResponses)

    regressionLayer];

 

%指定训练选项,求解器设置为adam, 250 轮训练。

%梯度阈值设置为 1。指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习率。

options = trainingOptions('adam', ...

    'MaxEpochs',250, ...

    'GradientThreshold',1, ...

    'InitialLearnRate',0.005, ...

    'LearnRateSchedule','piecewise', ...

    'LearnRateDropPeriod',125, ...

    'LearnRateDropFactor',0.2, ...

    'Verbose',0, ...

    'Plots','training-progress');

%训练LSTM

net = trainNetwork(XTrain,YTrain,layers,options);

 

dataTestStandardized = (dataTest - mu) / sig;

XTest = dataTestStandardized(1:end-1);

YTest = dataTest(2:end);

 

net = resetState(net);

net = predictAndUpdateState(net,XTrain);

 

YPred = [];

numTimeStepsTest = numel(XTest);

for i = 1:numTimeStepsTest

    [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');

end

 

%使用先前计算的参数对预测去标准化。

YPred = sig*YPred + mu;

 

%计算均方根误差 (RMSE)。

rmse = sqrt(mean((YPred-YTest).^2))

 

%将预测值与测试数据进行比较。

figure

subplot(2,1,1)

plot(YTest)

hold on

plot(YPred,'.-')

hold off

legend(["Observed" "Predicted"])

ylabel("Loads")

title("Forecast with Updates")

 

subplot(2,1,2)

stem(YPred - YTest)

xlabel("Days")

ylabel("Error")

title("RMSE = " + rmse)

 

 

figure

subplot(2,1,1)

plot(dataTrain(1:end-1))

hold on

idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);

plot(idx,[data(numTimeStepsTrain) YPred],'.-')

hold off

xlabel("Days")

ylabel("Loads")

title("Forecast")

legend(["Observed" "Forecast"])

subplot(2,1,2)

plot(data)

xlabel("Days")

ylabel("Loads")

title("Daily load")

 

 

 


得到类似的结果(演示数据不同,不是下面这个结果哈)

 

 

问题4:您认为2021年7月郑州的暴雨特征与2021年10月山西的暴雨特征是否相同?造成的损失有什么区别。

 

对于暴雨特征的分析可以从三方面入手,根据前面的见面可知,我们主要用到了突变点、周期和预测值三种特征,因此可以分别利用这三种特征来分析郑州的暴雨和山西的暴雨数据;如判断在2021年郑州是否满足突变点、是否在强降雨的周期上,是否能通过预测计算得出等;同样也可以用于山西暴雨的分析;因此该问题是前面几个问题的总结。至于造成的损失则需要就经济损失、人员伤害等进行定量化的描述即可;

 

问题5:能否提出未来极端降水条件下城市的长期建设规划,对我国典型城市进行深入分析尤为必要。

 

这里结合一些文献进行论述即可

 

更多资料欢迎关注微信公众号【老哥带你学数模】或加群:1023354946

 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存