日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测

發(fā)布時間:2024/8/1 循环神经网络 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 代碼
  • 采集數(shù)據(jù)
  • 簡要分析
  • 結(jié)論

代碼

1、matlab代碼
?我借鑒了BP神經(jīng)網(wǎng)絡(luò)的實現(xiàn)實例,這個例子數(shù)據(jù)全部都給好了

%% I.清空環(huán)境變量 clear all clc%% II.訓(xùn)練集/測試集的產(chǎn)生 %1.導(dǎo)入數(shù)據(jù) x = xlsread('人口.xlsx',1,'A2:A72')'; y2 = xlsread('人口.xlsx',1,'C2:C72'); y3 = xlsread('人口.xlsx',1,'D2:D72'); y4 = xlsread('人口.xlsx',1,'E2:E72'); y5 = xlsread('人口.xlsx',1,'F2:F72'); y6 = xlsread('人口.xlsx',1,'G2:G72'); y7 = xlsread('人口.xlsx',1,'H2:H72'); y8 = xlsread('人口.xlsx',1,'I2:I72'); y9 = xlsread('人口.xlsx',1,'J2:J72'); y=[y2 y3 y4 y5 y6 y7 y8 y9];%采用8個因素來衡量 y1 = xlsread('人口.xlsx',1,'B2:B72'); %輸出的結(jié)果,人口數(shù)%% %2.隨機(jī)產(chǎn)生訓(xùn)練集和測試集 %預(yù)測2020的出生人口數(shù)目,此時要從第2行讀取到第73行 % temp = randperm(size(y,1)-1); % temp(72)=72; % %訓(xùn)練集--62個樣本,要有足夠的代表性,訓(xùn)練模型才能好,這里我采用隨機(jī)產(chǎn)生的方法 % P_train = y(temp(1:62),:)';%P代表輸入,T代表輸出 % T_train = y1(temp(1:62),:)'; % %測試集--10個樣本 % Year=x(temp(63:end)); % P_test = y(temp(63:end),:)'; % T_test = y1(temp(63:end),:)'; % N = size(P_test,2);%10 %固定訓(xùn)練 % P_train = y(1:61,:)'; % T_train = y1(1:61,:)'; % Year=x(62:end); % P_test = y(62:end,:)'; % T_test = y1(62:end,:)'; % N = size(P_test,2); %隨機(jī)數(shù)訓(xùn)練temp = randperm(size(y,1));P_train = y(temp(1:61),:)';T_train = y1(temp(1:61),:)';Year=x(temp(62:end));P_test = y(temp(62:end),:)';T_test = y1(temp(62:end),:)';N = size(P_test,2); %% III.數(shù)據(jù)歸一化 [p_train, ps_input] = mapminmax(P_train,0,1); p_test = mapminmax('apply',P_test,ps_input); [t_train, ps_output] = mapminmax(T_train,0,1);%% IV.BP(Back Propagation)神經(jīng)網(wǎng)絡(luò)建立、訓(xùn)練及仿真測試 %1.創(chuàng)建網(wǎng)絡(luò) net = newff(p_train,t_train,9);%信號前向傳播,誤差反向傳播,連接權(quán)值和閾值隨機(jī)生成的 %單隱含層神經(jīng)元%% %2.設(shè)置訓(xùn)練參數(shù) net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3;%訓(xùn)練要求精度 net.trainParam.lr = 0.001; %學(xué)習(xí)速率%% %3.訓(xùn)練網(wǎng)絡(luò) net = train(net,p_train,t_train);%% %4.仿真測試 t_sim = sim(net,p_test);%% %5.數(shù)據(jù)反歸一化 T_sim = mapminmax('reverse',t_sim,ps_output);%% V.性能評價 %% % 1.相對誤差error error = abs(T_sim - T_test)./T_test;%% % 2.決定系數(shù)R^2 R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); %% % 3.結(jié)果對比 result = [T_test' T_sim' error'];%% VI.繪圖 figure plot(1:N,T_test,'b:*',1:N,T_sim,'r-o');%2020年的真實值是用matlab擬合函數(shù)工具箱的擬合值,2020年的預(yù)測值是神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練的預(yù)測值 legend('真實值','預(yù)測值'); %右上角標(biāo)注 xlabel('預(yù)測樣本') %x軸坐標(biāo)描述 ylabel('人數(shù)(萬)') %y軸坐標(biāo)描述 set(gca, 'XTickLabels', Year); string = {'測試人口數(shù)量預(yù)測結(jié)果對比';['R^2=' num2str(R2)]}; title(string);

采集數(shù)據(jù)

2. 數(shù)據(jù)來源
????????????????C-J列我認(rèn)為是影響人口每年出生率的因素

??1949-2019的數(shù)據(jù),是我花了一天從國家統(tǒng)計局、年鑒、查閱論文或者是推算得到的數(shù)據(jù),我就不給了,收集數(shù)據(jù)是要下功夫的,比如一年國賽中的出租車問題就需要去爬取數(shù)據(jù),可以考慮爬蟲~

簡要分析

3. 分析
? ?這個例子里面,由于我建模時間比較匆忙,所以其中輸入神經(jīng)元的八個特征值,我理想化認(rèn)為都直接影響中國的每年出生人口的量綱。正常來說,應(yīng)該對這八個因素進(jìn)行邏輯回歸分析和顯著性水平檢驗,篩選掉一些顯著性水平不達(dá)標(biāo)的因素/特征值(例如就業(yè)人口等)。可以用多種模型和指標(biāo)來進(jìn)行探究。例如說AIC、BIC指標(biāo),引入激勵函數(shù),損失函數(shù)等方法。總而言之,還是很有意思的。
? ?首先對這70年的人口數(shù)據(jù)進(jìn)行分析,結(jié)合歷史背景,我們可以清晰地看到在5年-10年的小時間段內(nèi),影響人口的主要因素。例如:
1)建國初期,國內(nèi)外環(huán)境相對穩(wěn)定,中國迎來了第一波嬰兒潮;
2)1959年,1960年,1961年我國遭受三年自然災(zāi)害,圖表1中可以看到這三年出生人口驟減。1961年-1963年是中國建國后70年人口增幅最大的兩年,中國迎來第二波嬰兒潮。
3)然而在2000-2015年的十五年之間,中國每年出生人口比較平緩。直到2016年之后,人口開始呈現(xiàn)明顯的下降趨勢。

????????????????????? 圖表1.中國每年出生人口的折線圖

????通過中國國家統(tǒng)計局和快易理財網(wǎng)的數(shù)據(jù),共收集到九組數(shù)據(jù),分別是中國每年出生人口、總?cè)丝诮y(tǒng)計(萬/人)、人均GPA(按照美元算)、性別比例(按照女生等于100人計算)、人口自然增長率、城鎮(zhèn)人口和鄉(xiāng)村人口(兩者加起來等于100)、美元兌換人民幣匯率、總就業(yè)人口(萬/人)。數(shù)據(jù)的范圍從1949年不間斷統(tǒng)計直到2019年為止。
我采用了BP 神經(jīng)網(wǎng)絡(luò)模型來預(yù)測中國每年的出生人口數(shù)據(jù),表格中(詳見“人口.xlsx”)每一行,分別利用總?cè)丝凇⑷司鵊PA、性別比例、自然增長率、城鎮(zhèn)人口、鄉(xiāng)村人口、美元兌換人民幣匯率、就業(yè)人口共八列數(shù)據(jù)作為特征值,來影響中國每年出生人口的數(shù)量。
??為獲得2020年特征值中的擬合數(shù)據(jù)
??首先對八個特征值近10年-20年的數(shù)據(jù)進(jìn)行分析,得到兩種擬合的方向:
?1、初步分析呈線性的數(shù)據(jù):
?包括“人口”表中的總?cè)丝凇⑷司鵊PA、性別比例、城鎮(zhèn)人口、鄉(xiāng)村人口共5列的數(shù)據(jù)。我通過灰色模型GM(1,1)來對這五項數(shù)據(jù)進(jìn)行預(yù)測,目的是得到未知的2020年的5項人口特征值。圖表在GM(1,1)模型求解中展示
?通過以上的分析,可以得到近似地擬合得到2020年的總?cè)丝跀?shù)為140908萬人,人均GDP為11158美元,男女比例為104.58:100,城鄉(xiāng)村人口比例為61.65:38.35。之所以采用近十年來預(yù)測,是因為近十年我國在科技、軍事、文化等方面飛速發(fā)展,綜合國力和文化軟實力顯著提升,采用近十年的數(shù)據(jù)能較好地反應(yīng)出中國在這一段時間內(nèi)數(shù)據(jù)的總體趨勢。

?????????????????????圖表2.GPA

? 2、初步分析呈非線性的數(shù)據(jù):
? ?通過觀察自然增長率、美元兌換人民幣匯率和中國就業(yè)人口數(shù)據(jù),可以發(fā)現(xiàn)近10年-20年,這些數(shù)據(jù)都是上下波動的。為此,我利用matlab數(shù)據(jù)擬合的工具箱Curve Fitting進(jìn)行的擬合。

?????????????????????圖表3.自然增長率
???????????????????以上圖表我就不一一給出!!!

結(jié)論

4.得出結(jié)論
? ?matalb代碼段的第三部分,我分別采用兩種方式訓(xùn)練模型:

  • 第一種是固定訓(xùn)練樣本,采用了1949年-2010年共61/62年的訓(xùn)練樣本,然后訓(xùn)練得到的結(jié)果非常不理想。我這里的評價指標(biāo)采用了決定系數(shù)R^2以及相對誤差矩陣。

    ????????????????????? 圖表4.評價指標(biāo)

    ?????????????????????圖表5.R^2太小了

  • 第一種是隨機(jī)產(chǎn)生訓(xùn)練樣本,采用了1949年-2019年間共61/62年的訓(xùn)練樣本,然后訓(xùn)練得到的結(jié)果非常理想。但我們必須注意,神經(jīng)網(wǎng)絡(luò)雖然看起來好用,但是容易產(chǎn)生過擬合現(xiàn)象,需要進(jìn)一步分析。matlab的黑箱子也比較難解釋,所以慎用!!!

    ????????????????圖表6.2020年預(yù)測樣本
  • 當(dāng)我們要預(yù)測2020年出生人口數(shù)據(jù)的時候,要加多2020年這一列,因為要輸入八個特征值以及擬合預(yù)測結(jié)果:
    ??導(dǎo)入數(shù)據(jù)的代碼塊全部要改為:

  • x = xlsread('人口.xlsx',1,'A2:A73')'; y2 = xlsread('人口.xlsx',1,'C2:C73'); y3 = xlsread('人口.xlsx',1,'D2:D73'); y4 = xlsread('人口.xlsx',1,'E2:E73'); y5 = xlsread('人口.xlsx',1,'F2:F73'); y6 = xlsread('人口.xlsx',1,'G2:G73'); y7 = xlsread('人口.xlsx',1,'H2:H73'); y8 = xlsread('人口.xlsx',1,'I2:I73'); y9 = xlsread('人口.xlsx',1,'J2:J73'); y=[y2 y3 y4 y5 y6 y7 y8 y9];%采用8個因素來衡量 y1 = xlsread('人口.xlsx',1,'B2:B73'); %輸出的結(jié)果,人口數(shù)

    由于寫的比較快,不足之處希望可以指正,希望大家國賽、美賽取得好成績,考研保研出國都能一切順利!
    —————————————————————————————更新—————————————————————————————
    ??之前有朋友在評論或者私信我說如何預(yù)測2060年或者2070年的數(shù)據(jù),我在這里做一下解釋。
    ??在文章中我們要預(yù)測2020年的出生人口數(shù)據(jù),首先我們要假定1950-2019年收集的數(shù)據(jù)是真實的,事實上也是我們從網(wǎng)站上爬取或者從文獻(xiàn)中找到的數(shù)據(jù),八九不離十。我們將這69年的數(shù)據(jù)喂入網(wǎng)絡(luò),用matlab的黑盒訓(xùn)練后,這個bp神經(jīng)網(wǎng)絡(luò)就有了一定的能力。這是什么能力呢?就是你輸入一行八個特征值(上文中有提到,這也是我們定義的網(wǎng)絡(luò)的輸入神經(jīng)元個數(shù)),網(wǎng)絡(luò)就能給你輸出一個數(shù),這個數(shù)就是bp網(wǎng)絡(luò)預(yù)測的出生人口數(shù)。
    ??有不少人在看到這篇博文有點(diǎn)疑惑,我要預(yù)測2050年的數(shù)據(jù),是不是要將1950年到2049年的數(shù)據(jù)都進(jìn)行輸入呢,也就是將100×8100\times8100×8的矩陣輸入到網(wǎng)絡(luò)中,讓網(wǎng)絡(luò)學(xué)習(xí)。答案是否定的。這是為什么呢?因為你要獲得2021-2049年的數(shù)據(jù)(現(xiàn)在是2021年底,今年的數(shù)據(jù)應(yīng)該還沒統(tǒng)計出來),只能通過擬合值來估計。就好像上文中我將每一列的數(shù)據(jù)通過matlab工具箱預(yù)測,得到2020的八個特征值輸入數(shù)據(jù)(之前寫這篇博文的時候是2020年,還沒有2020年的數(shù)據(jù)),但這不一定準(zhǔn)確,很有可能是fake的,存在比較大的出入。我用2000-2019預(yù)測2020的八個特征值都不一定準(zhǔn)確了,更加何況預(yù)測今后30年的30×830\times830×8的數(shù)據(jù)呢?那可能是災(zāi)難性的錯誤,如果將這些特征值輸入網(wǎng)絡(luò),會導(dǎo)致網(wǎng)絡(luò)的理解能力有很大偏差,甚至是不穩(wěn)定。
    ??但毫無疑問,你要讓網(wǎng)絡(luò)輸出2050年的出生人口數(shù),你得有2050年的八個特征值數(shù)據(jù)呀(人均GPA、性別比例等)。最簡單的方法就是通過matlab工具箱預(yù)測,選擇一個合適的擬合曲線去擬合數(shù)值。雖然這個數(shù)據(jù)不一定準(zhǔn)確,但是我們的bp神經(jīng)網(wǎng)絡(luò)的理解能力是基本上準(zhǔn)確的,因為輸入的數(shù)據(jù)都是沒有問題的。到這里,你應(yīng)該明白了吧。最后一點(diǎn)我還想提一下,就是如果你要預(yù)測未來n年的數(shù)據(jù),最好不要選擇1978之前的年份數(shù)據(jù)輸入網(wǎng)絡(luò)中訓(xùn)練,因為在那一年的春天之后,我們的生活發(fā)生了很大的變化,陳舊的數(shù)據(jù)(生產(chǎn)力的差異太大)對預(yù)測未來還是有一定的影響。
    ————————————————————————————2022.6.13 更新————————————————————————————
    ??本文的神經(jīng)網(wǎng)絡(luò)模型保存后,輸入一行特征值就能預(yù)測任何一年的數(shù)據(jù),而不需要一年年去測。

    總結(jié)

    以上是生活随笔為你收集整理的基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。