赞
踩
新手小白,想用LSTM做模型,参考了这篇文章参考来源
温度、湿度、日照时间等都会对蒸散发产生影响,想基于此构造LSTM模型,输入为当日温度、湿度、日照时间等,输出为当日蒸散发。
收集了一个区域内若干个气象站1960年-2020年的气候数据,用PM公式算出了参考蒸散发。先用一个观测站的数据来跑一下模型。用除去2020年的数据进行训练,2020年的数据进行验证。
clear; clc; data = importdata('data.txt') [num11,num1] = size(data); num2 = num11-365; %加载数据,重构为行向量 IN_train = data((2:num2),1:8)'; OUT_train = data((2:num2),9)'; %第9行为ET % 测试集――365个样本 IN_test = data((num2+1:end),1:8)'; OUT_test = data((num2+1:end),9)'; N = size(IN_test,2); [in_train, ps_input] = mapminmax(IN_train,0,1); in_test = mapminmax('apply',IN_test,ps_input); [out_train, ps_output] = mapminmax(OUT_train,0,1); xvalidation = in_train(:,num2-1000:end); in_train = in_train(:,1:num2-1001); yvalidation = out_train(:,num2-1000:end); out_train=out_train(:,1:num2-1001); rng('default')%设置随机种子
代码如下:
%创建LSTM回归网络,指定LSTM层的隐含单元个数200 numFeatures = size(in_train,1); numResponses = 1; numHiddenUnits =200; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) fullyConnectedLayer(numResponses) regressionLayer]; %指定训练选项,求解器设置为adam, 100 轮训练。 %梯度阈值设置为 1。指定初始学习率 0.005,在 10 轮训练后通过乘以因子 0.2 来降低学习率。 options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropPeriod',55, ... 'ValidationData',{xvalidation,yvalidation}, ... 'ValidationFrequency',10, ... 'LearnRateDropFactor',0.2, ... 'Verbose',0, ... 'Plots','training-progress'); %训练LSTM net = trainNetwork(in_train,out_train,layers,options);
代码如下:
net = resetState(net); net = predictAndUpdateState(net,in_train); YPred = predict(net,in_test,'MiniBatchSize',1); % 数据反归一化 T_sim = mapminmax('reverse',YPred,ps_output); % 1. 相对绝对误差MAE mae = sum(abs(T_sim - OUT_test))./N; % 2.均方根误差RMSE rmse = sqrt(sum((T_sim - OUT_test).^2)./N); % 3. 相关系数R R = sqrt((N * sum(T_sim .* OUT_test) - sum(T_sim) * sum(OUT_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((OUT_test).^2) - (sum(OUT_test))^2))); %% % 4. 结果对比 result = [OUT_test' T_sim'] %% 绘图 figure plot(1:N,OUT_test,'b',1:N,T_sim,'r') legend('真实值','预测值') xlabel('预测样本') ylabel('真实值') string = {'LSTM预测结果对比';['R=' num2str(R)]}; title(string)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。