人口预测模型
預測人口模型
利用灰色預測模型預測人口
應用
灰色預測模型(Gray Forecast Model)是通過少量的、不完全的信息,建立數學模型并做出預測的一種預測方法。是處理小樣本(4個就可以)預測問題的有效工具,而對于小樣本預測問題回歸和神經網絡的效果都不太理想。
灰色系統
我們稱信息完全未確定的系統為黑色系統,稱信息完全確定的系統為白色系統,灰色系統就是這介于這之間,一部分信息是已知的,另一部分信息是未知的,系統內各因素間有不確定的關系。
特點
- 用灰色數學處理不確定量,使之量化。
 - 充分利用已知信息尋求系統的運動規律。
 - 灰色系統理論能處理貧信息系統。
 
灰色生成數列
灰色系統理論認為,盡管客觀表象復雜,但總是有整體功能的,因此必然蘊含某種內在規律。關鍵在于如何選擇適當的方式去挖掘和利用它。灰色系統時通過對原始數據的整理來尋求其變化規律的,這是一種就數據尋求數據的現實規律的途徑,也就是灰色序列的生產。一切灰色序列都能通過某種生成弱化其隨機性,顯現其規律性。數據生成的常用方式有累加生成、累減生成和加權累加生成。常用的是累加生成。
 設原始數據為設原始數據為 x(0)=(x0(1),x0(2),……,x0(n))x^{(0)}=\left(x^{0}(1), x^{0}(2), \ldots \ldots, x^{0}(n)\right)x(0)=(x0(1),x0(2),……,x0(n))
1.累加生成
x1(1)=x0(1)x^{1}(1)=x^{0}(1)x1(1)=x0(1)
x1(2)=x0(1)+x0(2)x^{1}(2)=x^{0}(1)+x^{0}(2)x1(2)=x0(1)+x0(2)
x1(3)=x0(1)+x0(2)+x0(3)x^{1}(3)=x^{0}(1)+x^{0}(2)+x^{0}(3)x1(3)=x0(1)+x0(2)+x0(3)
x1(n)=x0(1)+x0(2)+……+x0(n)x^{1}(n)=x^{0}(1)+x^{0}(2)+\ldots \ldots+x^{0}(n)x1(n)=x0(1)+x0(2)+……+x0(n)
累加的數據為 x(1)=(x1(1),x1(2),……,x1(n))x^{(1)}=\left(x^{1}(1), x^{1}(2), \ldots \ldots, x^{1}(n)\right)x(1)=(x1(1),x1(2),……,x1(n))
 例如有一組數據的的折線如下
 
 此時不能看出數據有什么的規律,但經過累加生成后的結果如下
 
 看起來就是一個遞增的規律(這是20期某大壩變形位移的數據,順水流方向的形變一定都是正的)
2.加權臨值生成
z0(2)=ax0(2)+(1?a)x0(1)z^{0}(2)=a x^{0}(2)+(1-a) x^{0}(1)z0(2)=ax0(2)+(1?a)x0(1)
 z0(3)=ax0(3)+(1?a)x0(2)z^{0}(3)=a x^{0}(3)+(1-a) x^{0}(2)z0(3)=ax0(3)+(1?a)x0(2)
 z0(4)=ax0(4)+(1?a)x0(3)z^{0}(4)=a x^{0}(4)+(1-a) x^{0}(3)z0(4)=ax0(4)+(1?a)x0(3)
 …\ldots…
 z1(n)=ax0(n)+(1?a)x0(n?1)z^{1}(n)=a x^{0}(n)+(1-a) x^{0}(n-1)z1(n)=ax0(n)+(1?a)x0(n?1)
由此得到的數列稱為鄰值生成數,權 α\alphaα 也稱為生成系數。 特別地,當生成系數 α=\alpha=α= 0.50.50.5 時,則稱該數列為均值生成數,也稱為等權鄰值生成數。
灰色模型GM(1,1)
GM代表grey model(灰色模型),GM(1,1)是一階微分方程模型。
1.數據檢驗
使用 GM(1,1)\mathrm{GM}(1,1)GM(1,1) 建模需要對數據進行檢驗,首先計算數列的級比
λ(k)=x0(k?1)x0(k)\lambda(k)=\frac{x^{0}(k-1)}{x^{0}(k)}λ(k)=x0(k)x0(k?1)?, 其中 k=2,3,…,nk=2,3, \ldots, nk=2,3,…,n
如果所有的級比都落在可容覆蓋區間 X=(e?2n+1,e2n+1)X=\left(e^{\frac{-2}{n+1}}, e^{\frac{2}{n+1}}\right)X=(en+1?2?,en+12?) 內,則數列 x(0)\left.x^{(} 0\right)x(0) 可以建立
GM(1,1)\mathrm{GM}(1,1)GM(1,1) 模型進行灰色預測。否則就需要對數據做適當的變換處理,如平移等。
2.構建灰色模型
定義 x(1)x^{(1)}x(1) 的灰導數為
d(k)=x0(k)=x1(k)?x1(k?1)d(k)=x^{0}(k)=x^{1}(k)-x^{1}(k-1)d(k)=x0(k)=x1(k)?x1(k?1)
令 z1(k)z^{1}(k)z1(k) 為數列 x1x^{1}x1 的鄰值生成數列,即
z1(k)=ax1(k)+(1?a)x1(k?1)z^{1}(k)=a x^{1}(k)+(1-a) x^{1}(k-1)z1(k)=ax1(k)+(1?a)x1(k?1)
于是定義 GM(1,1)G M(1,1)GM(1,1) 的灰微分方程模型為
d(k)+az1(k)=bd(k)+a z^{1}(k)=bd(k)+az1(k)=b
其中, aaa 稱為發展系數, z1(k)z^{1}(k)z1(k) 稱為白化背景值, bbb 稱為灰作用量。接下來我們得到如 下方程組
x0(2)+az1(2)=bx^{0}(2)+a z^{1}(2)=bx0(2)+az1(2)=b
x0(3)+az1(3)=bx^{0}(3)+a z^{1}(3)=bx0(3)+az1(3)=b
x0(n)+az1(n)=bx^{0}(n)+a z^{1}(n)=bx0(n)+az1(n)=b
按照矩陣的方法列出
$
 u=\left[\begin{array}{l}
 a \
 b
 \end{array}\right], Y=\left[\begin{array}{c}
 x^{0}(2) \
 x^{0}(3) \
 \ldots \
 x^{0}(n)
 \end{array}\right], B=\left[\begin{array}{cc}
 -z^{1}(2) & 1 \
 -z^{1}(3) & 1 \
 \cdots & \
 -z^{1}(n) & 1
 \end{array}\right]
 $
則 GM(1,1)\mathrm{GM}(1,1)GM(1,1) 就可以表示為 Y=BuY=B uY=Bu ,接下來就是求 aaa 和 bbb 的值,可以使用線性回歸或者 (BTB)?1BTY\left(B^{T} B\right)^{-1} B^{T} Y(BTB)?1BTY (正規方程) 等按眧最小二乘的原埋來求出 aaa 和 bbb 的值 (這里在列方程時 aaa 可以隨便寫一個 數,比如 12\frac{1}{2}21? ,這樣 aaa 和 (1?a)(1-a)(1?a) 就一樣的可以提出來方便寫) 。
3.預測
相應的白化模型為
dx1(t)dt+ax1(t)=b\frac{d x^{1}(t)}{d t}+a x^{1}(t)=bdtdx1(t)?+ax1(t)=b
由此得到 x1(t)x^{1}(t)x1(t) 的解為
x1(t)=(x0(1)?ba)e?a(t?1)+bax^{1}(t)=\left(x^{0}(1)-\frac{b}{a}\right) e^{-a(t-1)}+\frac{b}{a}x1(t)=(x0(1)?ab?)e?a(t?1)+ab?
令 t+1=tt+1=tt+1=t 有
x1(t+1)=(x0(1)?ba)e?a+bax^{1}(t+1)=\left(x^{0}(1)-\frac{b}{a}\right) e^{-a}+\frac{b}{a}x1(t+1)=(x0(1)?ab?)e?a+ab?, 其中 k=1,2,3…,n?1k=1,2,3 \ldots, n-1k=1,2,3…,n?1
這就是我們的預測值。
4.檢驗
灰色模型的精度檢驗一般有三種方法灰色模型的精度檢驗一般有三種方法,相對誤差大小檢驗法,關聯度檢驗法和后驗差檢驗法。常用的為后驗差檢驗法。
將預測的 x^1\hat{x}^{1}x^1 使用累減生成得到
x^0\hat{x}^{0}x^0 x^0(k)=x^1(k)?x^1(k?1)\hat{x}^{0}(k)=\hat{x}^{1}(k)-\hat{x}^{1}(k-1)x^0(k)=x^1(k)?x^1(k?1), 其中 k=2,3,…,nk=2,3, \ldots, nk=2,3,…,n
計算殘差
 e(k)=x0(k)?x^0(k)e(k)=x^{0}(k)-\hat{x}^{0}(k)e(k)=x0(k)?x^0(k), 其中 k=1,2,…,nk=1,2, \ldots, nk=1,2,…,n
計算原始序列 x0x^{0}x0 的方差 S1S_{1}S1? 和殘差 eee 的方差 S2S_{2}S2?
 S1=1n∑k=1n(x0(k)?xˉ)2S_{1}=\frac{1}{n} \sum_{k=1}^{n}\left(x^{0}(k)-\bar{x}\right)^{2}S1?=n1?∑k=1n?(x0(k)?xˉ)2 S2=1n∑k=1n(e(k)?eˉ)2S_{2}=\frac{1}{n} \sum_{k=1}^{n}(e(k)-\bar{e})^{2}S2?=n1?∑k=1n?(e(k)?eˉ)2
計算后驗差比
 C=S2S1C=\frac{S_{2}}{S_{1}}C=S1?S2??
查表觀察效果
| 1 級(好) | C<=0.35 | 
| 2 級(合格) | C<=0.5&c>0.35 | 
| 3 級(勉強) | C<=0.65&c>0.5 | 
| 4 級(不合格) | C>0.65 | 
灰色預測模型預測人口
1.輸入數據
從國家統計局獲取十年的人口數據
| 127627 | 2011 | 
| 128453 | 2012 | 
| 129227 | 2013 | 
| 129988 | 2014 | 
| 130756 | 2015 | 
| 131448 | 2016 | 
| 132129 | 2017 | 
| 132802 | 2018 | 
| 133450 | 2019 | 
| 134091 | 2020 | 
采用灰色預測模型預估的后十年的人口數據
| 127627 | 2001 | 127627 | 0.000% | 
| 128453 | 2002 | 128575.416 | 0.095% | 
| 129227 | 2003 | 129265.6577 | 0.030% | 
| 129988 | 2004 | 129959.6049 | 0.022% | 
| 130756 | 2005 | 130657.2774 | 0.076% | 
| 131448 | 2006 | 131358.6954 | 0.068% | 
| 132129 | 2007 | 132063.8788 | 0.049% | 
| 132802 | 2008 | 132772.8479 | 0.022% | 
| 133450 | 2009 | 133485.623 | 0.027% | 
| 134091 | 2010 | 134202.2245 | 0.083% | 
| 134916 | 2011 | 134922.6731 | 0.005% | 
| 135922 | 2012 | 135646.9893 | 0.202% | 
| 136726 | 2013 | 136375.1939 | 0.257% | 
| 137646 | 2014 | 137107.3077 | 0.391% | 
| 138326 | 2015 | 137843.3519 | 0.349% | 
| 139232 | 2016 | 138583.3474 | 0.466% | 
| 140011 | 2017 | 139327.3155 | 0.488% | 
| 140541 | 2018 | 140075.2774 | 0.331% | 
| 141008 | 2019 | 140827.2548 | 0.128% | 
| 141212 | 2020 | 141583.269 | 0.263% | 
誤差率均在1%以下,效果很好。
以2011-2020年數據預測未來十年的人口數據
| 2021 | 142440.9 | 
| 2022 | 143150.2 | 
| 2023 | 143863.1 | 
| 2024 | 144579.5 | 
| 2025 | 145299.5 | 
| 2026 | 146023 | 
| 2027 | 146750.2 | 
| 2028 | 147481 | 
| 2029 | 148215.5 | 
| 2030 | 148953.6 | 
近似為一條直線,但根據國家統計局預測,我國人口將在10年內迎來拐點。
故更換預測模型。
按自然增長率預測
自然增長率數據
| 2011 | 6.13 | 
| 2012 | 7.43 | 
| 2013 | 5.9 | 
| 2014 | 6.71 | 
| 2015 | 4.93 | 
| 2016 | 6.53 | 
| 2017 | 5.58 | 
| 2018 | 3.78 | 
| 2019 | 3.32 | 
| 2020 | 1.45 | 
繪制自然增長率散點圖
散點圖沒有呈現適合灰度模型的性質(指數型),且波動較大,嘗試運用灰度模型,部分輸出為(舍去了預測數據)
該數據未通過檢驗 a=[0.10967811] b=[8.69394742]2級,效果合格數據未經過檢驗,故不采用灰度模型預測自然生產率。
運用SPSS對自然增長率進行曲線估算分析
運用曲線估算分析,分析哪種模型適合對人口進行預測。
曲線估算分析結果如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kSJ9iqM6-1639318859800)(https://s2.loli.net/2021/12/12/YcnwZG7IEJ1OzVd.png)]
其對數、二次、三次、復合、冪、指數函數的擬合顯著性都低于0.05,均可采用,且二次函數最可信。
此處選擇二次函數,所得未來5年的自然增長率如下:
| 2021 | 0.202 | 
| 2022 | -1.462 | 
| 2023 | -3.318 | 
| 2024 | -5.366 | 
| 2025 | -7.606 | 
根據自然增長率預估未來5年人口
| 2021 | 141240.5 | 
| 2022 | 141034 | 
| 2023 | 140566.1 | 
| 2024 | 139811.8 | 
| 2025 | 138748.4 | 
人口轉折點在2022年。
灰色預測模型python代碼
# 灰色模型預測import numpy as np import pandas as pd import matplotlib.pyplot as pltdir = 'C:\\Users\\shuai\\Desktop\\工程統計學\\討論課'data = pd.read_csv(dir+'\\test.csv') data = np.array(data['pdata']) lens = len(data) # 數據量# 數據檢驗 ## 計算級比 lambds = [] for i in range(1, lens):lambds.append(data[i-1]/data[i]) ## 計算區間 X_min = np.e**(-2/(lens+1)) X_max = np.e**(2/(lens+1)) ## 檢驗 is_ok = True for lambd in lambds:if (lambd < X_min or lambd > X_max):is_ok = False if (is_ok == False):print('該數據未通過檢驗') else:print('該數據通過檢驗')# 構建灰色模型GM(1,1) ## 累加數列 data_1 = [] data_1.append(data[0]) for i in range(1, lens):data_1.append(data_1[i-1]+data[i]) ## 灰導數及臨值生成數列 ds = [] zs = [] for i in range(1, lens):ds.append(data[i])zs.append(-1/2*(data_1[i-1]+data_1[i])) ## 求a、b B = np.array(zs).reshape(lens-1,1) one = np.ones(lens-1) B = np.c_[B, one] # 加上一列1 Y = np.array(ds).reshape(lens-1,1) a, b = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) print('a='+str(a)) print('b='+str(b))# 預測 def func(k):c = b/areturn (data[0]-c)*(np.e**(-a*k))+c data_1_hat = [] # 累加預測值 data_0_hat = [] # 原始預測值 data_1_hat.append(func(0)) data_0_hat.append(data_1_hat[0]) for i in range(1, lens+10): # 多預測10次data_1_hat.append(func(i))data_0_hat.append(data_1_hat[i]-data_1_hat[i-1]) print('預測值為:') for i in data_0_hat:print(i)# 模型檢驗 ## 預測結果方差 data_h = np.array(data_0_hat[0:10]).T sum_h = data_h.sum() mean_h = sum_h/lens S1 = np.sum((data_h-mean_h)**2)/lens ## 殘差方差 e = data - data_h sum_e = e.sum() mean_e = sum_e/lens S2 = np.sum((e-mean_e)**2)/lens ## 后驗差比 C = S2/S1 ## 結果 if (C <= 0.35):print('1級,效果好') elif (C <= 0.5 and C >= 0.35):print('2級,效果合格') elif (C <= 0.65 and C >= 0.5):print('3級,效果勉強') else:print('4級,效果不合格')# 畫圖 plt.figure(figsize=(9, 4), dpi=100) x1 = np.linspace(1, 10, 10) x2 = np.linspace(1, 20, 20) plt.subplot(121) plt.title('x^0') plt.plot(x2, data_0_hat, 'r--', marker='*') plt.scatter(x1, data, marker='^') plt.subplot(122) plt.title('x^1') plt.plot(x2, data_1_hat, 'r--', marker='*') plt.scatter(x1, data_1, marker='^') plt.show()輸出結果如下
該數據通過檢驗 a=[-0.00535402] b=[127548.20761512] 預測值為: [127627.] [128575.41598519] [129265.6576876] [129959.60486981] [130657.27742425] [131358.69535014] [132063.87875406] [132772.84785051] [133485.62296254] [134202.22452229] [134922.67307159] [135646.98926251] [136375.19385806] [137107.30773265] [137843.35187279] [138583.34737763] [139327.31545959] [140075.277445] [140827.25477463] [141583.26900437] 1級,效果好總結
                            
                        - 上一篇: 少儿计算机基础知识,儿童计算机基本操作
 - 下一篇: 富文本编辑器在Java中使用