:Logistic擬合與Leslie矩陣的MATLAB實現(xiàn))
簡介一份面向數學建模競賽參與者與人口統(tǒng)計研究者的中文技術文檔主題是中國人口增長預測建模。文檔系統(tǒng)介紹了兩種經典模型Logistic人口阻滯增長模型與按年齡分布的Leslie模型并運用MATLAB軟件進行數據處理與模型求解。其中Logistic模型利用1954年至2005年多組總人口數據對比擬合效果得出1980-2005年數據可決系數達0.9987并預測2010年、2020年、2033年總人口分別約13.55億、14.18億、14.70億Leslie模型則按年齡結構構建矩陣預測出人口峰值約14.985億出現(xiàn)在2023年前后并分析了老齡化與人口撫養(yǎng)比趨勢。壓縮包內僅含1個Word文檔大小988KB內容包含問題重述、模型假設、符號說明、模型建立與求解、殘差分析與改進建議等完整章節(jié)。目前已有5154人學習瀏覽既有理論推導又有數據演示適合作為建模論文寫作、課程設計或備賽研讀的參考。1. 人口預測模型的兩種實現(xiàn)從Logistic擬合到Leslie矩陣人口增長預測是數學建模里繞不開的經典題型也是很多量化分析課程的實戰(zhàn)項目。這套《Leslie人口增長模型》同時覆蓋了Logistic人口阻滯增長模型和按年齡分布的Leslie矩陣模型預測時間跨度從2001年到2050年輸出指標包括總人口、勞動年齡人口、老年人口占比、人口撫養(yǎng)比和育齡婦女人數。和網上那些只給一個公式的Demo不同這份資料里有完整的建模思路、數據表、可決系數、殘差分析和靈敏度分析適合正在備賽的學生也適合需要用MATLAB做時序預測的從業(yè)者。模型I用三組不同起始年份的數據擬合模型II從生育率修正到Leslie矩陣構造全流程走通我能說清楚每一步在算什么、參數卡在哪、結果為什么和專家預測有偏差。2. 阻滯增長模型的擬合套路三組數據對比與參數標定2.1 Logistic方程的核心邏輯人口增長不能永遠按指數走自然資源和環(huán)境容量會給增長率踩剎車。Logistic模型的做法是把人口增長率寫成人口的減函數最常見的是線性遞減假設。設人口數量為x(t)最大容量為x_m方程可以寫成dx/dt r * x * (1 - x / x_m)這個方程的解是x(t) x_m / (1 (x_m / x_0 - 1) * exp(-r * t))這里x_0是初始年份的人口數r是內稟增長率x_m是環(huán)境容納量。關鍵在于這個模型只需要三個參數就能描述一條S形增長曲線但參數對初始數據極其敏感。原題里先用了1954年到2005年的全量數據擬合可決系數雖然看著不錯殘差絕對值之和卻高達57.9992而且殘差分布根本不服從正態(tài)分布——1959年到1961年那段特殊時期的數據把曲線帶偏了。我一般會把數據分段嘗試找出隨機誤差服從正態(tài)分布的那段區(qū)間擬合結果才可信。2.2 三組數據擬合的MATLAB實現(xiàn)用nlinfit做非線性最小二乘擬合關鍵是給好初始參數。原項目用solve解方程粗估了x_m和r的初值這一步很實用能避免nlinfit陷入局部最優(yōu)。% 令1980年為初始年份t0對應1980年 t 0:25; % 1980年到2005年全國總人口數據單位千萬 x [98.705 100.1 101.654 103.008 104.357 105.851 107.5 109.3 ... 111.026 112.704 114.333 115.823 117.171 118.517 119.85 ... 121.121 122.389 123.626 124.761 125.786 126.743 127.627 ... 128.453 129.227 129.988 130.756]; % 用前兩個點粗估初值c是容納量x_m, d是增長率r [c, d] solve(c/(1(c/98.705-1)*exp(-5*d))105.851, ... c/(1(c/98.705-1)*exp(-15*d))117.171, c, d); % 初值帶入nlinfit b0 [241.9598, 0.02985]; fun inline(b(1)./(1(b(1)/98.705-1).*exp(-b(2).*t)), b, t); [b1, r1, j1] nlinfit(t, x, fun, b0); % 用擬合參數寫預測方程 y b1(1) ./ (1 (b1(1)/98.705 - 1) .* exp(-b1(2) .* t)); % 可決系數 R^2 R2 1 - sum(r1.^2) / sum((x - mean(x)).^2); fprintf(可決系數 R^2 %.4f\n, R2); fprintf(殘差絕對值之和 %.4f\n, sum(abs(r1)));這段代碼的要點有兩處。一是初值b0的獲取方式先用solve代入兩個年份的人口數解出近似參數這是原項目里很聰明的做法直接拿全量數據跑nlinfit容易被初始值帶偏。二是可決系數R2的計算公式用殘差平方和除以總平方和數值越接近1說明擬合越好。用1980年到2005年數據擬合R2達到0.9987殘差絕對值之和只有10.1699明顯優(yōu)于前兩組。2.3 用擬合曲線做外推預測擬合完成之后預測未來某一年的人口就是純數學代入了。需要先把年份轉換成相對t值再代入擬合好的方程。% 預測2010年、2020年、2033年人口1980年為t0 t_predict [30, 40, 53]; % 對應2010、2020、2033 x_predict b1(1) ./ (1 (b1(1)/98.705 - 1) .* exp(-b1(2) .* t_predict)); disp(預測結果單位千萬); disp(x_predict);算出來2010年13.55357億、2020年14.18440億、2033年14.70172億這和附件1里專家預測的13.6億、14.5億、峰值15億左右非常接近。這套結果直接拿去和官方數據做對比表就能在報告里形成論據閉環(huán)。2.4 三組擬合的殘差特征對比三組數據擬合后的表現(xiàn)差異很大。1954年起步的全量擬合殘差絕對值之和57.9992圖形上殘差不在零軸兩側對稱分布那段歷史波動直接破壞了模型假設。1963年起步的擬合殘差絕對值之和27.8046分布接近對稱但1970年代的人口政策干預還是留下了一些痕跡。1980年起步的擬合最干凈殘差絕對值之和10.1699圖形基本關于坐標軸對稱說明這段時間的隨機誤差確實服從正態(tài)分布。所以說Logistic擬合不是數據越多越好。我一般會觀察殘差的分布形態(tài)如果殘差絕對值之和特別大而且序列有明顯系統(tǒng)偏差就該換時間段重跑。3. Leslie矩陣的構建按年齡分組的核心算法3.1 為什么需要按年齡分組Logistic模型的輸出只有一個總數看不出年齡結構。但人口問題的關鍵恰恰在結構20歲女性的一胎概率和40歲女性完全不同65歲以上老人的死亡率也遠高于中年人。原題用2001年數據構造Leslie矩陣把人口按1歲間隔分成年齡組把時間也按同樣單位離散化這樣就能遞歸預測未來任何一年的分年齡人口分布。核心遞推公式是x(k1) L * x(k)其中x(k)是年齡分布向量L是Leslie矩陣。L的第一行是各年齡組的生育率生女孩率次對角線是存活率其余位置是0。3.2 生育率計算與修正過程這是整個模型里最容易踩坑的環(huán)節(jié)。附件2給出的原始育齡婦女生育率算出來的總和生育率只有1.42和專家給出的更替水平1.8差了很遠直接導致人口峰值預測年份提前了10年。原項目做了一個關鍵修正先按附件2算出各個年齡段的生育率結構再用專家給出的1.8作為總和生育率目標值把整體生育率放大修正。修正的邏輯是這樣的。先算城市、鎮(zhèn)、鄉(xiāng)分年齡段的生育率結合男女出生性別比把總生育數折算成女嬰數得到每個女性平均生育女兒數。然后算總和生育率發(fā)現(xiàn)偏低就把每個年齡段的生育率按比例調整讓總和生育率逼近1.8。這個修正思路在真實項目中非常常用——抽樣數據往往有偏差需要用權威目標值校準。3.3 Leslie矩陣構造的MATLAB實現(xiàn)% 構造Leslie矩陣 % 以2001年為初始年份一歲一組0到90歲共91組 n 91; L zeros(n, n); % 第一行填入各年齡段的生育率 b(i)已折算為女嬰出生率 % b數組為修正后的生育率15-49歲有值其他為0 L(1, :) b; % 次對角線填入存活率 s(i) 1 - d(i)d(i)為死亡率 for i 1:n-1 L(i1, i) s(i); end % 初始年齡分布向量2001年各年齡女性人口數 x0 w; % w為91維列向量單位人 % 遞歸預測2002年到2050年 years 2002:2050; N length(years); X zeros(n, N); X(:, 1) L * x0; for k 2:N X(:, k) L * X(:, k-1); end % 總人口 女性各年齡組加總 / 女性占比 total_population sum(X) ./ female_ratio;這套代碼的核心價值在于X矩陣每一列就是某一年完整的91維年齡分布可以隨時取任意年齡段做匯總——比如15到64歲是勞動年齡人口65歲以上是老年人口。做人口撫養(yǎng)比、老齡化率等衍生指標都從這個矩陣出發(fā)計算不需要重新跑模型。3.4 矩陣可逆性與長期預測Leslie矩陣的特征值決定了長期預測的收斂形態(tài)。主特征值大于1人口持續(xù)增長等于1人口保持穩(wěn)定小于1人口走向衰減。在k1.8修正后的矩陣里主特征值略小于1所以2023年達到峰值后總人口緩慢下降這個趨勢和官方預測的高峰期基本吻合。但長期預測有個問題生育率和死亡率被假設為不隨時間變化這在20年以上的時間跨度里不太現(xiàn)實。原項目的靈敏度分析用k1.6、1.8、2.0、2.2四組不同生育率分別跑預測就是為了觀察參數波動對結果的影響。我一般會把這種批量掃描做成循環(huán)腳本一次性輸出多組預測曲線。4. 從人口矩陣到決策指標老齡化、撫養(yǎng)比和育齡婦女預測4.1 勞動年齡人口與總人口的雙線走勢用Leslie模型預測的分年齡數據可以直接聚合出勞動年齡人口。按15到64歲定義勞動年齡人口模型顯示2010年達到10.4421億2013年達到高峰10.4852億之后轉入下降通道。這個結論的言外之意是短期內勞動力數量不缺缺的是結構性調整——比如高齡勞動力占比上升新增勞動力供給下降的趨勢已經在路上。4.2 老齡化和撫養(yǎng)比的計算口徑老齡化指標有兩種統(tǒng)計口徑60歲以上和65歲以上判斷標準不同原始資料里兩種都做了。2001年60歲以上老年人口1.5538億占總人口11.5693%2020年預計達到2.907億比重19.443%本世紀40年代中后期形成高峰平臺60歲以上達4.45億人、比重33.277%65歲以上達3.51億人、比重25.53%。人口撫養(yǎng)比的計算公式是撫養(yǎng)比 (0到14歲人口 65歲及以上人口) / 15到64歲人口用MATLAB對每年的年齡分布向量分段求和就能得到一條隨時間變化的撫養(yǎng)比曲線。結果顯示撫養(yǎng)比呈持續(xù)上升趨勢主要驅動力是老齡人口占比擴大兒童撫養(yǎng)比相對平穩(wěn)。4.3 預測合成的對比表指標2010年2020年峰值年份峰值數值總人口億14.260914.9513202314.985勞動年齡人口億10.4421持續(xù)下降201310.485260老年人口億約2.02.9072040s4.45總撫養(yǎng)比約0.38約0.45持續(xù)上升超過0.55這張表可以直接放進論文的結果分析部分把模型輸出和官方報告預測放在一起做對比能節(jié)省大量整理數據的時間。5. 避坑指南數據修正、參數初值與模型邊界5.1 總和生育率偏低導致峰值提前現(xiàn)象用附件2原始數據算出的總和生育率只有1.42Leslie模型預測的人口峰值年份比官方報告提前了10年。原因抽樣數據里城市、鎮(zhèn)、鄉(xiāng)的生育率加權后明顯偏低和專家評估的更替水平1.8不一致。解決用專家給定的總和生育率1.8做目標值對分年齡生育率按比例修正重新構造Leslie矩陣。峰值年份從提前10年修正到基本與官方預測吻合。5.2 初值估算不到位導致擬合結果飄現(xiàn)象nlinfit直接跑全量數據經常收斂到奇怪的參數可決系數甚至出現(xiàn)負值。原因非線性最小二乘對初值敏感全局最優(yōu)解可能被局部最優(yōu)掩蓋。解決先用solve代入兩個已知年份的數據解出x_m和r的近似值把解出來的參數作為nlinfit的初值。我一般會先畫散點圖觀察數據形態(tài)再決定初值范圍。5.3 時間跨度過長導致預測失真現(xiàn)象1954年到2005年的全量擬合殘差絕對值之和57.9992圖形上殘差明顯不對稱。原因包含了特殊歷史時期的大幅波動線性假設和正態(tài)分布假設被破壞。解決分段時間窗口做擬合選擇1980到2005年這種政策穩(wěn)定、隨機誤差服從正態(tài)分布的區(qū)間。5.4 死亡率恒定的假設不適用于超長期現(xiàn)象預測到2050年以后老年人數和總人口比出現(xiàn)明顯偏差。原因模型假設各年齡組死亡率不隨時間變化實際醫(yī)療水平提高會降低死亡率。解決把模型定位為中短期預測工具或者引入時變死亡率參數做擴展參考女性占比的變化動態(tài)修正Leslie矩陣中的存活率。5.5 數據口徑不一致導致計算混亂現(xiàn)象城市、鎮(zhèn)、鄉(xiāng)的抽樣總人口比例不同各年齡段女性占比直接相加會重復計算。原因沒有先按抽樣比例換算成實際總人口就直接混合使用了不同口徑的比率數據。解決先用抽樣數據算出市、鎮(zhèn)、鄉(xiāng)人口占全國總人口的比率再分別乘以2001年全國總人口數得到各區(qū)域實際人口最后加權計算年齡分布。6. 參數掃描技巧用生育率k值標定模型邊界模型做完之后不能只給一組預測結果就收工。原項目的靈敏度分析用k1.6、1.8、2.0、2.2四組總和生育率分別掃描總人口和老齡化趨勢這個方法值得完全照搬。具體做法是寫一個外層循環(huán)每次用不同的k值替換Leslie矩陣第一行的生育率向量其余參數保持不變重新跑完整的2001到2050年預測最后把所有k值對應的總人口曲線和老年占比曲線畫在同一張圖上。從圖11可以看出k1.6時人口達到峰值后快速負增長k2.2時人口持續(xù)膨脹且下降緩慢k1.8時增長最穩(wěn)定。從圖12可以看到k越小老齡化速度越快k越大年齡結構越穩(wěn)定。這個掃描的意義在于標定模型邊界——政策制定者能直觀看到生育率每變化0.2總人口和老齡化會發(fā)生多大變化。把這段掃描代碼附在論文附錄里能顯著提升模型的可信度和分析深度。另外我給一個建議每次跑完一組k值預測把年齡分布矩陣X保存下來后續(xù)算撫養(yǎng)比、育齡婦女人數這些衍生指標時不需要重跑模型直接對X做聚合就行。我就是因為剛開始每次都從頭跑整套流程改了參數就要重新整理數據浪費了大量時間。從那以后我每次建人口預測模型都會把年齡分布矩陣緩存下來方便隨時取數。希望這些經驗能幫你把這個模型跑通少走彎路。本文還有配套的精品資源點擊獲取