目录
前言
一、数据来源和处理
二、相关性检验
Ⅰ、图形说明
Ⅱ、相关矩阵
三、LSTM算法预测
四、BP神经网络预测
前言
如何预测未来八年老龄化比率?作者从以下四个角度出发:GDP,医院数(医院包括综合医院、中医医院、中西医结合医院、民族医院、各类专科医院和护理院,不包括专科疾病防治院、妇幼保健院和疗养院。),自然增长率,15-64岁人群比率。经济的发展和医疗服务保障会促进人类平均寿命的延长,自然增长率则涉及到人口基数的变化,由于预测的是未来五年老龄化比率,15-64人群比率也要考虑在内。
其他因素对老龄化也有很大影响,如不可抗力(自然灾害,疫情等),或因为作者知识水平有限,或为了简化模型,不考虑在内。如果你有相异的见解,欢迎一起交流。
一、数据来源和处理
声明:本文所用数据都来自于国家统计局,特别感谢作者的信息检索老师,为数据的寻求提供了帮助。
由于各方面的原因,国统局对65岁以上人群的连续(每年)统计从1990年开始,本文所用到的数据均为相同的时间跨度:1990-2022。补充:2023/2/19,国统局上尚未公布2022年医院数,以38000估计。
附议Python文件处理代码:
f=open(r"C:\Users\username\Desktop\1.txt",'r').readlines()
#1.txt存放了复制粘贴的数据
g=open(r"C:\Users\username\Desktop\2.txt",'w')
#2.txt准备写入处理后的数据
for i in list(reversed(f[0].split())):#原年份为倒序,故reversed
g.write(i+'\n')#注意要换行
g.close()
二、相关性检验
Ⅰ、图形说明
p是经过处理后的数据,各列所代表的意义如下图。(想要完整数据的请私信)
将p归一化处理后(对每个指标),绘制五个指标在同一坐标系下的图
从中发现:
①15-64岁人口比率和>65的比率相关性较弱
②自然增长率与>65的比率大致呈负相关
③GDP与>65的比率大致呈正相关
④医院数大致与老龄化正相关
q=mapminmax(p',0,1);
ls=['r*--','go--','bd--','ys:','kx-.'];%linestyle
for i=1:5
plot(1990:2022,q(i,:),ls(i));
hold on
end
set(gca,'XTick',1990:3:2023);
legend('15-64比率','>65比率','自然增长率','GDP','医院数');
title('各数据归一化后在同一坐标轴的呈现');
Ⅱ、相关矩阵
>> corrcoef(p)
ans =
1.0000 0.3315 -0.5089 0.3467 0.2950
0.3315 1.0000 -0.8596 0.9920 0.9925
-0.5089 -0.8596 1.0000 -0.8062 -0.8119
0.3467 0.9920 -0.8062 1.0000 0.9940
0.2950 0.9925 -0.8119 0.9940 1.0000
数据第二列(老龄化比率)和有强相关性(绝对值>=0.8)的有:第三列(自然增长率),第四列(GDP),第五列(医院数)
三、LSTM算法预测
我们先用LSTM算法预测未来八个时间步的自然增长率,GDP,医院数
clc;clear;
load('p.mat');
t={'自然增长率','GDP','医院总数'};
fore=zeros([3,8]);
for i=1:3
subplot(1,3,i);
fore(i,:)=fig(p(:,i+2)');
title(t(i));
end
fig函数的定义
function [r] = fig(data) %r用来储存预测值
dataTrain = data;
mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sig;
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 200;
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',500, ...
'GradientThreshold',0.1, ...
'InitialLearnRate',0.001, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',100, ...
'LearnRateDropFactor',0.1, ...
'Verbose',0, ...
'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,layers,options);
net = predictAndUpdateState(net,XTrain);
[net,YPred] = predictAndUpdateState(net,YTrain(end));
for i = 2:8 #预测8年的
[net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
end
YPred=YPred*sig+mu;
plot(1990:2022,data,'bo-',2023:2030,YPred,'r*-');
hold on
legend('data','pred')
r=YPred;
end
四、BP神经网络预测
以1990-2022的数据为训练集进行训练搭建出网络,以此预测2023-2030的老龄化比率
q=[p(:,[3,4,5]);fore'];
input=q;
output=p(:,2);
%训练集,测试集
input_train=input(1:33,:)';
output_train=output(1:33,:)';
input_test=input(34:end,:)';
%数据归一化
[inputn,inputs]=mapminmax(input_train,-1,1);
[outputn,outputs]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputs);
net=newff(inputn,outputn,12);
%网络参数
net.trainparam.epochs=10000;
net.trainparam.lr=0.000001;
net.trainparam.goal=0.000001;
net.dividefcn='';
%bp神经网络训练
net=train(net,inputn,outputn);
an=sim(net,inputn_test);%用训练好的模型进行仿真
result=mapminmax('reverse',an,outputs);%预测结果反归一化
plot(1990:2022,output,'bo-',2023:2030,result,'r*-');
legend('1990-2022老龄化','2023-2027老龄化预测','location','northwest')
axis tight;
效果如下: