2022亚太杯C题第一问代码解答

1.你同意有关全球气温的说法吗?

使用2022 APMCM C_Daa.附件中的csV和其他您团队收集的数据集,以分析全球温度变化。这里一般是肯定题目所提到的气温上升的说法,这里可以在一开始进行同意,也可以在第一小问的a,b,c结束之后书写结论,一定要先找到所谓C02水平的定义。

a)你同意2022年3月全球气温的上升导致了比过去10年期间更大的上升吗?为什么或为什么不呢?

本为题意在指出:是否是2004年3月一个月的排放量造成了更大的增长,所以需要对比2004年3月的二氧化碳排放量与 以往十年间每月的平均值,所有数据都是按照月份排的,你可以使用直接比较的办法以往十年间每月的平均值,所有数据都是按照月份排的, 看其他月份是否更多,也可以直接突变点检验,可以选择pttit突变点检验也可以选择MannKendall突变点检验。

第一问代码:

在这里插入代码片

%% 加载示例数据。
%chickenpox_dataset 包含一个时序,其时间步对应于月份,值对应于病例数。
%输出是一个元胞数组,其中每个元素均为单一时间步。将数据重构为行向量。
%data = chickenpox_dataset;
%data = [data{:}];
data = data1';
figure
plot(data)
%xlabel("Month")
%ylabel("Cases")
%title("Monthly Cases of Chickenpox")
%% 对训练数据和测试数据进行分区。
numTimeStepsTrain = 10;
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 回归网络。指定 LSTM 层有 200 个隐含单元
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 200;
 
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 网络
%使用 trainNetwork 以指定的训练选项训练 LSTM 网络。
net = trainNetwork(XTrain,YTrain,layers,options);
%% 预测将来时间步
%要预测将来多个时间步的值,请使用 predictAndUpdateState 函数一次预测一个时间步,并在每次预测时更新网络状态。对于每次预测,使用前一次预测作为函数的输入。
%使用与训练数据相同的参数来标准化测试数据。
dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1);
%要初始化网络状态,请先对训练数据 XTrain 进行预测。
%接下来,使用训练响应的最后一个时间步 YTrain(end) 进行第一次预测。
%循环其余预测并将前一次预测输入到 predictAndUpdateState。
%对于大型数据集合、长序列或大型网络,在 GPU 上进行预测计算通常比在 CPU 上快。
%其他情况下,在 CPU 上进行预测计算通常更快。
%对于单时间步预测,请使用 CPU。
%使用 CPU 进行预测,请将 predictAndUpdateState 的 'ExecutionEnvironment' 选项设置为 'cpu'% net = predictAndUpdateState(net,XTrain);
% [net,YPred] = predictAndUpdateState(net,YTrain(1:end));
%  
% numTimeStepsTest = numel(XTest);
% for i = 2:numTimeStepsTest+24
%     [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
% end
% %使用先前计算的参数对预测去标准化。
% YPred = sig*YPred + mu;
% %训练进度图会报告根据标准化数据计算出的均方根误差 (RMSE)。根据去标准化的预测值计算 RMSE。
% YTest = dataTest(2:end);
% %rmse = sqrt(mean((YPred-YTest).^2))
% %使用预测值绘制训练时序。
% figure
% plot(dataTrain(1:end-1))
% hold on
% idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest+24);
% plot(idx,[data(numTimeStepsTrain) YPred],'.-')
% hold off
% xlabel("Month")
% ylabel("Cases")
% title("Forecast")
% legend(["Observed" "Forecast"])
% %将预测值与测试数据进行比较。
% figure
% plot(YTest)
% hold on
% plot(YPred,'.-')
% hold off
% legend(["Observed" "Forecast"])
% ylabel("Cases")
% title("Forecast")
 
% % subplot(2,1,2)
% % stem(YPred - YTest)
% % xlabel("Month")
% % % ylabel("Error")
% % % title("RMSE = " + rmse)
% %% 使用观测值更新网络状态
% %如果您可以访问预测之间的时间步的实际值,则可以使用观测值而不是预测值更新网络状态。
% %首先,初始化网络状态。要对新序列进行预测,请使用 resetState 重置网络状态。
% %重置网络状态可防止先前的预测影响对新数据的预测。重
% %置网络状态,然后通过对训练数据进行预测来初始化网络状态。
net = resetState(net);
net = predictAndUpdateState(net,XTrain);
%对每个时间步进行预测。对于每次预测,使用前一时间步的观测值预测下一个时间步。
%将 predictAndUpdateState 的 'ExecutionEnvironment' 选项设置为 'cpu'。
YPred = [];
numTimeStepsTest = numel(XTest);
for i = 1:numTimeStepsTest
    [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end
%使用先前计算的参数对预测去标准化。
YPred = sig*YPred + mu;
%计算均方根误差 (RMSE)。
MAPE = mean(abs((YPred-YTest)./YTest))*100
%将预测值与测试数据进行比较。
figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred,'.-')
hold off
legend(["Observed" "Predicted"])
ylabel("Cases")
title("Forecast with Updates")
%  
subplot(2,1,2)
stem(YPred - YTest)
xlabel("Month")
ylabel("Error")
title("MAPE = " + MAPE)

LSTM代码–matlab直接代入数据运行版(我已经调试好了)。
2022亚太杯C题第一问代码解答_第1张图片
本代码参考文档:https://docs.qq.com/doc/DV0FhYWhiSFFYdG1L

你可能感兴趣的:(数学建模,亚太杯数学建模竞赛,深度学习,人工智能)