QQ登录

只需要一步,快速开始

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

使用 Logistic 模型拟合人口数据

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:54 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码执行了如下操作:2 q& P/ E' `. N+ @! J5 P( `7 J1 v

5 \) p" X1 A. E' |1.导入模块:
. T& h* f4 V( N) W. a; U  M( G- D& `' T! I
   import numpy as np$ ?6 P) t$ F! u4 t0 B
   import pandas as pd0 g! u6 ^7 e% T, D0 |3 o3 k
   from scipy.optimize import curve_fit6 E! p/ k4 Y+ U) o6 \

! m" j, k# O$ Q# ~
7 d: T8 s- g" T- W4 ?2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。9 \1 s8 G) m/ E1 Z, M
" j* k# C) {! N( k

4 b* z9 D$ s3 |  @3.准备数据:
+ Z& E- M* c# Q7 {. D( M5 ]) D# ^, D7 q& G. ^& \$ t% S
   df = pd.DataFrame({' n7 e5 o2 _4 P. `/ ?0 y, W7 N
       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
: R) F, a( N3 u       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],
3 q. I4 l  }# Z" t   })
% t3 D6 B8 k5 h$ X* B; E   x0 = float(df['population'][0])
' h5 W: O$ i: b: M% K" h   t0 = float(df['year'][0])
& {3 V) t; V) \- {) T, `& v7 f
) ^4 e# G4 |- Q5 E, k* u# n6 E+ Y" q6 Z  ]+ U0 l" R
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。( H; B/ I0 {0 z/ \$ F8 V. K
5.提取了初始年份和初始人口数。' s' P. y+ q0 V0 n6 U

5 C, ?! r2 ^4 U' S$ T4 g+ E" f! S* g
' c, i% }# U9 B1 D6.定义 Logistic 模型函数:! l9 o! b) f, J" Z& o& @) ?
0 Y, F2 G2 L2 ~' F
   def x(t, r, xm):
( w. S! M5 k# J! m6 s       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))- L7 d9 t# z, V* A, G# X, P' L
% h7 R2 y! a+ B: @& Z) K
- g: q# q/ y9 H1 X* U" o7 B
7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
! ]; J4 A  g- Z1 ?4 c( P$ e( h2 X% q. Q

: B# r  P1 K7 \  `6 ~* s8.拟合参数:/ v1 n+ Q$ n* A- [! o
) t4 F# |2 \$ C# _5 S
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))9 f$ ^/ G% \. n! l
   r, xm = popt[0], popt[1]& V0 ?* s: H2 b( e( A

1 w) i3 H5 ^* n- r9 q
3 _, X, s8 I& v2 R2 v, x9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
4 {( `( A+ G: A+ g6 U' ?/ M  z$ s
0 Z- M0 N4 i' q. L
10.预测 1900 年人口:8 ]+ c) y) g  \/ y2 P

# B/ M; {' z. w+ W5 _9 z   print('population in 1900 =', x(1900, r, xm))
) K& y, X- w- T( |: H: @* Z+ V7 l! U$ ~) ]3 V

2 r# I* A4 ?7 W& j9 T11.使用拟合的参数预测了 1900 年的人口数。
! L& F5 U0 `9 e' I7 n' v+ k' S5 h
) O! B. h2 C# Y9 o- R5 N* A; Q0 s
12.绘制预测曲线:* _; i* y( i6 _, J

4 S. ^, Q6 ^& a. A8 T3 R   year = np.linspace(1790, 2000, 21)
' F! @9 z2 r0 K! Z$ F   population = [x(each, r, xm) for each in year]
/ r5 x# b- s) Q   plt.scatter(df['year'], df['population'], label='actual')
" z& S2 e8 i% b8 q0 {   plt.plot(year, population, label='predict', color='coral')
% E! Y4 x( N$ S4 }   plt.legend()4 Z& V8 {) ^1 D  u% M

! S0 s/ S- R$ E: S9 q
' q/ t4 ^* W7 P; c& z+ I13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
# }6 j2 N1 E+ ^1 y  i  \& o. l14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。4 G4 o& @* u; f+ b

0 ~  x" U' ^7 @/ q0 h这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
( ?" e. Z1 K  @- x; k
) x" E: Z# e/ D0 |  q% f! o
3 A$ O! T7 h/ @4 X( T

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-4-13 05:30 , Processed in 0.427445 second(s), 55 queries .

回顶部