QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2163|回复: 0
打印 上一主题 下一主题

使用 Logistic 模型拟合人口数据

[复制链接]
字体大小: 正常 放大

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:54 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码执行了如下操作:$ K; ~' R; O# g4 E+ ?* F) X3 [* S: K4 \
9 q; Z. }* G8 @
1.导入模块:
4 B& E* K1 G. |, \) j8 q+ Y8 b5 L- q0 ?- l& P/ U- _/ T' y
   import numpy as np
! M7 }* L: z6 L3 W   import pandas as pd
8 x  j& F1 @4 i7 K. S  A   from scipy.optimize import curve_fit$ ?* ?9 p& {# V9 g7 x& E( V6 M
0 Q& c' ?0 e8 D

- F5 n" E" c* x  Z; k% G2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
/ y( @# N- [  d/ Z/ V
2 S- L$ s+ B# x* K
0 @, i% U8 Y( |3.准备数据:! l* g3 S8 _) z- K9 y* J

- k7 n3 f  E3 I$ ]   df = pd.DataFrame({( H: o" I0 [8 `. k2 X6 W; F
       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
7 |) a9 W# y, u       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],! _- F) `4 q& u1 ]+ ]
   })
2 o- N2 {* V0 ?- \/ S& G4 C8 E   x0 = float(df['population'][0])
& C% a* h$ v% M   t0 = float(df['year'][0])
* ]- l% N9 Z8 x: w2 X+ V  T' d/ F. S* _+ I
) D: @0 E* M0 {+ L; A$ d, M
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
" D- D( c0 Y0 v1 Q* v- P5.提取了初始年份和初始人口数。
3 Z8 W- x6 e: [' J. i5 g  S$ @$ l# O. q/ L5 \- V6 P, ~

. ~6 q1 d% @% f6.定义 Logistic 模型函数:: J1 P+ u$ x5 A1 @3 {

/ J: @" c' o3 a1 v& \   def x(t, r, xm):
' C1 |+ K  h' z: H. `. M1 \       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
* n$ H/ _9 C( P& ]: d* D+ s  l$ H* N/ W( o; s
4 V* V, }. c2 I
7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。( d! M7 X9 k$ l( |. R

) g* V! h& g# D. }- m" L; o, C  K% u; h$ L4 R, e
8.拟合参数:4 `4 y+ K7 y4 F: v3 d: N) O

' k9 G7 h* l+ L   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))) t* Q9 H; P7 O7 Z9 p
   r, xm = popt[0], popt[1]
! l. L8 a7 n) N. H' m0 X0 o8 i
/ V$ b* z' v: l( j, [! t% g
. |9 Y; Y2 O- A" r$ b9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。6 t5 }# ~, R5 y( F& x" r6 h- _  O

9 }% j8 l/ W; r
2 a% _& _5 M8 x9 {/ {" t: [10.预测 1900 年人口:6 U; \. @- ^$ H- X) n- k, R( S
6 I4 P4 j6 @; k
   print('population in 1900 =', x(1900, r, xm))$ g) q7 t  C4 B/ n( f
0 t# j9 X! `+ s2 |) I! e  i" X
7 r; e! r# g0 E
11.使用拟合的参数预测了 1900 年的人口数。
/ g( j  A, ~% I' A+ U$ k* t# o! B7 A4 [+ ]
' _% W! N! x9 `3 A  h7 `' d
12.绘制预测曲线:
/ B, a' w" s4 u2 m+ r* r* E2 @9 K  }& J) r
   year = np.linspace(1790, 2000, 21)
8 Z. P  O2 G2 N! T$ `, x9 D   population = [x(each, r, xm) for each in year]
, m. ]/ H, |9 M0 \. x   plt.scatter(df['year'], df['population'], label='actual')
. T/ T! z* y' o) N9 L: L   plt.plot(year, population, label='predict', color='coral')  a3 Y% L% g: \  m% M9 ^1 S  y7 R
   plt.legend(); J, T0 a+ N9 t/ v! V9 U" A2 d

. a5 i2 e# _' [$ z# C9 N
- P9 V8 U6 s" Y13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。4 r9 k4 K. o$ b' G
14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。
0 l. G1 F; H# f% w% V3 c
( c0 z5 |0 [1 w0 h* O( ~这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。! ^1 v8 B4 ~1 h
  c- P1 g/ y7 Q% v* f

9 E; c4 k! E- D. |

13.logistic_model.py

1.13 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-5-26 01:09 , Processed in 0.299143 second(s), 55 queries .

回顶部